第9章 K8s进阶篇-持久化存储入门

9.1 k8s存储Volumes介绍

Container(容器)中的磁盘文件是短暂的,当容器崩溃时,kubelet会重新启动容器,但最初的文件将丢失,Container会以最干净的状态启动。另外,当一个Pod运行多个Container时,各个容器可能需要共享一些文件。Kubernetes Volume可以解决这两个问题。eg:如一个pod里,容器A和容器B需要共享数据;不同pod间共享数据;
一些需要持久化数据的程序才会用到Volumes,或者一些需要共享数据的容器需要volumes。

不同pod间共享数据也可以通过volumes解决,比如我们nfs,jfs,ceph,公有云的nas等;

日志收集的需求:需要在应用程序的容器里面加一个sidecar,这个容器是一个收集日志的容器,比如filebeat,它通过volumes共享应用程序的日志文件目录。就是同一个pod下不同容器共享数据;
Volumes:官方文档https://kubernetes.io/docs/concepts/storage/volumes/

9.2 Volumes EmptyDir实现数据共享

 emptyDir是一个空目录,不需要提前创建相关目录,他的声明周期和Pod是完全一致的,Pod被删除时,emptyDir也会被删除。emptyDir主要是用于同一个Pod内不同的容器之间共享工作过程中产生的文件。


比较常用的volumes的使用emptydir,hostpath,NFS(configmap和secret 之前讲过)等

emptydir主要是用用作pod下不同容器间共享数据,不是持久化存储,重启后数据丢失。

和上述volume不同的是,如果删除Pod,emptyDir卷中的数据也将被删除,一般emptyDir卷用于Pod中的不同Container共享数据。它可以被挂载到相同或不同的路径上。
默认情况下,emptyDir卷支持节点上的任何介质,可能是SSD、磁盘或网络存储,具体取决于自身的环境。可以将emptyDir.medium字段设置为Memory,让Kubernetes使用tmpfs(内存支持的文件系统),虽然tmpfs非常快,但是tmpfs在节点重启时,数据同样会被清除,并且设置的大小会被计入到Container的内存限制当中。

[root@k8s-master01 ~]# vim nginx-deploy_1205_emptydir.yaml


# cat nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2 #副本数
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
       # ports:
       # - containerPort: 8080
       #   name: nginx-port
       #   protocol: TCP
        volumeMounts:
        - mountPath: /opt
          name: share-volume
        
      - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
        imagePullPolicy: IfNotPresent
        name: nginx2
        command:
        - sh
        - -c
        - sleep 3600
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
       # ports:
       # - containerPort: 8090
       #   name: nginx2-port
       #   protocol: TCP
        volumeMounts:
        - mountPath: /mnt
          name: share-volume
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes: 
      - name: share-volume
        emptyDir: {}
         #medium: Memory

[root@k8s-master01 ~]# kubectl create -f nginx-deploy_1205_emptydir.yaml
deployment.apps/nginx created

副本数是2,所以创建2个pod,每个pod包含2个容器nginx、nginx2

 

验证1: 

pod   nginx-6c5778576c-4hxkj  nginx

[root@k8s-master01 ~]# kubectl exec -it nginx-6c5778576c-4hxkj -c nginx -- bash
root@nginx-6c5778576c-4hxkj:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          26G  8.2G   18G  32% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3        26G  8.2G   18G  32% /opt
shm              64M     0   64M   0% /dev/shm
tmpfs           2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.5G     0  1.5G   0% /proc/acpi
tmpfs           1.5G     0  1.5G   0% /proc/scsi
tmpfs           1.5G     0  1.5G   0% /sys/firmware
root@nginx-6c5778576c-4hxkj:/# cd /opt
root@nginx-6c5778576c-4hxkj:/opt# ls
root@nginx-6c5778576c-4hxkj:/opt# touch test.txt
root@nginx-6c5778576c-4hxkj:/opt# echo aaaaaaaaaaaaa > test.txt 

 pod   nginx-6c5778576c-4hxkj  nginx2

[root@k8s-master01 ~]# kubectl exec -it nginx-6c5778576c-4hxkj -c nginx2 -- bash
root@nginx-6c5778576c-4hxkj:/# 
root@nginx-6c5778576c-4hxkj:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          26G  8.2G   18G  32% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3        26G  8.2G   18G  32% /mnt
shm              64M     0   64M   0% /dev/shm
tmpfs           2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.5G     0  1.5G   0% /proc/acpi
tmpfs           1.5G     0  1.5G   0% /proc/scsi
tmpfs           1.5G     0  1.5G   0% /sys/firmware
root@nginx-6c5778576c-4hxkj:/# cd /mnt
root@nginx-6c5778576c-4hxkj:/mnt# ls
test.txt
root@nginx-6c5778576c-4hxkj:/mnt# cat test.txt 
aaaaaaaaaaaaa

在容器nginx的/opt目录中写入文件test.txt

在容器nginx2的/mnt目录中看到写入的test.txt文件

验证2:

容器nginx2追加内容

root@nginx-6c5778576c-4hxkj:/mnt# echo "bbbbbbbbbbbbbbbbbbbbbbbb" >>test.txt 

容器nginx查看内容

root@nginx-6c5778576c-4hxkj:/opt# cat test.txt 
aaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbb

 9.3  Volumes HostPath挂载宿主机路径

Kubernetes是一种用于管理容器化应用程序的开源平台。在Kubernetes中,Pod是最小的可部署单元,可以包含一个或多个容器。每个Pod都有自己的IP地址,可以使用它来与其他Pod进行通信。Pod可以挂载一个或多个卷来存储应用程序数据。其中一个卷类型是HostPath,它允许Pod将宿主机上的文件或目录挂载到其容器中。

HostPath卷类型对于需要直接访问宿主机上的文件或目录的应用程序非常有用。例如,如果需要访问宿主机上的日志文件或配置文件,可以使用HostPath挂载这些文件。但是,使用HostPath也存在一些安全风险,因为它允许Pod访问宿主机上的文件系统。

警告:HostPath 卷存在许多安全风险,最佳做法是尽可能避免使用 HostPath。 当必须使用 HostPath 卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。如果通过 AdmissionPolicy 限制 HostPath 对特定目录的访问,则必须要求 volumeMounts 使用 readOnly 挂载以使策略生效。

一般不推荐使用。

vim  nginx-deploy_1205_emptydir.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2 #副本数
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
       # ports:
       # - containerPort: 8080
       #   name: nginx-port
       #   protocol: TCP
        volumeMounts:
        - mountPath: /opt
          name: share-volume
        - mountPath: /etc/timezone
          name: timezone 
        - mountPath: /tmp/
          name: tmp

        
      - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
        imagePullPolicy: IfNotPresent
        name: nginx2
        command:
        - sh
        - -c
        - sleep 1200
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
       # ports:
       # - containerPort: 8090
       #   name: nginx2-port
       #   protocol: TCP
        volumeMounts:
        - mountPath: /mnt
          name: share-volume
        - mountPath: /etc/timezone
          name: timezone 

      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes: 
      - name: share-volume
        emptyDir: {}
         #medium: Memory
      - name: timezone
        hostPath:
          path: /etc/timezone
          type: File
 
      - name: tmp
        hostPath:
          path: /tmp
          type: Directory

增加如下部分配置:挂载文件、挂载目录

验证:

kubectl replace -f nginx-deploy_1205_emptydir.yaml 

[root@k8s-master01 ~]# kubectl get pod
NAME                                READY   STATUS        RESTARTS      AGE
busybox                             0/1     Unknown       0             105d
nginx-5b95587595-m2fl9              2/2     Running       0             12s
nginx-5b95587595-x4zhm              2/2     Running       0             14s
nginx-6c5778576c-4hxkj              2/2     Terminating   1 (30m ago)   90m
nginx-6c5778576c-b64sf              2/2     Terminating   1 (30m ago)   90m
nginx-deployment-7f65cbfc84-2npk5   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-4hlpt   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-dmgfx   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-p2dfr   1/1     Running       1 (35d ago)   93d
nginx-deployment-7f65cbfc84-zkld4   1/1     Running       1 (35d ago)   93d

[root@k8s-master01 ~]# kubectl exec -it nginx-5b95587595-m2fl9 -c nginx -- bash

root@nginx-5b95587595-m2fl9:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          26G   10G   17G  39% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3        26G   10G   17G  39% /opt
shm              64M     0   64M   0% /dev/shm
tmpfs           2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.5G     0  1.5G   0% /proc/acpi
tmpfs           1.5G     0  1.5G   0% /proc/scsi
tmpfs           1.5G     0  1.5G   0% /sys/firmware

root@nginx-5b95587595-m2fl9:/# cd tmp
root@nginx-5b95587595-m2fl9:/tmp# ls 
sys.log
#宿主机增加sys2.log文件
root@nginx-5b95587595-m2fl9:/tmp# ls
runc-process2653599717	sys.log  sys2.log
#查看/etc/timezone文件
root@nginx-5b95587595-m2fl9:/tmp# cat /etc/timezone 
Asia/Shanghai

 

9.4 挂载NFS至容器

 master01 安装nfs软件

yum -y install nfs-utils rpcbind

宿主机node01(ip:192.168.42.244)安装nfs服务器

yum -y install nfs-utils rpcbind

systemctl restart nfs-server



[root@k8s-node01 ~]# vim /etc/exports

/mnt/ 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)
/opt/ 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)


#重新加载配置文件
[root@k8s-node01 ~]# exportfs -rv
exporting 192.168.0.0/16:/opt
exporting 192.168.0.0/16:/mnt

[root@k8s-node01 ~]# systemctl reload nfs-server

#查看共享目录
[root@k8s-node01 ~]# showmount -e localhost
Export list for localhost:
/opt 192.168.0.0/16
/mnt 192.168.0.0/16

master01验证node01 nfs server是否正常

[root@k8s-master01 mnt]# mkdir data
[root@k8s-master01 mnt]# mount -t nfs 192.168.42.244:/mnt /mnt/data/
[root@k8s-master01 mnt]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             1.5G     0  1.5G   0% /dev
tmpfs                1.5G     0  1.5G   0% /dev/shm
tmpfs                1.5G  153M  1.4G  11% /run
tmpfs                1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3             26G   10G   17G  39% /
/dev/sda1           1014M  171M  844M  17% /boot
。。。
192.168.42.244:/mnt   26G  7.8G   19G  30% /mnt/data
[root@k8s-master01 mnt]# ls /mnt/data/
node01.txt
[root@k8s-master01 mnt]# umount data
[root@k8s-master01 mnt]# 

开始测试:

在yaml文件增加如下2部分

vim nginx-deploy_1205_emptydir.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2 #副本数
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
       # ports:
       # - containerPort: 8080
       #   name: nginx-port
       #   protocol: TCP
        volumeMounts:
        - mountPath: /opt
          name: share-volume
        - mountPath: /etc/timezone
          name: timezone 
        - mountPath: /tmp/
          name: tmp

        
      - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
        imagePullPolicy: IfNotPresent
        name: nginx2
        command:
        - sh
        - -c
        - sleep 1200
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
       # ports:
       # - containerPort: 8090
       #   name: nginx2-port
       #   protocol: TCP
        volumeMounts:
        - mountPath: /mnt
          name: share-volume
        - mountPath: /etc/timezone
          name: timezone 

        - mountPath: /tmp
          name: nfs

      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes: 
      - name: share-volume
        emptyDir: {}
         #medium: Memory
      - name: timezone
        hostPath:
          path: /etc/timezone
          type: File
 
      - name: tmp
        hostPath:
          path: /tmp
          type: Directory

      - name: nfs
        nfs: 
          server: 192.168.42.244
          path: /mnt
[root@k8s-master01 ~]# kubectl replace -f nginx-deploy_1205_emptydir.yaml 
deployment.apps/nginx replaced

[root@k8s-master01 ~]# kubectl exec -it nginx-679784694b-g45v7 -c nginx2 -- bash
root@nginx-679784694b-g45v7:/# df -h
Filesystem           Size  Used Avail Use% Mounted on
overlay               26G  7.8G   19G  30% /
tmpfs                 64M     0   64M   0% /dev
tmpfs                1.5G     0  1.5G   0% /sys/fs/cgroup
/dev/sda3             26G  7.8G   19G  30% /mnt
192.168.42.244:/mnt   26G  7.8G   19G  30% /tmp
shm                   64M     0   64M   0% /dev/shm
tmpfs                2.9G   12K  2.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                1.5G     0  1.5G   0% /proc/acpi
tmpfs                1.5G     0  1.5G   0% /proc/scsi
tmpfs                1.5G     0  1.5G   0% /sys/firmware


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/155429.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式解码:软件工程架构的航标

引言 软件工程领域的设计模式,就像是建筑师手中的设计蓝图,它们是经验的总结,指导开发者如何在面对层出不穷的编程难题时,构建出既稳固又灵活的软件结构。就像一座经过精心设计的大厦能够经受住风雨的考验一样,一个利用…

MAC地址注册的网络安全影响和措施分析

MAC地址注册对网络安全具有重要影响,同时也需要采取相应的措施来应对潜在的安全风险。以下是有关MAC地址注册的网络安全影响和应对措施的分析: 影响: 1. 身份验证:MAC地址注册可用于设备的身份验证,但MAC地址本身并不…

MATLAB 机械臂逆运动学进行轨迹控制建模

系列文章目录 文章目录 系列文章目录前言一、模型概览1.1 Target Pose Generation 目标姿势生成1.2 Inverse Kinematics 逆运动学1.3 Manipulator Dynamics 机械手动力学1.4 Pose Measurement 姿势测量 二、机械手定义三、生成航点四、模型设置五、模拟机械手运动六、将结果可视…

how to find gcc openbug

https://gcc.gnu.org/bugzilla/query.cgi?formatadvanced

“开源 vs. 闭源:大模型的未来发展趋势预测“——探讨大模型未来的发展方向

文章目录 每日一句正能量前言什么是大模型的开源与闭源开源与闭源的定义和特点开源的意义开源和闭源的优劣势比较不同的大模型企业,开源、闭源的策略不尽相同。开源vs 闭源:两者并非选择题后记 每日一句正能量 依赖别人的人等于折断了自己的翅膀&#xf…

SQL中的数据类型和规范化,助力数据存储优化

大家好,目前优化数据存储对于获得良好的性能始终至关重要,选择合适的数据类型并应用正确的规范化过程对于决定其性能至关重要。本文将介绍最重要和最常用的数据类型和规范化过程。 一、SQL中的数据类型 SQL中主要有两种数据类型:字符串和数…

【文献阅读】Self similarity driven color demosaicking

[PDF][Code] 1. 摘要 每个像素只测量一种颜色成分,红色、绿色或蓝色,人们可以在每个像素推断出整个颜色信息。这种推断需要深刻理解颜色之间的相互作用,以及图像局部几何的参与。虽然在以非常小的相对误差进行这种推断方面非常成功&#xff…

深入C++ Vector:解密vector的奥秘与底层模拟实现揭秘

W...Y的主页 😊 代码仓库分享 💕 🍔前言: 我们学习了STL中的string以及其所有重要接口并进行了模拟实现,但是STL中包含的内容不止于此。学习了string之后继续学习STL中的vector,学习成本会大大降低&#…

Notepad++ 和正则表达式 只保留自己想要的内容

一、需求 如下文本,三段相同结构的数据,想要获取每段结构中‘重复的Ids ’后面的数字 2023-10-26 18:49:49 重复的Ids 26443,26575 要删除的Ids 4174,4199,4200,55502023-10-26 18:49:49 重复的Ids 26436,26443,26575 要删除的Ids 4166,4199,4200,5550…

Docker(镜像、容器、仓库)工具安装使用命令行选项及构建、共享和运行容器化应用程序

文章目录 前言🌟一、Docker工具安装🌟二、Docker命令行选项🌏2.1.docker run命令选项:🌏2.2.docker build命令选项:🌏2.3.docker images命令选项:🌏2.4.docker ps命令选项…

实用技巧:在C和cURL中设置代理服务器爬取www.ifeng.com视频

概述: 网络爬虫技术作为一种自动获取互联网数据的方法,在搜索引擎、数据分析、网站监测等领域发挥着重要作用。然而,面对反爬虫机制、网络阻塞、IP封禁等挑战,设置代理服务器成为解决方案之一。代理服务器能够隐藏爬虫的真实IP地…

MySQL JDBC编程

MySQL JDBC编程 文章目录 MySQL JDBC编程1. 数据库编程的必备条件2. Java的数据库编程:JDBC3. JDBC工作原理4. JDBC使用5. JDBC常用接口和类5.1 JDBC API5.2 数据库连接Connection5.3 Statement对象5.4 ResultSet对象 1. 数据库编程的必备条件 编程语言:…

web:[BUUCTF 2018]Online Tool

题目 打开页面显示如下,进行代码审计 上述代码主要功能是接收‘host’参数,后使用nmap扫描主机端口 首先检查是否存在HTTP_X_FORWARDED_FOR头,若存在,将值赋值给EMOTE_ADDR,是为了跟踪用户真实的IP地址 后用检查get‘host’是否…

第十九章,Java绘图

Graphics类 Graphics类是所有图形上下文的抽象基本类,它允许应用程序在组件以及闭屏图像上进行绘制 Graphics类封装了Java支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等 Graphics类提供了常用的绘图方法,利用这些…

Ubuntu 18.04无网络连接的n种可能办法

文章目录 网络图标消失,Ubuntu无网络连接VMware上Ubuntu18.04,桥接了多个网卡,其中一个用来上网,均设置为静态ip网络桥接链路没有接对路由不对 网络图标消失,Ubuntu无网络连接 sudo service network-manager stop sud…

家庭网络中的组网方式

家庭网络中,目前也衍生出了比较多的组网方式,也不是只有Easymesh,我们还是要辩证的去看,没有绝对的好和坏,需求不同,取舍不同。 这里博主简单的介绍几种组网方式,上图也比较直观 1.wds wds是…

系列九、对象的生命周期和GC

一、堆细分 Java堆从GC的角度还可以细分为:新生代(eden【伊甸园区】、from【幸存者0区】、to【幸存者1区】)和老年代。 二、MinorGC的过程 复制>清空》交换 1、eden、from区中的对象复制到to区,年龄1 首先,当eden区…

日本水稻(Oryza sativa Japonica rice)的基因组染色质长度 IRGSP-1.0

创作日志: 在看scHi-C综述的时候发现了一个在2021年发布在Nature Plants上的数据集,想拿来用,首先就要知道其对应的水稻品种以及染色质长度。最终在UCSC上找到了对应的组装好的基因组,版本名为 IRGSP-1.0。 UCSC链接:h…

如何让普通用户使用sudo?

一、sudo的作用 sudo就是可以让我们的普通用户以root身份去做一些事情,这相当于给普通用户提升了权限,但是并不是每个普通用户都可以随便拿到root的提权的,也就是sudo是要经过一定处理才可以给普通用户使用,那么如何处理呢&#x…

pytorch.nn.Conv1d详解

通读了从论文中找的代码,终于找到这个痛点了! 以下详解nn.Conv1d方法 1 参数说明 in_channels(int) – 输入信号的通道。 out_channels(int) – 卷积产生的通道。 kernel_size(int or tuple) - 卷积核的尺寸,经测试后卷积核的大小应为in_cha…