k8s数据存储

打印 上一主题 下一主题

主题 866|帖子 866|积分 2598

目录

一、引言

容器的生命周期可能很短,会被频繁地创建和烧毁。容器在烧毁时,保存在容器中的数据也会被扫除。这种结果对用户来说,在某些环境下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。
Volume是Pod中能够被多个container访问的共享目录。它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下。Kubernetes通过Volume实现:

  • 同一个Pod中差别容器之间的数据共享
  • 数据的持久化存储。
Volume的生命周期不与Pod中单个container的生命周期相关联。当container停止或重启时,Volume中的数据也不会丢失。
Kubernetes的Volume支持多种类型,常见的有:

  • 简单存储:EmptyDir、HostPath、NFS
  • 高级存储:PV、PVC
  • 配置存储:ConfigMap、Secret
二、基本存储

1、EmptyDir

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

  • 临时空间,比方用于某些应用步伐运行时所需的临时目录,且无需永久保留
  • 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)
  • 缓存空间,比方基于磁盘的归并排序。
  • 为耗时较长的盘算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
1.1、示例

下面演示一个示例:在一个Pod中准备2个容器:nginx和busybox,然后声明一个Volume分别挂在2个容器的目录中。Nginx负责向Volume中写日志,busybox中通过命令将日志内容读到控制台。
如下图所示:

1.2、创建资源清单

volume-emptydir.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.    name: volume-emptydir
  5.    namespace: default
  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.      emptyDir: {}
复制代码
1.3、创建Pod
  1. kubectl apply -f volume-emptydir.yaml
复制代码

1.4、查看Pod
  1. kubectl get pods -o wide
复制代码

1.5、通过PodIP访问nginx
  1. curl 10.244.2.10
复制代码

1.6、查看容器的标准输出
  1. kubectl logs -f volume-emptydir -n default -c busybox
复制代码

2、HostPath

上面EmptyDir提到,EmptyDir中数据不会被持久化,它会随着Pod的竣事而烧毁,假如想简单的将数据持久化到主机中,可以选择HostPath。
HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器利用,如许的计划就可以保证Pod烧毁了,但是数据依据可以存在于Node主机上。

2.1、创建资源清单

volume-hostpath.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: volume-hostpath
  5.   namespace: default
  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  # 目录存在就使用,不存在就先创建后使用
复制代码
2.2、.spec.volumes
  • .hostPath.type

    关于type类型的说明:
    类型说明DirectoryOrCreate目录存在就利用,不存在就先创建Directory目录必须存在FileOrCreate文件存在就利用,不存在就先创建File文件必须存在Socketunix套接字必须存在CharDevice字符装备必须存在BlockDevice块装备必须存在2.3、创建Pod
    1. kubectl apply -f volume-hostpath.yaml
    复制代码

    2.4、查看Pod
    1. kubectl get pods -n default -o wide
    复制代码

    2.5、通过PodIP访问nginx
    1. curl 10.244.1.9
    复制代码

    2.6、到host的/root/logs目录下查看存储的文件

    下面的操纵需要到Pod所在的节点运行(案例中是k8s-node1)
    1. tail -f /root/logs/access.log
    复制代码

    2.7、host下创建文件观察容器内部变化
    1. echo "hello HostPath" > test
    复制代码
    在host本地创建文件验证同步
    分别进入nginx和busybox容器查看
    2.8、删除Pod观察host本地文件是否存在
    1. kubectl delete pods volume-hostpath -n default
    复制代码

    3、NFS

    HostPath可以解决数据持久化的问题,但是一旦Node节点故障了,Pod假如转移到了别的节点,又会出现问题了(会有新的hostpath volume在别的Node创建,但是原来的数据丢失了),此时需要准备单独的网络存储系统,比力常用的用NFS、CIFS。
    NFS是一个网络文件存储系统,可以搭建一台NFS服务器,然后将Pod中的存储直接连接到NFS系统上,如许的话,无论Pod在节点上怎么转移,只要Node跟NFS的对接没问题,数据就可以成功访问。

    3.1、准备NFS服务器

    3.1.1、master节点安装nfs服务

    master节点做nfs服务器
    1. yum install -y nfs-utils
    复制代码
    3.1.2、准备一个共享目录
    1. mkdir -pv /root/data/nfs
    复制代码
    3.1.3、将共享目录以读写权限袒露给同一网段中的所有主机
    1. echo "/root/data/nfs 192.168.112.0/24(rw,sync,no_subtree_check)" >> /etc/exports
    复制代码
    3.1.4、启动nfs服务
    1. systemctl start nfs && systemctl enable nfs
    复制代码
    3.2、每个节点安装nfs

    不需要启动
    1. yum install -y nfs-utils
    复制代码
    3.3、编写资源清单

    volume-nfs.yaml
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: volume-nfs
    5.   namespace: default
    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.112.10  #nfs服务器地址
    25.         path: /root/data/nfs #共享文件路径
    复制代码
    3.4、创建Pod
    1. kubectl apply -f volume-nfs.yaml
    复制代码

    3.5、查看Pod
    1. kubectl get pods -o wide
    复制代码

    3.6、通过PodIP访问nginx
    1. curl 10.244.2.3
    复制代码

    3.7、查看nfs服务器的共享目录
    1. cd /root/data/nfs && ls
    2. cat access.log
    复制代码

    三、高级存储

    1、引言

    为了能够屏蔽底层存储实现的细节,方便用户利用,kubernetes引入了PV和PVC两种资源对象。
    持久卷(PersistentVolume,PV)是集群中由管理员配置的一段网络存储。它是集群中的资源,就像节点是集群资源一样。一样平常环境下PV由kubernetes管理员举行创建和配置,它与底层具体的共享存储技能有关。PV持久卷和普通的Volume一样,也是利用卷插件来实现的,只是它们拥有独立于任何利用PV的Pod的生命周期。此API对象捕获存储实现的详细信息,包罗NFS,iSCSI或特定于云提供步伐的存储系统。
    持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与Pod类似。Pod会耗用节点资源,而PVC申了解耗用PV资源。Pod可以请求特定命量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 。

    对于用户来说,只提存储需求(PVC),专业的具体存储配置细节(PV)由管理员完成。
    利用了PV和PVC后,工作可以进一步细分:

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

    PV是存储资源的抽象
    2.1、资源清单
    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4.   name: nfs-pv
    5. spec:
    6.   capacity:
    7.     storage: 10Gi
    8.   volumeMode: Filesystem
    9.   accessModes:
    10.     - ReadWriteMany
    11.   persistentVolumeReclaimPolicy: Retain
    12.   storageClassName: nfs-storage
    13.   mountOptions:
    14.     - hard
    15.     - nfsvers=4.1
    16.   nfs:
    17.     path: /nfs/data
    18.     server: nfs-server.example.com
    复制代码
    2.2、字段解释


    • apiVersion: Kubernetes API 版本,这里是 v1。
    • kind: 资源类型,这里是 PersistentVolume。
    • metadata: PV 的元数据,包罗名称。
    • spec: PV 的具体规格。

      • capacity: PV 的容量大小。
      • volumeMode: PV 的模式,这里为 Filesystem 表示这是一个文件系统类型的 PV。
      • accessModes: PV 的访问模式列表。
      • persistentVolumeReclaimPolicy: 当 PV 不再被任何 PVC 利用时的回收策略。
      • storageClassName: PV 所属的存储类名称,可以为空表示无类。
      • mountOptions: NFS 挂载选项。
      • nfs: NFS 具体配置。
      • path: 在 NFS 服务器上的路径。
      • server: NFS 服务器的地点

    2.3、核心概念

    2.3.1、访问模式(accessModes)

    用于描述用户应用对存储资源的访问权限,访问权限包罗


    • ReadWriteOnce(RWO):只仅允许单个节点以读写方式挂载
    • ReadOnlyMany(ROX):可以被很多节点以只读方式挂载
    • ReadWriteMany(RWX):可以被很多节点以只读方式挂载
    • ReadWriteOncePod(RWOP k8s v1.29):卷可以被单个 Pod 以读写方式挂载。
    2.3.2、回收策略(persistentVolumeReclaimPolicy)


    • Retain:保留,该策略允许手动回收资源,当删除PVC时,PV仍旧存在,PV被视为已释放,管理员可以手动回收卷。
    • Delete:删除,假如Volume插件支持,删除PVC时会同时删除PV,动态卷默认为Delete,目前支持Delete的存储后端包罗AWS EBS,GCE PD,Azure Disk,OpenStack Cinder等。
    • Recycle:回收,假如Volume插件支持,Recycle策略会对卷执行rm -rf清理该PV,并使其可用于下一个新的PVC,但是本策略将来会被弃用,目前只有NFS和HostPath支持该策略。
    2.3.3、状态


    • Available,表示pv已经创建正常,处于可用状态;
    • Bound,表示pv已经被某个pvc绑定,留意,一个pv一旦被某个pvc绑定,那么该pvc就独占该pv,其他pvc不能再与该pv绑定;
    • Released,表示pvc被删除了,pv状态就会酿成已释放;
    • Failed,表示pv的主动回收失败;
    2.4、利用NFS作为存储,演示PV的利用

    2.4.1、准备NFS环境


    • 创建目录
    1. mkdir -pv /root/data/pv{1..3}
    复制代码


    • 袒露服务
    1. echo -e "/root/data/pv1\t192.168.112.0/24(rw,no_root_squash)\n/root/data/pv2\t192.168.112.0/24(rw,no_root_squash)\n/root/data/pv3\t192.168.112.0/24(rw,no_root_squash)" > /root/data/nfs_exports
    复制代码


    • 重启nfs服务
    1. systemctl restart nfs
    复制代码
    2.4.2、编写资源清单

    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.112.10
    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.112.10
    28. ---
    29. apiVersion: v1
    30. kind: PersistentVolume
    31. metadata:
    32.   name:  pv3
    33. spec:
    34.   capacity:
    35.     storage: 3Gi
    36.   accessModes:
    37.     - ReadWriteMany
    38.   persistentVolumeReclaimPolicy: Retain
    39.   nfs:
    40.     path: /root/data/pv3
    41.     server: 192.168.112.10
    复制代码
    2.4.3、创建PV
    1. kubectl apply -f pv.yaml
    复制代码

    2.4.4、查看PV
    1. kubectl get pv -o wide
    复制代码

    3、PVC

    PVC作为用户对存储资源的需求申请,主要包罗存储空间请求、访问模式、PV选择条件和存储类别等信息的设置。
    3.1、资源清单
    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4.   name: myclaim
    5. spec:
    6.   accessModes:
    7.     - ReadWriteOnce
    8.   volumeMode: Filesystem
    9.   resources:
    10.     requests:
    11.       storage: 8Gi
    12.   storageClassName: slow
    13.   selector:
    14.     matchLabels:
    15.       release: "stable"
    16.     matchExpressions:
    17.       - {key: environment, operator: In, values: [dev]}
    复制代码
    3.2、字段解释


    • apiVersion: Kubernetes API 版本,这里是 v1。
    • kind: 资源类型,这里是 PersistentVolumeClaim。
    • metadata:

      • name: PVC 的名称,这里是 myclaim。

    • spec: PVC 的具体规格。

      • accessModes: PVC 请求的访问模式列表。这里请求的是 ReadWriteOnce,意味着 PVC 只能被单个节点以读写方式挂
      • volumeMode: PVC 请求的 PV 的模式,这里为 Filesystem 表示这是一个文件系统类型的 PV。
      • resources:

        • requests: PVC 请求的资源量,这里是 storage: 8Gi,即请求 8GiB 的存储空间。

      • storageClassName: PVC 请求的存储类名称,这里是 slow。假如未指定,则利用默认存储类。
      • selector: PVC 可以选择特定的 PV。假如指定,PVC 只能绑定到符合这些选择器条件的 PV。

        • matchLabels: 标签选择器。这里的 PVC 将仅绑定到带有标签 release: stable 的 PV。
        • matchExpressions: 表达式选择器。这里的 PVC 将仅绑定到带有标签 environment 并且值为 dev 的 PV。


    3.3、示例

    3.3.1、编写PVC资源清单,申请PV

    pvc.yaml
    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4.   name: pvc1
    5.   namespace: default
    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: default
    18. spec:
    19.   accessModes:
    20.     - ReadWriteMany
    21.   resources:
    22.     requests:
    23.       storage: 3Gi
    24. ---
    25. apiVersion: v1
    26. kind: PersistentVolumeClaim
    27. metadata:
    28.   name: pvc3
    29.   namespace: default
    30. spec:
    31.   accessModes:
    32.     - ReadWriteMany
    33.   resources:
    34.     requests:
    35.       storage: 5Gi
    复制代码
    3.3.2、创建PVC
    1. kubectl applpy -f pvc.yaml
    复制代码

    3.3.3、查看PVC
    1. kubectl get pvc -o wide
    复制代码

    3.3.4、查看PV
    1. kubectl get pv -o wide
    复制代码

    3.3.5、编写Pod资源清单,利用PVC

    pods.yaml
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: pod1
    5.   namespace: default
    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
    18.         readOnly: false
    19. ---
    20. apiVersion: v1
    21. kind: Pod
    22. metadata:
    23.   name: pod2
    24.   namespace: default
    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
    复制代码
    3.3.6、创建Pod
    1. kubectl apply -f pods.yaml
    复制代码

    3.3.7、查看Pod,PVC,PV
    1. kubectl get pods,pvc,pv -o wide
    复制代码

    3.3.8、查看nfs中的文件存储
    1. cat /root/data/pv1/out.txt
    2. cat /root/data/pv2/out.txt
    3. cat /root/data/pv3/out.txt
    复制代码
    /root/data/pv1/out.txt
    /root/data/pv2/out.txt
    /root/data/pv3/out.txt
    Pod1 利用了 PVC1,PVC1 绑定了 PV1。因此,Pod1 写入的文件位于 /root/data/pv1/out.txt。
    Pod2 利用了 PVC2,PVC2 绑定了 PV3。因此,Pod2 写入的文件位于 /root/data/pv3/out.txt。
    PV2 未被利用,因此 /root/data/pv2/out.txt 文件不存在。
    3.3.9、删除pod和pvc,查看pv状态
    1. kubectl delete -f pods.yaml
    2. kubectl delete -f pvc.yaml
    3. kubectl get pv -o wide
    复制代码

    3.4、生命周期

    PVC和PV是一一对应的,PV和PVC之间的相互作用遵循以下生命周期
    1、资源供应:管理员手动创建底层存储和PV
    2、资源绑定:用户创建PVC,kubernetes负责根据PVC的声明去探求PV,并绑定在用户定义好PVC之后,系统将根据PVC对存储资源的请求在已存在的PV中选择一个满足条件的

    • 一旦找到,就将该PV与用户定义的PVC举行绑定,用户的应用就可以利用这个PVC了。PV一旦绑定到某个PVC上,就会被这个PVC独占,不能再与其他PVC举行绑定了
    • 假如找不到,PVC则会无穷期处于Pending状态,直到等到系统管理员创建了一个符合其要求的PV
    3、资源利用:用户可在pod中像volume一样利用pvc
    Pod利用Volume的定义,将PVC挂载到容器内的某个路径举行利用。
    4、资源释放:用户删除pvc来释放pv
    当存储资源利用完毕后,用户可以删除PVC,与该PVC绑定的PV将会被标志为“已释放”,但还不能立即与其他PVC举行绑定。通过之前PVC写入的数据可能还被留在存储装备上,只有在扫除之后该PV才能再次利用。
    5、资源回收:kubernetes根据pv设置的回收策略举行资源的回收
    对于PV,管理员可以设定回收策略,用于设置与之绑定的PVC释放资源之后如那边置惩罚遗留数据的问题。只有PV的存储空间完成回收,才能供新的PVC绑定和利用

    四、配置存储

    1、ConfigMap

    ConfigMap 是 Kubernetes 中的一种 API 对象,用于存储非敏感的配置数据。它允许开辟者将配置数据与应用步伐容器分离,从而使得配置可以在不重新构建容器镜像的环境下举行更改。ConfigMap 可以存储简单的键值对大概一组文件,并且可以通过多种方式被应用步伐容器访问。
    1.1、资源清单
    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4.   name: game-demo
    5. data:
    6.   # 类属性键;每一个键都映射到一个简单的值
    7.   player_initial_lives: "3"
    8.   ui_properties_file_name: "user-interface.properties"
    9.   # 类文件键
    10.   game.properties: |
    11.     enemy.types=aliens,monsters
    12.     player.maximum-lives=5   
    13.   user-interface.properties: |
    14.     color.good=purple
    15.     color.bad=yellow
    16.     allow.textmode=true   
    复制代码
    1.2、字段解释

    apiVersion: v1

    • 说明: 指定 ConfigMap 的 API 版本。在这个例子中,我们利用的是 Kubernetes API 的第一个版本。
    kind: ConfigMap

    • 说明: 指定此资源的类型为 ConfigMap。
    metadata:

    • 说明: 包含元数据信息,比如名称。

      • name: game-demo

        • 说明: ConfigMap 的名称。在同一个命名空间内必须唯一。


    data:

    • 说明: 存储配置数据的部分,支持键值对的情势。

      • player_initial_lives: "3"

        • 说明: 一个键值对,键为 player_initial_lives,值为 "3"。这个键值对表示玩家初始的生命值为 3。

      • ui_properties_file_name: "user-interface.properties"

        • 说明: 一个键值对,键为 ui_properties_file_name,值为 "user-interface.properties"。这个键值对表示 UI 属性文件的名称。

      • game.properties: |

        • 说明: 一个多行配置文件的示例。这里利用了 YAML 的|符号来表示一个块文本(block text),允许你直接嵌入多行文本而不必利用换行符。

          • enemy.types=aliens,monsters

            • 说明: 表示仇人类型为外星人和怪物。

          • player.maximum-lives=5

            • 说明: 表示玩家的最大生命值为 5。



      • user-interface.properties: |

        • 说明: 另一个多行配置文件的示例。

          • color.good=purple

            • 说明: 表示好的颜色为紫色。

          • color.bad=yellow

            • 说明: 表示坏的颜色为黄色。

          • allow.textmode=true

            • 说明: 表示是否允许文本模式。




    1.3、利用场景

    官方示例的 ConfigMap 可以通过多种方式被 Pod 利用
    1.3.1、作为环境变量
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: my-pod
    5. spec:
    6.   containers:
    7.   - name: my-container
    8.     image: my-image
    9.     env:
    10.     - name: PLAYER_INITIAL_LIVES
    11.       valueFrom:
    12.         configMapKeyRef:
    13.           name: game-demo
    14.           key: player_initial_lives
    15.     - name: UI_PROPERTIES_FILE_NAME
    16.       valueFrom:
    17.         configMapKeyRef:
    18.           name: game-demo
    19.           key: ui_properties_file_name
    复制代码
    1.3.2、挂载为文件
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: my-pod
    5. spec:
    6.   containers:
    7.   - name: my-container
    8.     image: my-image
    9.     volumeMounts:
    10.     - name: config-volume
    11.       mountPath: /etc/game-demo
    12.     volumes:
    13.     - name: config-volume
    14.       configMap:
    15.         name: game-demo
    复制代码
    1.3.3、挂载为 Volume 中的文件
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: my-pod
    5. spec:
    6.   containers:
    7.   - name: my-container
    8.     image: my-image
    9.     volumeMounts:
    10.     - name: config-volume
    11.       mountPath: /etc/game-demo
    12.     volumes:
    13.     - name: config-volume
    14.       configMap:
    15.         name: game-demo        items:        - key: player_initial_lives          path: player_initial_lives.properties        - key: ui_properties_file_name          path: ui_properties_file_name.properties        - key: game.properties          path: game.properties        - key: user-interface.properties          path: user-interface.properties
    复制代码
    1.4、示例

    1.4.1、编写configmap资源清单
    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4.   name: configmap
    5.   namespace: default
    6. data: # info是key,后面的都是value
    7.   info: | # | 代表保留换行符
    8.     username:admin
    9.     password:123456
    复制代码
    1.4.2、创建ConfigMap
    1. kubectl apply -f configmap.yaml
    复制代码

    1.4.3、查看ConfigMap详细信息
    1. kubectl describe configmap configmap
    复制代码

    1.4.4、编写pod-configmap.yaml,将创建的configmap挂载进去
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: pod-configmap
    5.   namespace: default
    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 # 注意这里的name就是上面创建好的configmap
    复制代码
    1.4.5、创建Pod,并进入容器查看
    1. kubectl apply -f pod-configmap.yaml
    2. kubectl exec -it pod-configmap -c nginx /bin/bash
    3. cd configmap/config/ && ls && cat info
    复制代码

    可以看到映射已经成功,每个configmap都映射成了一个目录
    key--->文件     value---->文件中的内容
    1.4.6、在线修改configmap的内容,查看容器中变化
    1. kubectl edit configmap configmap
    2. kubectl exec -it pod-configmap -c nginx /bin/bash
    3. cd configmap/config/ && ls && cat change info
    复制代码
    kubectl edit 在线修改ConfigMap
    进入到容器查看内容变化
    2、Secret

    在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。用于存储敏感信息,如密码、密钥和其他秘密数据。Secret 的计划目的是为了安全地管理这些敏感信息,避免它们被硬编码到配置文件或源代码中。
    2.1、Secret的类型

    创建 Secret 时,你可以利用 Secret 资源的 type 字段,大概与其等价的 kubectl 命令行参数(假如有的话)为其设置类型。 Secret 类型有助于对 Secret 数据举行编程处置惩罚。
    Kubernetes 提供若干种内置的类型,用于一些常见的利用场景。 针对这些类型,Kubernetes 所执行的合法性检查操纵以及对其所实行的限制各不相同。
    内置类型用法Opaque用户定义的任意数据kubernetes.io/service-account-token服务账命令牌kubernetes.io/dockercfg~/.dockercfg 文件的序列化情势kubernetes.io/dockerconfigjson~/.docker/config.json 文件的序列化情势kubernetes.io/basic-auth用于基本身份认证的根据kubernetes.io/ssh-auth用于 SSH 身份认证的根据kubernetes.io/tls用于 TLS 客户端大概服务器端的数据bootstrap.kubernetes.io/token启动引导令牌数据通过为 Secret 对象的 type 字段设置一个非空的字符串值,你也可以定义并利用本身 Secret 类型(假如 type 值为空字符串,则被视为 Opaque 类型)。
    Kubernetes 并不对类型的名称作任何限制。不外,假如你要利用内置类型之一, 则你必须满足为该类型所定义的所有要求。
    假如你要定义一种公开利用的 Secret 类型,请遵守 Secret 类型的约定和结构, 在类型名前面添加域名,并用 / 隔开。 比方:cloud-hosting.example.net/cloud-api-credentials。
    2.2、示例

    2.2.1、利用base64对数据举行编码
    1. echo -n 'root' | base64
    2. echo -n 'zhangsan' | base64
    复制代码

    在创建 Kubernetes Secret 时,利用 -n 参数可以确保 base64 编码的字符串不会包含不必要的换行符,由于换行符可能会导致 base64 编码的结果不精确。
    2.2.2、编写Secret资源清单并创建Secret

    secret.yaml
    1. apiVersion: v1
    2. kind: Secret
    3. metadata:
    4.   name: secret
    5.   namespace: default
    6. type: Opaque
    7. data:
    8.   username: cm9vdA==
    9.   password: emhhbmdzYW4=
    复制代码
    1. kubectl apply -f secret.yaml
    复制代码

    2.2.3、查看secret详情
    1. kubectl get secret secret -o yaml
    复制代码

    2.2.4、创建Pod,将上面创建的Secret挂载上去

    pod-secret.yaml
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4.   name: pod-secret
    5.   namespace: default
    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. kubectl apply -f pod-secret.yaml
    2. kubectl get pods -o wide
    复制代码

    2.2.5、进入容器查看Secret信息
    1. kubectl exec -it pod-secret -- bash
    复制代码


    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
  • 本帖子中包含更多资源

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

    x
    回复

    使用道具 举报

    0 个回复

    倒序浏览

    快速回复

    您需要登录后才可以回帖 登录 or 立即注册

    本版积分规则

    我可以不吃啊

    金牌会员
    这个人很懒什么都没写!

    标签云

    快速回复 返回顶部 返回列表