• 第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

    1. # cat nginx-deploy.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. labels:
    6. app: nginx
    7. name: nginx
    8. spec:
    9. replicas: 2 #副本数
    10. selector:
    11. matchLabels:
    12. app: nginx
    13. strategy:
    14. rollingUpdate:
    15. maxSurge: 25%
    16. maxUnavailable: 25%
    17. type: RollingUpdate
    18. template:
    19. metadata:
    20. creationTimestamp: null
    21. labels:
    22. app: nginx
    23. spec:
    24. containers:
    25. - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
    26. imagePullPolicy: IfNotPresent
    27. name: nginx
    28. resources: {}
    29. terminationMessagePath: /dev/termination-log
    30. terminationMessagePolicy: File
    31. # ports:
    32. # - containerPort: 8080
    33. # name: nginx-port
    34. # protocol: TCP
    35. volumeMounts:
    36. - mountPath: /opt
    37. name: share-volume
    38. - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
    39. imagePullPolicy: IfNotPresent
    40. name: nginx2
    41. command:
    42. - sh
    43. - -c
    44. - sleep 3600
    45. resources: {}
    46. terminationMessagePath: /dev/termination-log
    47. terminationMessagePolicy: File
    48. # ports:
    49. # - containerPort: 8090
    50. # name: nginx2-port
    51. # protocol: TCP
    52. volumeMounts:
    53. - mountPath: /mnt
    54. name: share-volume
    55. dnsPolicy: ClusterFirst
    56. restartPolicy: Always
    57. schedulerName: default-scheduler
    58. securityContext: {}
    59. terminationGracePeriodSeconds: 30
    60. volumes:
    61. - name: share-volume
    62. emptyDir: {}
    63. #medium: Memory
    1. [root@k8s-master01 ~]# kubectl create -f nginx-deploy_1205_emptydir.yaml
    2. deployment.apps/nginx created

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

     

    验证1: 

    pod   nginx-6c5778576c-4hxkj  nginx

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

     pod   nginx-6c5778576c-4hxkj  nginx2

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

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

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

    验证2:

    容器nginx2追加内容

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

    容器nginx查看内容

    1. root@nginx-6c5778576c-4hxkj:/opt# cat test.txt
    2. aaaaaaaaaaaaa
    3. 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 

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. labels:
    5. app: nginx
    6. name: nginx
    7. spec:
    8. replicas: 2 #副本数
    9. selector:
    10. matchLabels:
    11. app: nginx
    12. strategy:
    13. rollingUpdate:
    14. maxSurge: 25%
    15. maxUnavailable: 25%
    16. type: RollingUpdate
    17. template:
    18. metadata:
    19. creationTimestamp: null
    20. labels:
    21. app: nginx
    22. spec:
    23. containers:
    24. - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
    25. imagePullPolicy: IfNotPresent
    26. name: nginx
    27. resources: {}
    28. terminationMessagePath: /dev/termination-log
    29. terminationMessagePolicy: File
    30. # ports:
    31. # - containerPort: 8080
    32. # name: nginx-port
    33. # protocol: TCP
    34. volumeMounts:
    35. - mountPath: /opt
    36. name: share-volume
    37. - mountPath: /etc/timezone
    38. name: timezone
    39. - mountPath: /tmp/
    40. name: tmp
    41. - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
    42. imagePullPolicy: IfNotPresent
    43. name: nginx2
    44. command:
    45. - sh
    46. - -c
    47. - sleep 1200
    48. resources: {}
    49. terminationMessagePath: /dev/termination-log
    50. terminationMessagePolicy: File
    51. # ports:
    52. # - containerPort: 8090
    53. # name: nginx2-port
    54. # protocol: TCP
    55. volumeMounts:
    56. - mountPath: /mnt
    57. name: share-volume
    58. - mountPath: /etc/timezone
    59. name: timezone
    60. dnsPolicy: ClusterFirst
    61. restartPolicy: Always
    62. schedulerName: default-scheduler
    63. securityContext: {}
    64. terminationGracePeriodSeconds: 30
    65. volumes:
    66. - name: share-volume
    67. emptyDir: {}
    68. #medium: Memory
    69. - name: timezone
    70. hostPath:
    71. path: /etc/timezone
    72. type: File
    73. - name: tmp
    74. hostPath:
    75. path: /tmp
    76. type: Directory

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

    验证:

    kubectl replace -f nginx-deploy_1205_emptydir.yaml 

    1. [root@k8s-master01 ~]# kubectl get pod
    2. NAME READY STATUS RESTARTS AGE
    3. busybox 0/1 Unknown 0 105d
    4. nginx-5b95587595-m2fl9 2/2 Running 0 12s
    5. nginx-5b95587595-x4zhm 2/2 Running 0 14s
    6. nginx-6c5778576c-4hxkj 2/2 Terminating 1 (30m ago) 90m
    7. nginx-6c5778576c-b64sf 2/2 Terminating 1 (30m ago) 90m
    8. nginx-deployment-7f65cbfc84-2npk5 1/1 Running 1 (35d ago) 93d
    9. nginx-deployment-7f65cbfc84-4hlpt 1/1 Running 1 (35d ago) 93d
    10. nginx-deployment-7f65cbfc84-dmgfx 1/1 Running 1 (35d ago) 93d
    11. nginx-deployment-7f65cbfc84-p2dfr 1/1 Running 1 (35d ago) 93d
    12. nginx-deployment-7f65cbfc84-zkld4 1/1 Running 1 (35d ago) 93d
    13. [root@k8s-master01 ~]# kubectl exec -it nginx-5b95587595-m2fl9 -c nginx -- bash
    14. root@nginx-5b95587595-m2fl9:/# df -h
    15. Filesystem Size Used Avail Use% Mounted on
    16. overlay 26G 10G 17G 39% /
    17. tmpfs 64M 0 64M 0% /dev
    18. tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup
    19. /dev/sda3 26G 10G 17G 39% /opt
    20. shm 64M 0 64M 0% /dev/shm
    21. tmpfs 2.9G 12K 2.9G 1% /run/secrets/kubernetes.io/serviceaccount
    22. tmpfs 1.5G 0 1.5G 0% /proc/acpi
    23. tmpfs 1.5G 0 1.5G 0% /proc/scsi
    24. tmpfs 1.5G 0 1.5G 0% /sys/firmware
    25. root@nginx-5b95587595-m2fl9:/# cd tmp
    26. root@nginx-5b95587595-m2fl9:/tmp# ls
    27. sys.log
    28. #宿主机增加sys2.log文件
    29. root@nginx-5b95587595-m2fl9:/tmp# ls
    30. runc-process2653599717 sys.log sys2.log
    31. #查看/etc/timezone文件
    32. root@nginx-5b95587595-m2fl9:/tmp# cat /etc/timezone
    33. Asia/Shanghai

    9.4 挂载NFS至容器

     master01 安装nfs软件

    yum -y install nfs-utils rpcbind

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

    1. yum -y install nfs-utils rpcbind
    2. systemctl restart nfs-server
    3. [root@k8s-node01 ~]# vim /etc/exports
    4. /mnt/ 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)
    5. /opt/ 192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash)
    6. #重新加载配置文件
    7. [root@k8s-node01 ~]# exportfs -rv
    8. exporting 192.168.0.0/16:/opt
    9. exporting 192.168.0.0/16:/mnt
    10. [root@k8s-node01 ~]# systemctl reload nfs-server
    11. #查看共享目录
    12. [root@k8s-node01 ~]# showmount -e localhost
    13. Export list for localhost:
    14. /opt 192.168.0.0/16
    15. /mnt 192.168.0.0/16

    master01验证node01 nfs server是否正常

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

    开始测试:

    在yaml文件增加如下2部分

    vim nginx-deploy_1205_emptydir.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. labels:
    5. app: nginx
    6. name: nginx
    7. spec:
    8. replicas: 2 #副本数
    9. selector:
    10. matchLabels:
    11. app: nginx
    12. strategy:
    13. rollingUpdate:
    14. maxSurge: 25%
    15. maxUnavailable: 25%
    16. type: RollingUpdate
    17. template:
    18. metadata:
    19. creationTimestamp: null
    20. labels:
    21. app: nginx
    22. spec:
    23. containers:
    24. - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
    25. imagePullPolicy: IfNotPresent
    26. name: nginx
    27. resources: {}
    28. terminationMessagePath: /dev/termination-log
    29. terminationMessagePolicy: File
    30. # ports:
    31. # - containerPort: 8080
    32. # name: nginx-port
    33. # protocol: TCP
    34. volumeMounts:
    35. - mountPath: /opt
    36. name: share-volume
    37. - mountPath: /etc/timezone
    38. name: timezone
    39. - mountPath: /tmp/
    40. name: tmp
    41. - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12
    42. imagePullPolicy: IfNotPresent
    43. name: nginx2
    44. command:
    45. - sh
    46. - -c
    47. - sleep 1200
    48. resources: {}
    49. terminationMessagePath: /dev/termination-log
    50. terminationMessagePolicy: File
    51. # ports:
    52. # - containerPort: 8090
    53. # name: nginx2-port
    54. # protocol: TCP
    55. volumeMounts:
    56. - mountPath: /mnt
    57. name: share-volume
    58. - mountPath: /etc/timezone
    59. name: timezone
    60. - mountPath: /tmp
    61. name: nfs
    62. dnsPolicy: ClusterFirst
    63. restartPolicy: Always
    64. schedulerName: default-scheduler
    65. securityContext: {}
    66. terminationGracePeriodSeconds: 30
    67. volumes:
    68. - name: share-volume
    69. emptyDir: {}
    70. #medium: Memory
    71. - name: timezone
    72. hostPath:
    73. path: /etc/timezone
    74. type: File
    75. - name: tmp
    76. hostPath:
    77. path: /tmp
    78. type: Directory
    79. - name: nfs
    80. nfs:
    81. server: 192.168.42.244
    82. path: /mnt
    1. [root@k8s-master01 ~]# kubectl replace -f nginx-deploy_1205_emptydir.yaml
    2. deployment.apps/nginx replaced
    3. [root@k8s-master01 ~]# kubectl exec -it nginx-679784694b-g45v7 -c nginx2 -- bash
    4. root@nginx-679784694b-g45v7:/# df -h
    5. Filesystem Size Used Avail Use% Mounted on
    6. overlay 26G 7.8G 19G 30% /
    7. tmpfs 64M 0 64M 0% /dev
    8. tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup
    9. /dev/sda3 26G 7.8G 19G 30% /mnt
    10. 192.168.42.244:/mnt 26G 7.8G 19G 30% /tmp
    11. shm 64M 0 64M 0% /dev/shm
    12. tmpfs 2.9G 12K 2.9G 1% /run/secrets/kubernetes.io/serviceaccount
    13. tmpfs 1.5G 0 1.5G 0% /proc/acpi
    14. tmpfs 1.5G 0 1.5G 0% /proc/scsi
    15. tmpfs 1.5G 0 1.5G 0% /sys/firmware

  • 相关阅读:
    开源和闭源的优劣势比较
    java基于SpringBoot+Vue的疫苗预约管理系统 element 前后端分离
    陕西省助理评审申报,看这文章就够了
    如何从 iPhone 恢复永久删除的视频
    基于OFDM的水下图像传输通信系统matlab仿真
    vue3 兄弟组件传值方法 使用中间件mitt------进行兄弟元素传值
    基于头肩部检测的过线客流统计
    机器人到达指定位置的方法数问题
    【Java小知识点】类加载器的区别
    awk命令的使用
  • 原文地址:https://blog.csdn.net/jundao1997/article/details/134443661