
作者 | 江小南
来源 | 江小南和他的小伙伴们
存储卷类型
Kubernetes提供的存储卷(volume)属于Pod资源,共享于Pod内的所有容器,存储卷可在容器的文件系统之外存储相关的数据,也可以独立于Pod的生命周期实现数据持久化存储。
按照类型划分,大致分为三类:

如下是工作中使用到的存储卷,持久卷声明对应于持久化数据存储类型。

详细说明
1. EmptyDir
EmptyDir字面意思理解为空目录。在容器启动时被创建,在容器移除时一并删除,因此不具有持久化存储的能力,但是如果作为同一个Pod内的多个容器间共享文件,或者作为容器数据的临时存储目录是非常好用的选择。
关键词:生命周期同Pod生命周期;作用域为同一个Pod内。
emptyDir存储卷可用字段主要包含两个:
- medium:存储介质的类型,可取值为"default"或"Memory","default"使用节点的默认存储介质,占用磁盘空间;"Memory"基于RAM的临时文件系统tmpfs,占用内存空间。 
- sizeLimit:当前存储卷的空间限额,默认值为nil,表示不限制;一般在medium字段值为"Memory"时需要限制。 
2. HostPath
hostPath将目录从工作节点的文件系统挂载到pod中,它独立于Pod的生命周期,因而具有持久性,类似于docker中的-v。但是如果发生pod故障转移等情况,将不能获取到数据,除非数据在所有节点中都有。
关键词:某一工作节点的存储。
hostPath存储卷的嵌套字段共有两个:"path"(必选)和"type",它支持的存储卷类型(type)有如下几种:
- DirectoryOrCreate:宿主机上不存在则创建此目录 
- Directory:宿主机上必须存在此目录 
- FileOrCreate:宿主机上不存在此文件则创建 
- File:宿主机上必须存在此文件 
- Socket:宿主机上必须存在的Socket文件路径 
- CharDevice:宿主机上必须存在的字符设备文件路径 
- BlockDevice:宿主机上必须存在的块设备文件路径 
3. ConfigMap&Secret
ConfigMap和Secret作为配置集,以key-value的形式保存于etcd中,通过存储卷或者配置引用的形式在Pod中使用,区别在于Secret是经过加密的字段显示。示例如下:
# 新建configMap
# my-config.yaml
apiVersion: v1
data:redis.conf: |appendonly yesnginx.conf: |welcome nginxproject:edsp
kind: ConfigMap
metadata:name: my-confnamespace: default[root@k8s-master test]# kubectl apply -f my-config.yaml 
configmap/my-conf created
[root@k8s-master test]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      11d
my-conf            3      10s
[root@k8s-master test]#data是所有真正的数据,key:默认是文件名,value:配置文件的内容。
# 新建secret
[root@k8s-master secret]# echo -n "jiangxiaonan" > user
[root@k8s-master secret]# echo -n "xxcjxn12345" > password
[root@k8s-master secret]# ls
password  user
[root@k8s-master secret]#kubectl create secret generic db-user-pass \--from-file=user \--from-file=password# 获取内容查看
[root@k8s-master secret]# kubectl get secrets
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      7s
default-token-dp677   kubernetes.io/service-account-token   3      11d
[root@k8s-master secret]# kubectl get secrets db-user-pass -o=yaml
apiVersion: v1
data:password: eHhjanhuMTIzNDU=user: amlhbmd4aWFvbmFu
kind: Secret
metadata:creationTimestamp: "2022-07-20T14:47:10Z"managedFields:name: db-user-passnamespace: defaultresourceVersion: "140362"uid: 92095b33-385e-48a9-8418-ee5d86817cc3
type: Opaque
[root@k8s-master secret]# echo eHhjanhuMTIzNDU= | base64 -d
xxcjxn12345
[root@k8s-master secret]#data是所有真正的数据。
4. PV&PVC
PV&PVC是基于文件系统存在的,我们这里使用NFS文件系统,独立于Pod的生命周期实现数据的持久化存储。
NFS文件系统自行安装,这里只准备pv和pvc。
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv01-10m
spec:capacity:storage: 1GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/01server: 172.31.0.2# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nginx-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 500MistorageClassName: nfs[root@k8s-master test]# kubectl get pv,pvc
NAME                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
persistentvolume/pv01-10m   1Gi        RWX            Retain           Bound    default/nginx-pvc   nfs                     11dNAME                              STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nginx-pvc   Bound    pv01-10m   1Gi        RWX            nfs            11d
[root@k8s-master test]#完整配置演示
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-deployname: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-deploytemplate:metadata:labels:app: nginx-deployspec:restartPolicy: Alwayscontainers:- name: mynginximage: nginximagePullPolicy: IfNotPresentenvFrom:- configMapRef:name: my-conf- secretRef:name: db-user-passvolumeMounts:- mountPath: /sams/redis.confname: redisconfsubPath: redis.conf- mountPath: /sams/nginx.confname: nginxconfsubPath: nginx.conf- mountPath: /sams/emptydir/testname: emptydir-test- mountPath: /sams/hostpaht/testname: hostpaht-test- mountPath: /sams/nginxname: my-pvcvolumes:- emptyDir:sizeLimit: 300Miname: emptydir-test- hostPath:path: /sams/hostPaht/testtype: DirectoryOrCreatename: hostpaht-test- configMap:name: my-confname: redisconf- configMap:name: my-confname: nginxconf- name: my-pvcpersistentVolumeClaim:claimName: nginx-pvc通过yaml可以看出,ConfigMap和Secret使用了配置引用的方式在Pod中使用,其余使用挂载。
[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
nginx-deploy-744dfb6ff-f4px5   1/1     Running   0          56s
nginx-deploy-744dfb6ff-zk5zf   1/1     Running   0          58s
[root@k8s-master test]#检查验证
进入到容器内部进行验证。
[root@k8s-master test]# kubectl exec -it nginx-deploy-744dfb6ff-f4px5 -c mynginx -- /bin/bash
root@nginx-deploy-744dfb6ff-f4px5:/# cd /sams/
root@nginx-deploy-744dfb6ff-f4px5:/sams# ls
emptydir  hostpaht  nginx  nginx.conf  redis.conf
root@nginx-deploy-744dfb6ff-f4px5:/sams#- EmptyDir 
root@nginx-deploy-744dfb6ff-f4px5:/sams# cd /sams/emptydir/test/
root@nginx-deploy-744dfb6ff-f4px5:/sams/emptydir/test# pwd
/sams/emptydir/test
root@nginx-deploy-744dfb6ff-f4px5:/sams/emptydir/test#EmptyDir挂载成功。
- HostPaht 
root@nginx-deploy-744dfb6ff-f4px5:/sams/emptydir/test# cd /sams/hostpaht/test/
root@nginx-deploy-744dfb6ff-f4px5:/sams/hostpaht/test# pwd
/sams/hostpaht/test 
root@nginx-deploy-744dfb6ff-f4px5:/sams/hostpaht/test# touch hostpaht.txt
root@nginx-deploy-744dfb6ff-f4px5:/sams/hostpaht/test# ls
hostpaht.txt
root@nginx-deploy-744dfb6ff-f4px5:/sams/hostpaht/test## 查看nginx-deploy-744dfb6ff-f4px5所在的节点为k8s-worker1
[root@k8s-master /]# kubectl describe pod nginx-deploy-744dfb6ff-f4px5
...
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  15m   default-scheduler  Successfully assigned default/nginx-deploy-744dfb6ff-f4px5 to k8s-worker1Normal  Pulled     15m   kubelet            Container image "nginx" already present on machineNormal  Created    15m   kubelet            Created container mynginxNormal  Started    15m   kubelet            Started container mynginx
[root@k8s-master /]## 到 k8s-worker1 验证
[root@k8s-worker1 test]# pwd
/sams/hostPaht/test
[root@k8s-worker1 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jul 21 00:39 hostpaht.txt
[root@k8s-worker1 test]#存在/sams/hostPaht/test文件夹,并且hostpaht.txt同样存在,HostPaht挂载成功。
- ConfigMap&Secret 
root@nginx-deploy-744dfb6ff-f4px5:/sams# cat redis.conf 
appendonly yes
root@nginx-deploy-744dfb6ff-f4px5:/sams# cat nginx.conf 
welcome nginx
root@nginx-deploy-744dfb6ff-f4px5:/sams# echo $project
edsp
root@nginx-deploy-744dfb6ff-f4px5:/sams# echo $user
jiangxiaonan
root@nginx-deploy-744dfb6ff-f4px5:/sams#ConfigMap挂载成功,Secret配置引用成功。
- PV&PVC 
root@nginx-deploy-744dfb6ff-f4px5:/sams# cd nginx
root@nginx-deploy-744dfb6ff-f4px5:/sams/nginx# touch aaa.txt
root@nginx-deploy-744dfb6ff-f4px5:/sams/nginx## 到NFS文件系统查看
[root@k8s-master test]# cd /nfs/data/01
[root@k8s-master 01]# ls
aaa.txt
[root@k8s-master 01]#pvc挂载成功。

往期推荐
Docker 那些事儿:如何安全地停止、删除容器?
掌握 Dowanward API 的妙用,轻松拿捏 kubernetes 环境变量
云原生时代,开发者应具备这5大能力
实战 Kubectl 创建 Deployment 部署应用

点分享

点收藏

点点赞

点在看