『Kubernetes(K8S) 入门进阶实战』数据存储

[复制链接]
发表于 2025-9-18 01:41:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
『Kubernetes(K8S) 入门进阶实战』数据存储

介绍


  • 在前面已经提到,容器的生命周期大概很短,会被频仍地创建和烧毁。那么容器在烧毁时,生存在容器中的数据也会被扫除
  • 这种效果对用户来说,在某些环境下是不乐意看到的。为了长期化生存容器的数据,kubernetes 引入了 Volume 的概念
  • Volume 是 Pod 中可以或许被多个容器访问的共享目次,它被界说在 Pod 上,然后被一个 Pod 里的多个容器挂载到具体的文件目次下, kubernetes 通过 Volume 实现同一个 Pod 中差别容器之间的数据共享以及数据的长期化存储
  • Volume 的生命容器不与 Pod 中单个容器的生命周期相干,当容器制止大概重启时,Volume 中的数据也不会丢失
  • kubernetes 的 Volume 支持多种类型,比较常见的有下面几个


  • 简单存储:EmptyDir、HostPath、NFS
  • 高级存储:PV、PVC
  • 设置存储:ConfigMap、Secret
根本存储

EmptyDir


  • EmptyDir 是最根本的 Volume 类型,一个 EmptyDir 就是 Host 上的一个空目次
  • EmptyDir 是在 Pod 被分配到 Node 时创建的,它的初始内容为空,而且无须指定宿主机上对应的目次文件,由于 kubernetes 会主动分配一个目次,当 Pod 烧毁时, EmptyDir 中的数据也会被永世删除。EmptyDir 用途如下:


  • 临时空间,比方用于某些应用步调运行时所需的临时目次,且无须永世生存
  • 一个容器需要从另一个容器中获取数据的目次(多容器共享目次)

  • 接下来,通过一个容器之间文件共享的案例来使用一下 EmptyDir
  • 在一个 Pod 中预备两个容器 nginx 和 busybox,然后声明一个 Volume 分别挂在到两个容器的目次中,然后 nginx 容器负责向 Volume 中写日志日志,busybox 中通过下令将日志日志内容读到控制台

  • 创建一个 volume-emptydir.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: volume-emptydir
  5.   namespace: dev
  6. spec:
  7.   containers:
  8.   - name: nginx
  9.     image: nginx:1.17.1
  10.     ports:
  11.     - containerPort: 80
  12.     volumeMounts:  # 将logs-volume挂在到nginx容器中,对应的目录为 /var/log/nginx
  13.     - name: logs-volume
  14.       mountPath: /var/log/nginx
  15.   - name: busybox
  16.     image: busybox:1.30
  17.     command: ["/bin/sh","-c","tail -f /logs/access.log"] # 初始命令,动态读取指定文件中内容
  18.     volumeMounts:  # 将logs-volume 挂在到busybox容器中,对应的目录为 /logs
  19.     - name: logs-volume
  20.       mountPath: /logs
  21.   volumes: # 声明volume, name为logs-volume,类型为emptyDir
  22.   - name: logs-volume
  23.     emptyDir: {}
复制代码
  1. # 创建Pod
  2. [root@k8s-master01 ~]# kubectl create -f volume-emptydir.yaml
  3. pod/volume-emptydir created
  4. # 查看pod
  5. [root@k8s-master ~]# kubectl get pods volume-emptydir -n dev -o wide
  6. NAME              READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
  7. volume-emptydir   2/2     Running   0          4s    10.244.169.131   k8s-node2   <none>           <none>
  8. # 通过podIp访问nginx
  9. [root@k8s-master01 ~]# curl 10.42.2.9
  10. ......
  11. # 通过kubectl logs命令查看指定容器的标准输出
  12. [root@k8s-master ~]# kubectl logs -f volume-emptydir -n dev -c busybox
  13. 10.244.235.192 - - [01/May/2025:10:23:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
复制代码
HostPath


  • EmptyDir 中数据不会被长期化,它会随着 Pod 的结束而烧毁,如果想简单的将数据长期化到主机中,可以选择 HostPath
  • HostPath 就是将 Node 主机中一个现实目次挂在到 Pod 中,以供容器使用,如许的计划就可以包管 Pod 烧毁了,但是数据依据可以存在于 Node 主机上

  • 创建一个 volume-hostpath.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: volume-hostpath
  5.   namespace: dev
  6. spec:
  7.   containers:
  8.   - name: nginx
  9.     image: nginx:1.17.1
  10.     ports:
  11.     - containerPort: 80
  12.     volumeMounts:
  13.     - name: logs-volume
  14.       mountPath: /var/log/nginx
  15.   - name: busybox
  16.     image: busybox:1.30
  17.     command: ["/bin/sh","-c","tail -f /logs/access.log"]
  18.     volumeMounts:
  19.     - name: logs-volume
  20.       mountPath: /logs
  21.   volumes:
  22.   - name: logs-volume
  23.     hostPath:
  24.       path: /root/logs
  25.       type: DirectoryOrCreate  # 目录存在就使用,不存在就先创建后使用
复制代码

  • 关于 type 的值的一点说明:
  1. DirectoryOrCreate 目录存在就使用,不存在就先创建后使用
  2. Directory   目录必须存在
  3. FileOrCreate  文件存在就使用,不存在就先创建后使用
  4. File 文件必须存在
  5. Socket  unix 套接字必须存在
  6. CharDevice  字符设备必须存在
  7. BlockDevice 块设备必须存在
复制代码

  • 检察实验效果
  1. # 创建Pod
  2. [root@k8s-master01 ~]# kubectl create -f volume-hostpath.yaml
  3. pod/volume-hostpath created
  4. # 查看Pod
  5. [root@k8s-master ~]# kubectl get pods volume-hostpath -n dev -o wide
  6. NAME              READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
  7. volume-hostpath   2/2     Running   0          5s    10.244.169.130   k8s-node2   <none>           <none>
  8. #访问nginx
  9. [root@k8s-master01 ~]# curl 10.244.169.130
  10. [root@k8s-master01 ~]# kubectl logs -f volume-hostpath -n dev -c busybox
  11. # 接下来就可以去host的/root/logs目录下查看存储的文件了
  12. ###  注意: 下面的操作需要到Pod所在的节点运行(案例中是node2)
  13. [root@k8s-node2 ~]# ls /root/logs/
  14. access.log  error.log
  15. # 同样的道理,如果在此目录下创建一个文件,到容器中也是可以看到的
复制代码
NFS


  • HostPath 可以办理数据长期化的问题,但是一旦 Node 节点故障了,Pod 如果转移到了别的节点,又会出现问题了,此时需要预备单独的网络存储体系,比较常用的用 NFS、CIFS
  • NFS 是一个网络文件存储体系,可以搭建一台 NFS 服务器,然后将 Pod 中的存储直接毗连到 NFS 体系上,如许的话,无论 Pod 在节点上怎么转移,只要 Node 跟 NFS 的对接没问题,数据就可以乐成访问

  • 起首要预备 nfs 的服务器,这里为了简单,直接是 master 节点做 nfs 服务器
  1. # 在nfs上安装nfs服务
  2. [root@nfs ~]# yum install nfs-utils -y
  3. # 准备一个共享目录
  4. [root@nfs ~]# mkdir /root/data/nfs -pv
  5. # 将共享目录以读写权限暴露给192.168.124.0/24网段中的所有主机
  6. [root@nfs ~]# vim /etc/exports
  7. [root@nfs ~]# more /etc/exports
  8. /root/data/nfs     192.168.124.0/24(rw,no_root_squash)
  9. # 启动nfs服务
  10. [root@nfs ~]# systemctl restart nfs
复制代码

  • 接下来,要在的每个 node 节点上都安装下 nfs,如许的目标是为了 node 节点可以驱动 nfs 装备
  1. # 在node上安装nfs服务,注意不需要启动
  2. [root@k8s-master01 ~]# yum install nfs-utils -y
复制代码

  • 接下来,就可以编写 pod 的设置文件了,创建 volume-nfs.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: volume-nfs
  5.   namespace: dev
  6. spec:
  7.   containers:
  8.   - name: nginx
  9.     image: nginx:1.17.1
  10.     ports:
  11.     - containerPort: 80
  12.     volumeMounts:
  13.     - name: logs-volume
  14.       mountPath: /var/log/nginx
  15.   - name: busybox
  16.     image: busybox:1.30
  17.     command: ["/bin/sh","-c","tail -f /logs/access.log"]
  18.     volumeMounts:
  19.     - name: logs-volume
  20.       mountPath: /logs
  21.   volumes:
  22.   - name: logs-volume
  23.     nfs:
  24.       server: 192.168.124.85  #nfs服务器地址
  25.       path: /root/data/nfs #共享文件路径
复制代码

  • 末了,运行下 pod,观察效果
  1. # 创建pod
  2. [root@k8s-master01 ~]# kubectl create -f volume-nfs.yaml
  3. pod/volume-nfs created
  4. # 查看pod
  5. [root@k8s-master ~]# kubectl get pods volume-nfs -n dev -o wide
  6. NAME         READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
  7. volume-nfs   2/2     Running   0          48s   10.244.169.139   k8s-node2   <none>           <none>
  8. # 查询网页
  9. curl 10.244.169.139
  10. # 查看nfs服务器上的共享目录,发现已经有文件了
  11. [root@k8s-master01 ~]# ls /root/data/
  12. access.log  error.log
复制代码
高级存储

介绍


  • 前面已经学习了使用 NFS 提供存储,此时就要求用户会搭建NFS体系,而且会在yaml设置 nfs
  • 由于 kubernetes 支持的存储体系有许多,要求客户全都把握,显然不现实。为了可以或许屏蔽底层存储实现的细节,方便用户使用, kubernetes 引入 PV 和 PVC 两种资源对象


  • PV(Persistent Volume)是长期化卷的意思,是对底层的共享存储的一种抽象。一样寻常环境下 PV 由 kubernetes 管理员举行创建和设置,它与底层具体的共享存储技能有关,并通过插件完成与共享存储的对接
  • PVC(Persistent Volume Claim)是长期卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC 其实就是用户向 kubernetes 体系发出的一种资源需求申请


  • 使用了 PV 和 PVC 之后,工作可以得到进一步的细分


  • 存储:存储工程师维护
  • PV:kubernetes 管理员维护
  • PVC:kubernetes 用户维护
PV


  • PV 是存储资源的抽象,下面是资源清单文件
  1. apiVersion: v1  
  2. kind: PersistentVolume
  3. metadata:
  4.   name: pv2
  5. spec:
  6.   nfs: # 存储类型,与底层真正存储对应
  7.   capacity:  # 存储能力,目前只支持存储空间的设置
  8.     storage: 2Gi
  9.   accessModes:  # 访问模式
  10.   storageClassName: # 存储类别
  11.   persistentVolumeReclaimPolicy: # 回收策略
复制代码

  • PV 的关键设置参数说明


  • 存储类型:底层现实存储的类型,kubernetes 支持多种存储类型,每种存储类型的设置都有所差别
  • 存储本事(capacity):现在只支持存储空间的设置(storage=1Gi),不外将来大概会参加 IOPS、吞吐量等指标的设置

  • 访问模式(accessModes):用于形貌用户应用对存储资源的访问权限,访问权限包括下面几种方式


  • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
  • ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载
  • 留意:底层差别的存储类型大概支持的访问模式差别

  • 回收计谋(persistentVolumeReclaimPolicy):当 PV 不再被使用了之后,对其的处理处罚方式。现在支持三种计谋


  • Retain (生存):生存数据,需要管理员手工整理数据
  • Recycle(回收):扫除 PV 中的数据,效果相称于实验 rm -rf /thevolume/*
  • Delete (删除):与 PV 相连的后端存储完成 volume 的删除操纵,固然这常见于云服务商的存储服务
  • 留意:底层差别的存储类型大概支持的回收计谋差别

  • 存储种别:PV 可以通过 storageClassName 参数指定一个存储种别


  • 具有特定种别的 PV 只能与哀求了该种别的 PVC 举行绑定
  • 未设定种别的 PV 则只能与不哀求任何种别的 PVC 举行绑定

  • 状态(status):一个 PV 的生命周期中,大概会处于 4 中差别的阶段


  • Available(可用): 表现可用状态,还未被任何 PVC 绑定
  • Bound(已绑定): 表现 PV 已经被 PVC 绑定
  • Released(已开释): 表现 PVC 被删除,但是资源还未被集群重新声明
  • Failed(失败): 表现该 PV 的主动回收失败

  • 实验


  • 使用 NFS 作为存储,来演示 PV 的使用,创建 3 个PV,对应 NFS 中的 3 个袒露的路径
  • 预备 NFS 环境
  1. # 创建目录
  2. [root@nfs ~]# mkdir /root/data/{pv1,pv2,pv3} -pv
  3. # 暴露服务
  4. [root@nfs ~]# more /etc/exports
  5. /root/data/pv1     192.168.124.0/24(rw,no_root_squash)
  6. /root/data/pv2     192.168.124.0/24(rw,no_root_squash)
  7. /root/data/pv3     192.168.124.0/24(rw,no_root_squash)
  8. # 重启服务
  9. [root@nfs ~]#  systemctl restart nfs
复制代码

  • 创建 pv.yaml
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name:  pv1
  5. spec:
  6.   capacity:
  7.     storage: 1Gi
  8.   accessModes:
  9.   - ReadWriteMany
  10.   persistentVolumeReclaimPolicy: Retain
  11.   nfs:
  12.     path: /root/data/pv1
  13.     server: 192.168.124.85
  14. ---
  15. apiVersion: v1
  16. kind: PersistentVolume
  17. metadata:
  18.   name:  pv2
  19. spec:
  20.   capacity:
  21.     storage: 2Gi
  22.   accessModes:
  23.   - ReadWriteMany
  24.   persistentVolumeReclaimPolicy: Retain
  25.   nfs:
  26.     path: /root/data/pv2
  27.     server: 192.168.124.85
  28.    
  29. ---
  30. apiVersion: v1
  31. kind: PersistentVolume
  32. metadata:
  33.   name:  pv3
  34. spec:
  35.   capacity:
  36.     storage: 3Gi
  37.   accessModes:
  38.   - ReadWriteMany
  39.   persistentVolumeReclaimPolicy: Retain
  40.   nfs:
  41.     path: /root/data/pv3
  42.     server: 192.168.124.85
复制代码
  1. # 创建 pv
  2. [root@k8s-master01 ~]# kubectl create -f pv.yaml
  3. persistentvolume/pv1 created
  4. persistentvolume/pv2 created
  5. persistentvolume/pv3 created
  6. # 查看pv
  7. [root@k8s-master01 ~]# kubectl get pv -o wide
  8. NAME   CAPACITY   ACCESS MODES  RECLAIM POLICY  STATUS      AGE   VOLUMEMODE
  9. pv1    1Gi        RWX            Retain        Available    10s   Filesystem
  10. pv2    2Gi        RWX            Retain        Available    10s   Filesystem
  11. pv3    3Gi        RWX            Retain        Available    9s    Filesystem
复制代码
PVC


  • PVC 是资源的申请,用来声明对存储空间、访问模式、存储种别需求信息。下面是资源清单文件
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: pvc
  5.   namespace: dev
  6. spec:
  7.   accessModes: # 访问模式
  8.   selector: # 采用标签对PV选择
  9.   storageClassName: # 存储类别
  10.   resources: # 请求空间
  11.     requests:
  12.       storage: 5Gi
复制代码

  • PVC 的关键设置参数说明


  • 访问模式(accessModes):用于形貌用户应用对存储资源的访问权限(留意:这个肯定要和 PV 设置一样)
  • 选择条件(selector):通过 Label Selector 的设置,可使 PVC 对于体系中己存在的 PV 举行筛选
  • 存储种别(storageClassName):PVC 在界说时可以设定需要的后端存储的种别,只有设置了该 class 的 pv 才华被体系选出
  • 资源哀求(Resources):形貌对存储资源的哀求

  • 实验


  • 创建 pvc.yaml,申请 pv
  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4.   name: pvc1
  5.   namespace: dev
  6. spec:
  7.   accessModes:
  8.   - ReadWriteMany
  9.   resources:
  10.     requests:
  11.       storage: 1Gi
  12. ---
  13. apiVersion: v1
  14. kind: PersistentVolumeClaim
  15. metadata:
  16.   name: pvc2
  17.   namespace: dev
  18. spec:
  19.   accessModes:
  20.   - ReadWriteMany
  21.   resources:
  22.     requests:
  23.       storage: 1Gi
  24. ---
  25. apiVersion: v1   # 这个肯定申请不成功的
  26. kind: PersistentVolumeClaim
  27. metadata:
  28.   name: pvc3
  29.   namespace: dev
  30. spec:
  31.   accessModes:
  32.   - ReadWriteMany
  33.   resources:
  34.     requests:
  35.       storage: 5Gi
复制代码
  1. # 创建pvc
  2. [root@k8s-master01 ~]# kubectl create -f pvc.yaml
  3. persistentvolumeclaim/pvc1 created
  4. persistentvolumeclaim/pvc2 created
  5. persistentvolumeclaim/pvc3 created
  6. # 查看pvc
  7. [root@k8s-master ~]# kubectl get pvc  -n dev -o wide
  8. NAME   STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
  9. pvc1   Bound     pv1      1Gi        RWX                           11s   Filesystem
  10. pvc2   Bound     pv2      2Gi        RWX                           11s   Filesystem
  11. pvc3   Pending                                                     11s   Filesystem
  12. # 查看pv
  13. [root@k8s-master ~]# kubectl get pv -o wide
  14. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE    VOLUMEMODE
  15. pv1    1Gi        RWX            Retain           Bound       dev/pvc1                           135m   Filesystem
  16. pv2    2Gi        RWX            Retain           Bound       dev/pvc2                           135m   Filesystem
  17. pv3    3Gi        RWX            Retain           Available                                      135m   Filesystem  
复制代码

  • 创建 pods.yaml,使用 pv
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: pod1
  5.   namespace: dev
  6. spec:
  7.   containers:
  8.   - name: busybox
  9.     image: busybox:1.30
  10.     command: ["/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;"]
  11.     volumeMounts:
  12.     - name: volume
  13.       mountPath: /root/
  14.   volumes:
  15.     - name: volume
  16.       persistentVolumeClaim:
  17.         claimName: pvc1 # 这里就申明了用哪个 pvc
  18.         readOnly: false
  19. ---
  20. apiVersion: v1
  21. kind: Pod
  22. metadata:
  23.   name: pod2
  24.   namespace: dev
  25. spec:
  26.   containers:
  27.   - name: busybox
  28.     image: busybox:1.30
  29.     command: ["/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;"]
  30.     volumeMounts:
  31.     - name: volume
  32.       mountPath: /root/
  33.   volumes:
  34.     - name: volume
  35.       persistentVolumeClaim:
  36.         claimName: pvc2
  37.         readOnly: false
复制代码
  1. # 创建pod
  2. [root@k8s-master01 ~]# kubectl create -f pods.yaml
  3. pod/pod1 created
  4. pod/pod2 created
  5. # 查看pod
  6. [root@k8s-master01 ~]# kubectl get pods -n dev -o wide
  7. NAME                                 READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES  
  8. pod1                                 1/1     Running   0          7s     10.244.169.140   k8s-node2   <none>           <none>
  9. pod2                                 1/1     Running   0          7s     10.244.36.123    k8s-node1   <none>           <none>
  10. # 查看pvc
  11. [root@k8s-master ~]# kubectl get pvc -n dev -o wide
  12. NAME   STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE    VOLUMEMODE
  13. pvc1   Bound     pv1      1Gi        RWX                           7m4s   Filesystem
  14. pvc2   Bound     pv2      2Gi        RWX                           7m4s   Filesystem
  15. pvc3   Pending                                                     7m4s   Filesystem
  16. # 查看pv
  17. [root@k8s-master ~]# kubectl get pv -n dev -o wide
  18. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE    VOLUMEMODE
  19. pv1    1Gi        RWX            Retain           Bound       dev/pvc1                           142m   Filesystem
  20. pv2    2Gi        RWX            Retain           Bound       dev/pvc2                           142m   Filesystem
  21. pv3    3Gi        RWX            Retain           Available                                      142m   Filesystem
  22. # 查看nfs中的文件存储
  23. [root@k8s-master ~]# more /root/data/pv1/out.txt
  24. pod1
  25. pod1
  26. pod1
  27. pod1
  28. [root@k8s-master ~]# more /root/data/pv2/out.txt
  29. pod2
  30. pod2
  31. pod2
  32. pod2
复制代码
生命周期


  • PVC 和 PV 是一一对应的,PV 和 PVC 之间的相互作用依照以下生命周期


  • 资源供应:管理员手动创建底层存储和 PV
  • 资源绑定:用户创建 PVC,kubernetes 负责根据 PVC 的声明去探求 PV,并绑定在用户界说好 PVC 之后,体系将根据 PVC 对存储资源的哀求在已存在的 PV 中选择一个满足条件的

    • 一旦找到,就将该 PV 与用户界说的 PVC 举行绑定,用户的应用就可以使用这个 PVC 了
    • 如果找不到,PVC 则会无穷期处于 Pending 状态,直到比及体系管理员创建了一个符合其要求的 PV
    • PV 一旦绑定到某个 PVC 上,就会被这个 PVC 独占,不能再与其他 PVC 举行绑定了

  • 资源使用:用户可在 pod 中像 volume 一样使用 pvc,Pod 使用 Volume 的界说,将 PVC 挂载到容器内的某个路径举使用用
  • 资源开释:用户删除 pvc 来开释 pv,当存储资源使用完毕后,用户可以删除 PVC,与该 PVC 绑定的 PV 将会被标志为“已开释”,但还不能立刻与其他 PVC 举行绑定。通过之前 PVC 写入的数据大概还被留在存储装备上,只有在扫除之后该 PV 才华再次使用
  1. # 先删除 Pods
  2. [root@k8s-master ~]# kubectl delete -f pods.yaml
  3. pod "pod1" deleted
  4. pod "pod2" deleted
  5. # 后删除 pvc
  6. [root@k8s-master ~]# kubectl delete -f pvc.yaml
  7. persistentvolumeclaim "pvc1" deleted
  8. persistentvolumeclaim "pvc2" deleted
  9. persistentvolumeclaim "pvc3" deleted
  10. # 最后就可以看到效果
  11. [root@k8s-master ~]# kubectl get pv -n dev -o wide
  12. NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM      STORAGECLASS   REASON   AGE    VOLUMEMODE
  13. pv1    1Gi        RWX            Retain           Released    dev/pvc1                           144m   Filesystem
  14. pv2    2Gi        RWX            Retain           Released    dev/pvc2                           144m   Filesystem
  15. pv3    3Gi        RWX            Retain           Available                                      144m   Filesystem
复制代码

  • 资源回收:kubernetes 根据 pv 设置的回收计谋举行资源的回收。对于 PV,管理员可以设定回收计谋,用于设置与之绑定的 PVC 开释资源之后如那边理处罚遗留数据的问题。只有 PV 的存储空间完成回收,才华供新的 PVC 绑定和使用

设置存储

ConfigMap


  • ConfigMap 是一种比较特别的存储卷,它的主要作用是用来存储设置信息的
  • 创建 configmap.yaml,内容如下
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: configmap
  5.   namespace: dev
  6. data:
  7.   info: |
  8.     username:admin
  9.     password:123456
复制代码

  • 接下来,使用此设置文件创建 configmap
  1. # 创建configmap
  2. [root@k8s-master01 ~]# kubectl create -f configmap.yaml
  3. configmap/configmap created
  4. # 查看configmap详情
  5. [root@k8s-master01 ~]# kubectl describe cm configmap -n dev
  6. Name:         configmap
  7. Namespace:    dev
  8. Labels:       <none>
  9. Annotations:  <none>
  10. Data
  11. ====
  12. info:
  13. ----
  14. username:admin
  15. password:123456
  16. Events:  <none>
复制代码

  • 接下来创建一个 pod-configmap.yaml,将上面创建的 configmap 挂载进去
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: pod-configmap
  5.   namespace: dev
  6. spec:
  7.   containers:
  8.   - name: nginx
  9.     image: nginx:1.17.1
  10.     volumeMounts: # 将configmap挂载到目录
  11.     - name: config
  12.       mountPath: /configmap/config
  13.   volumes: # 引用configmap
  14.   - name: config
  15.     configMap:
  16.       name: configmap
复制代码
  1. # 创建pod
  2. [root@k8s-master01 ~]# kubectl create -f pod-configmap.yaml
  3. pod/pod-configmap created
  4. # 查看pod
  5. [root@k8s-master01 ~]# kubectl get pod pod-configmap -n dev
  6. NAME            READY   STATUS    RESTARTS   AGE
  7. pod-configmap   1/1     Running   0          6s
  8. #进入容器
  9. [root@k8s-master01 ~]# kubectl exec -it pod-configmap -n dev /bin/sh
  10. # cd /configmap/config/
  11. # ls
  12. info
  13. # more info
  14. username:admin
  15. password:123456
  16. # 可以看到映射已经成功,每个configmap都映射成了一个目录
  17. # key--->文件     value---->文件中的内容
  18. # 此时如果更新configmap的内容, 容器中的值也会动态更新
  19. kubectl edit cm configmap -n dev # 可以尝试修改一下值后,再去看看变更
复制代码
Secret


  • 在 kubernetes 中,还存在一种和 ConfigMap 非常雷同的对象,称为 Secret 对象。它主要用于存储敏感信息,比方暗码、秘钥、证书等等
  • 起首使用 base64 对数据举行编码
  1. [root@k8s-master01 ~]# echo -n 'admin' | base64 #准备username
  2. YWRtaW4=
  3. [root@k8s-master01 ~]# echo -n '123456' | base64 #准备password
  4. MTIzNDU2
复制代码

  • 接下来编写 secret.yaml,并创建 Secret
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: secret
  5.   namespace: dev
  6. type: Opaque
  7. data:
  8.   username: YWRtaW4=
  9.   password: MTIzNDU2
复制代码
  1. # 创建secret
  2. [root@k8s-master01 ~]# kubectl create -f secret.yaml
  3. secret/secret created
  4. # 查看secret详情
  5. [root@k8s-master01 ~]# kubectl describe secret secret -n dev
  6. Name:         secret
  7. Namespace:    dev
  8. Labels:       <none>
  9. Annotations:  <none>
  10. Type:  Opaque
  11. Data
  12. ====
  13. password:  6 bytes
  14. username:  5 bytes
复制代码

  • 创建 pod-secret.yaml,将上面创建的 secret 挂载进去
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: pod-secret
  5.   namespace: dev
  6. spec:
  7.   containers:
  8.   - name: nginx
  9.     image: nginx:1.17.1
  10.     volumeMounts: # 将secret挂载到目录
  11.     - name: config
  12.       mountPath: /secret/config
  13.   volumes:
  14.   - name: config
  15.     secret:
  16.       secretName: secret
复制代码
  1. # 创建pod
  2. [root@k8s-master01 ~]# kubectl create -f pod-secret.yaml
  3. pod/pod-secret created
  4. # 查看pod
  5. [root@k8s-master01 ~]# kubectl get pod pod-secret -n dev
  6. NAME            READY   STATUS    RESTARTS   AGE
  7. pod-secret      1/1     Running   0          2m28s
  8. # 进入容器,查看secret信息,发现已经自动解码了
  9. [root@k8s-master01 ~]# kubectl exec -it pod-secret /bin/sh -n dev
  10. / # ls /secret/config/
  11. password  username
  12. / # more /secret/config/username
  13. admin
  14. / # more /secret/config/password
  15. 123456
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表