马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
『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
- apiVersion: v1
- kind: Pod
- metadata:
- name: volume-emptydir
- namespace: dev
- spec:
- containers:
- - name: nginx
- image: nginx:1.17.1
- ports:
- - containerPort: 80
- volumeMounts: # 将logs-volume挂在到nginx容器中,对应的目录为 /var/log/nginx
- - name: logs-volume
- mountPath: /var/log/nginx
- - name: busybox
- image: busybox:1.30
- command: ["/bin/sh","-c","tail -f /logs/access.log"] # 初始命令,动态读取指定文件中内容
- volumeMounts: # 将logs-volume 挂在到busybox容器中,对应的目录为 /logs
- - name: logs-volume
- mountPath: /logs
- volumes: # 声明volume, name为logs-volume,类型为emptyDir
- - name: logs-volume
- emptyDir: {}
复制代码- # 创建Pod
- [root@k8s-master01 ~]# kubectl create -f volume-emptydir.yaml
- pod/volume-emptydir created
- # 查看pod
- [root@k8s-master ~]# kubectl get pods volume-emptydir -n dev -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- volume-emptydir 2/2 Running 0 4s 10.244.169.131 k8s-node2 <none> <none>
- # 通过podIp访问nginx
- [root@k8s-master01 ~]# curl 10.42.2.9
- ......
- # 通过kubectl logs命令查看指定容器的标准输出
- [root@k8s-master ~]# kubectl logs -f volume-emptydir -n dev -c busybox
- 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
- apiVersion: v1
- kind: Pod
- metadata:
- name: volume-hostpath
- namespace: dev
- spec:
- containers:
- - name: nginx
- image: nginx:1.17.1
- ports:
- - containerPort: 80
- volumeMounts:
- - name: logs-volume
- mountPath: /var/log/nginx
- - name: busybox
- image: busybox:1.30
- command: ["/bin/sh","-c","tail -f /logs/access.log"]
- volumeMounts:
- - name: logs-volume
- mountPath: /logs
- volumes:
- - name: logs-volume
- hostPath:
- path: /root/logs
- type: DirectoryOrCreate # 目录存在就使用,不存在就先创建后使用
复制代码- DirectoryOrCreate 目录存在就使用,不存在就先创建后使用
- Directory 目录必须存在
- FileOrCreate 文件存在就使用,不存在就先创建后使用
- File 文件必须存在
- Socket unix 套接字必须存在
- CharDevice 字符设备必须存在
- BlockDevice 块设备必须存在
复制代码- # 创建Pod
- [root@k8s-master01 ~]# kubectl create -f volume-hostpath.yaml
- pod/volume-hostpath created
- # 查看Pod
- [root@k8s-master ~]# kubectl get pods volume-hostpath -n dev -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- volume-hostpath 2/2 Running 0 5s 10.244.169.130 k8s-node2 <none> <none>
- #访问nginx
- [root@k8s-master01 ~]# curl 10.244.169.130
- [root@k8s-master01 ~]# kubectl logs -f volume-hostpath -n dev -c busybox
- # 接下来就可以去host的/root/logs目录下查看存储的文件了
- ### 注意: 下面的操作需要到Pod所在的节点运行(案例中是node2)
- [root@k8s-node2 ~]# ls /root/logs/
- access.log error.log
- # 同样的道理,如果在此目录下创建一个文件,到容器中也是可以看到的
复制代码 NFS
- HostPath 可以办理数据长期化的问题,但是一旦 Node 节点故障了,Pod 如果转移到了别的节点,又会出现问题了,此时需要预备单独的网络存储体系,比较常用的用 NFS、CIFS
- NFS 是一个网络文件存储体系,可以搭建一台 NFS 服务器,然后将 Pod 中的存储直接毗连到 NFS 体系上,如许的话,无论 Pod 在节点上怎么转移,只要 Node 跟 NFS 的对接没问题,数据就可以乐成访问
- 起首要预备 nfs 的服务器,这里为了简单,直接是 master 节点做 nfs 服务器
- # 在nfs上安装nfs服务
- [root@nfs ~]# yum install nfs-utils -y
- # 准备一个共享目录
- [root@nfs ~]# mkdir /root/data/nfs -pv
- # 将共享目录以读写权限暴露给192.168.124.0/24网段中的所有主机
- [root@nfs ~]# vim /etc/exports
- [root@nfs ~]# more /etc/exports
- /root/data/nfs 192.168.124.0/24(rw,no_root_squash)
- # 启动nfs服务
- [root@nfs ~]# systemctl restart nfs
复制代码
- 接下来,要在的每个 node 节点上都安装下 nfs,如许的目标是为了 node 节点可以驱动 nfs 装备
- # 在node上安装nfs服务,注意不需要启动
- [root@k8s-master01 ~]# yum install nfs-utils -y
复制代码
- 接下来,就可以编写 pod 的设置文件了,创建 volume-nfs.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: volume-nfs
- namespace: dev
- spec:
- containers:
- - name: nginx
- image: nginx:1.17.1
- ports:
- - containerPort: 80
- volumeMounts:
- - name: logs-volume
- mountPath: /var/log/nginx
- - name: busybox
- image: busybox:1.30
- command: ["/bin/sh","-c","tail -f /logs/access.log"]
- volumeMounts:
- - name: logs-volume
- mountPath: /logs
- volumes:
- - name: logs-volume
- nfs:
- server: 192.168.124.85 #nfs服务器地址
- path: /root/data/nfs #共享文件路径
复制代码- # 创建pod
- [root@k8s-master01 ~]# kubectl create -f volume-nfs.yaml
- pod/volume-nfs created
- # 查看pod
- [root@k8s-master ~]# kubectl get pods volume-nfs -n dev -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- volume-nfs 2/2 Running 0 48s 10.244.169.139 k8s-node2 <none> <none>
- # 查询网页
- curl 10.244.169.139
- # 查看nfs服务器上的共享目录,发现已经有文件了
- [root@k8s-master01 ~]# ls /root/data/
- 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
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv2
- spec:
- nfs: # 存储类型,与底层真正存储对应
- capacity: # 存储能力,目前只支持存储空间的设置
- storage: 2Gi
- accessModes: # 访问模式
- storageClassName: # 存储类别
- persistentVolumeReclaimPolicy: # 回收策略
复制代码
- 存储类型:底层现实存储的类型,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 环境
- # 创建目录
- [root@nfs ~]# mkdir /root/data/{pv1,pv2,pv3} -pv
- # 暴露服务
- [root@nfs ~]# more /etc/exports
- /root/data/pv1 192.168.124.0/24(rw,no_root_squash)
- /root/data/pv2 192.168.124.0/24(rw,no_root_squash)
- /root/data/pv3 192.168.124.0/24(rw,no_root_squash)
- # 重启服务
- [root@nfs ~]# systemctl restart nfs
复制代码- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv1
- spec:
- capacity:
- storage: 1Gi
- accessModes:
- - ReadWriteMany
- persistentVolumeReclaimPolicy: Retain
- nfs:
- path: /root/data/pv1
- server: 192.168.124.85
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv2
- spec:
- capacity:
- storage: 2Gi
- accessModes:
- - ReadWriteMany
- persistentVolumeReclaimPolicy: Retain
- nfs:
- path: /root/data/pv2
- server: 192.168.124.85
-
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv3
- spec:
- capacity:
- storage: 3Gi
- accessModes:
- - ReadWriteMany
- persistentVolumeReclaimPolicy: Retain
- nfs:
- path: /root/data/pv3
- server: 192.168.124.85
复制代码- # 创建 pv
- [root@k8s-master01 ~]# kubectl create -f pv.yaml
- persistentvolume/pv1 created
- persistentvolume/pv2 created
- persistentvolume/pv3 created
- # 查看pv
- [root@k8s-master01 ~]# kubectl get pv -o wide
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS AGE VOLUMEMODE
- pv1 1Gi RWX Retain Available 10s Filesystem
- pv2 2Gi RWX Retain Available 10s Filesystem
- pv3 3Gi RWX Retain Available 9s Filesystem
复制代码 PVC
- PVC 是资源的申请,用来声明对存储空间、访问模式、存储种别需求信息。下面是资源清单文件
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: pvc
- namespace: dev
- spec:
- accessModes: # 访问模式
- selector: # 采用标签对PV选择
- storageClassName: # 存储类别
- resources: # 请求空间
- requests:
- storage: 5Gi
复制代码
- 访问模式(accessModes):用于形貌用户应用对存储资源的访问权限(留意:这个肯定要和 PV 设置一样)
- 选择条件(selector):通过 Label Selector 的设置,可使 PVC 对于体系中己存在的 PV 举行筛选
- 存储种别(storageClassName):PVC 在界说时可以设定需要的后端存储的种别,只有设置了该 class 的 pv 才华被体系选出
- 资源哀求(Resources):形貌对存储资源的哀求
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: pvc1
- namespace: dev
- spec:
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 1Gi
- ---
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: pvc2
- namespace: dev
- spec:
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 1Gi
- ---
- apiVersion: v1 # 这个肯定申请不成功的
- kind: PersistentVolumeClaim
- metadata:
- name: pvc3
- namespace: dev
- spec:
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 5Gi
复制代码- # 创建pvc
- [root@k8s-master01 ~]# kubectl create -f pvc.yaml
- persistentvolumeclaim/pvc1 created
- persistentvolumeclaim/pvc2 created
- persistentvolumeclaim/pvc3 created
- # 查看pvc
- [root@k8s-master ~]# kubectl get pvc -n dev -o wide
- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
- pvc1 Bound pv1 1Gi RWX 11s Filesystem
- pvc2 Bound pv2 2Gi RWX 11s Filesystem
- pvc3 Pending 11s Filesystem
- # 查看pv
- [root@k8s-master ~]# kubectl get pv -o wide
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
- pv1 1Gi RWX Retain Bound dev/pvc1 135m Filesystem
- pv2 2Gi RWX Retain Bound dev/pvc2 135m Filesystem
- pv3 3Gi RWX Retain Available 135m Filesystem
复制代码- apiVersion: v1
- kind: Pod
- metadata:
- name: pod1
- namespace: dev
- spec:
- containers:
- - name: busybox
- image: busybox:1.30
- command: ["/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;"]
- volumeMounts:
- - name: volume
- mountPath: /root/
- volumes:
- - name: volume
- persistentVolumeClaim:
- claimName: pvc1 # 这里就申明了用哪个 pvc
- readOnly: false
- ---
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod2
- namespace: dev
- spec:
- containers:
- - name: busybox
- image: busybox:1.30
- command: ["/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;"]
- volumeMounts:
- - name: volume
- mountPath: /root/
- volumes:
- - name: volume
- persistentVolumeClaim:
- claimName: pvc2
- readOnly: false
复制代码- # 创建pod
- [root@k8s-master01 ~]# kubectl create -f pods.yaml
- pod/pod1 created
- pod/pod2 created
- # 查看pod
- [root@k8s-master01 ~]# kubectl get pods -n dev -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- pod1 1/1 Running 0 7s 10.244.169.140 k8s-node2 <none> <none>
- pod2 1/1 Running 0 7s 10.244.36.123 k8s-node1 <none> <none>
- # 查看pvc
- [root@k8s-master ~]# kubectl get pvc -n dev -o wide
- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
- pvc1 Bound pv1 1Gi RWX 7m4s Filesystem
- pvc2 Bound pv2 2Gi RWX 7m4s Filesystem
- pvc3 Pending 7m4s Filesystem
- # 查看pv
- [root@k8s-master ~]# kubectl get pv -n dev -o wide
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
- pv1 1Gi RWX Retain Bound dev/pvc1 142m Filesystem
- pv2 2Gi RWX Retain Bound dev/pvc2 142m Filesystem
- pv3 3Gi RWX Retain Available 142m Filesystem
- # 查看nfs中的文件存储
- [root@k8s-master ~]# more /root/data/pv1/out.txt
- pod1
- pod1
- pod1
- pod1
- [root@k8s-master ~]# more /root/data/pv2/out.txt
- pod2
- pod2
- pod2
- 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 才华再次使用
- # 先删除 Pods
- [root@k8s-master ~]# kubectl delete -f pods.yaml
- pod "pod1" deleted
- pod "pod2" deleted
- # 后删除 pvc
- [root@k8s-master ~]# kubectl delete -f pvc.yaml
- persistentvolumeclaim "pvc1" deleted
- persistentvolumeclaim "pvc2" deleted
- persistentvolumeclaim "pvc3" deleted
- # 最后就可以看到效果
- [root@k8s-master ~]# kubectl get pv -n dev -o wide
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
- pv1 1Gi RWX Retain Released dev/pvc1 144m Filesystem
- pv2 2Gi RWX Retain Released dev/pvc2 144m Filesystem
- pv3 3Gi RWX Retain Available 144m Filesystem
复制代码
- 资源回收:kubernetes 根据 pv 设置的回收计谋举行资源的回收。对于 PV,管理员可以设定回收计谋,用于设置与之绑定的 PVC 开释资源之后如那边理处罚遗留数据的问题。只有 PV 的存储空间完成回收,才华供新的 PVC 绑定和使用
设置存储
ConfigMap
- ConfigMap 是一种比较特别的存储卷,它的主要作用是用来存储设置信息的
- 创建 configmap.yaml,内容如下
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: configmap
- namespace: dev
- data:
- info: |
- username:admin
- password:123456
复制代码- # 创建configmap
- [root@k8s-master01 ~]# kubectl create -f configmap.yaml
- configmap/configmap created
- # 查看configmap详情
- [root@k8s-master01 ~]# kubectl describe cm configmap -n dev
- Name: configmap
- Namespace: dev
- Labels: <none>
- Annotations: <none>
- Data
- ====
- info:
- ----
- username:admin
- password:123456
- Events: <none>
复制代码
- 接下来创建一个 pod-configmap.yaml,将上面创建的 configmap 挂载进去
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-configmap
- namespace: dev
- spec:
- containers:
- - name: nginx
- image: nginx:1.17.1
- volumeMounts: # 将configmap挂载到目录
- - name: config
- mountPath: /configmap/config
- volumes: # 引用configmap
- - name: config
- configMap:
- name: configmap
复制代码- # 创建pod
- [root@k8s-master01 ~]# kubectl create -f pod-configmap.yaml
- pod/pod-configmap created
- # 查看pod
- [root@k8s-master01 ~]# kubectl get pod pod-configmap -n dev
- NAME READY STATUS RESTARTS AGE
- pod-configmap 1/1 Running 0 6s
- #进入容器
- [root@k8s-master01 ~]# kubectl exec -it pod-configmap -n dev /bin/sh
- # cd /configmap/config/
- # ls
- info
- # more info
- username:admin
- password:123456
- # 可以看到映射已经成功,每个configmap都映射成了一个目录
- # key--->文件 value---->文件中的内容
- # 此时如果更新configmap的内容, 容器中的值也会动态更新
- kubectl edit cm configmap -n dev # 可以尝试修改一下值后,再去看看变更
复制代码 Secret
- 在 kubernetes 中,还存在一种和 ConfigMap 非常雷同的对象,称为 Secret 对象。它主要用于存储敏感信息,比方暗码、秘钥、证书等等
- 起首使用 base64 对数据举行编码
- [root@k8s-master01 ~]# echo -n 'admin' | base64 #准备username
- YWRtaW4=
- [root@k8s-master01 ~]# echo -n '123456' | base64 #准备password
- MTIzNDU2
复制代码
- 接下来编写 secret.yaml,并创建 Secret
- apiVersion: v1
- kind: Secret
- metadata:
- name: secret
- namespace: dev
- type: Opaque
- data:
- username: YWRtaW4=
- password: MTIzNDU2
复制代码- # 创建secret
- [root@k8s-master01 ~]# kubectl create -f secret.yaml
- secret/secret created
- # 查看secret详情
- [root@k8s-master01 ~]# kubectl describe secret secret -n dev
- Name: secret
- Namespace: dev
- Labels: <none>
- Annotations: <none>
- Type: Opaque
- Data
- ====
- password: 6 bytes
- username: 5 bytes
复制代码
- 创建 pod-secret.yaml,将上面创建的 secret 挂载进去
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-secret
- namespace: dev
- spec:
- containers:
- - name: nginx
- image: nginx:1.17.1
- volumeMounts: # 将secret挂载到目录
- - name: config
- mountPath: /secret/config
- volumes:
- - name: config
- secret:
- secretName: secret
复制代码- # 创建pod
- [root@k8s-master01 ~]# kubectl create -f pod-secret.yaml
- pod/pod-secret created
- # 查看pod
- [root@k8s-master01 ~]# kubectl get pod pod-secret -n dev
- NAME READY STATUS RESTARTS AGE
- pod-secret 1/1 Running 0 2m28s
- # 进入容器,查看secret信息,发现已经自动解码了
- [root@k8s-master01 ~]# kubectl exec -it pod-secret /bin/sh -n dev
- / # ls /secret/config/
- password username
- / # more /secret/config/username
- admin
- / # more /secret/config/password
- 123456
复制代码 |