存储卷类型

Kubernetes提供的存储卷(volume)属于Pod资源,共享于Pod内的所有容器,存储卷可在容器的文件系统之外存储相关的数据,也可以独立于Pod的生命周期实现数据持久化存储。

按照类型划分,大致分为三类:

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

详细说明

1. EmptyDir

EmptyDir字面意思理解为空目录。在容器启动时被创建,在容器移除时一并删除,因此不具有持久化存储的能力,但是如果作为同一个Pod内的多个容器间共享文件,或者作为容器数据的临时存储目录是非常好用的选择。

关键词:生命周期同Pod生命周期;作用域为同一个Pod内。

emptyDir存储卷可用字段主要包含两个:

  • medium:存储介质的类型,可取值为”default”或”Memory”,”default”使用节点的默认存储介质,占用磁盘空间;”Memory”基于RAM的临时文件系统tmpfs,占用内存空间。

  • sizeLimit:当前存储卷的空间限额,默认值为nil,表示不限制;一般在medium字段值为”Memory”时需要限制。

2. HostPaht

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.yamlapiVersion: v1data:redis.conf: |appendonly yesnginx.conf: |welcome nginxproject:edspkind: ConfigMapmetadata:name: my-confnamespace: default
[root@k8s-master test]# kubectl apply -f my-config.yaml configmap/my-conf created[root@k8s-master test]# kubectl get cmNAME DATA AGEkube-root-ca.crt 111dmy-conf310s[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]# lspassworduser[root@k8s-master secret]#
kubectl create secret generic db-user-pass \--from-file=user \--from-file=password
# 获取内容查看[root@k8s-master secret]# kubectl get secretsNAMETYPEDATA AGEdb-user-passOpaque27sdefault-token-dp677 kubernetes.io/service-account-token 311d[root@k8s-master secret]# kubectl get secrets db-user-pass -o=yamlapiVersion: v1data:password: eHhjanhuMTIzNDU=user: amlhbmd4aWFvbmFukind: Secretmetadata:creationTimestamp: "2022-07-20T14:47:10Z"managedFields:name: db-user-passnamespace: defaultresourceVersion: "140362"uid: 92095b33-385e-48a9-8418-ee5d86817cc3type: Opaque[root@k8s-master secret]# echo eHhjanhuMTIzNDU= | base64 -dxxcjxn12345[root@k8s-master secret]# 

data是所有真正的数据。

4. PV&PVC

PV&PVC是基于文件系统存在的,我们这里使用NFS文件系统,独立于Pod的生命周期实现数据的持久化存储。

NFS文件系统自行安装,这里只准备pv和pvc。

# pv.yamlapiVersion: v1kind: PersistentVolumemetadata:name: pv01-10mspec:capacity:storage: 1GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/01server: 172.31.0.2
# pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:name: nginx-pvcspec:accessModes:- ReadWriteManyresources:requests:storage: 500MistorageClassName: nfs
[root@k8s-master test]# kubectl get pv,pvcNAMECAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpersistentvolume/pv01-10m 1GiRWXRetain Bounddefault/nginx-pvc nfs 11dNAMESTATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpersistentvolumeclaim/nginx-pvc Boundpv01-10m 1GiRWXnfs11d[root@k8s-master test]# 

完整配置演示

# deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:labels:app: nginx-deployname: nginx-deployspec: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 podNAME READY STATUSRESTARTS AGEnginx-deploy-744dfb6ff-f4px5 1/1 Running 056snginx-deploy-744dfb6ff-zk5zf 1/1 Running 058s[root@k8s-master test]# 

检查验证

进入到容器内部进行验证。

[root@k8s-master test]# kubectl exec -it nginx-deploy-744dfb6ff-f4px5 -c mynginx -- /bin/bashroot@nginx-deploy-744dfb6ff-f4px5:/# cd /sams/root@nginx-deploy-744dfb6ff-f4px5:/sams# lsemptydirhostpahtnginxnginx.confredis.confroot@nginx-deploy-744dfb6ff-f4px5:/sams# 
  1. EmptyDir
root@nginx-deploy-744dfb6ff-f4px5:/sams# cd /sams/emptydir/test/root@nginx-deploy-744dfb6ff-f4px5:/sams/emptydir/test# pwd/sams/emptydir/testroot@nginx-deploy-744dfb6ff-f4px5:/sams/emptydir/test# 

EmptyDir挂载成功。

  1. 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.txtroot@nginx-deploy-744dfb6ff-f4px5:/sams/hostpaht/test# lshostpaht.txtroot@nginx-deploy-744dfb6ff-f4px5:/sams/hostpaht/test# 
# 查看nginx-deploy-744dfb6ff-f4px5所在的节点为k8s-worker1[root@k8s-master /]# kubectl describe pod nginx-deploy-744dfb6ff-f4px5...Events:TypeReason Age From Message---------- -------- -------NormalScheduled15m default-schedulerSuccessfully assigned default/nginx-deploy-744dfb6ff-f4px5 to k8s-worker1NormalPulled 15m kubeletContainer image "nginx" already present on machineNormalCreated15m kubeletCreated container mynginxNormalStarted15m kubeletStarted container mynginx[root@k8s-master /]# 
# 到 k8s-worker1 验证[root@k8s-worker1 test]# pwd/sams/hostPaht/test[root@k8s-worker1 test]# lltotal 0-rw-r--r-- 1 root root 0 Jul 21 00:39 hostpaht.txt[root@k8s-worker1 test]# 

存在/sams/hostPaht/test文件夹,并且hostpaht.txt同样存在,HostPaht挂载成功。

  1. ConfigMap&Secret
root@nginx-deploy-744dfb6ff-f4px5:/sams# cat redis.conf appendonly yesroot@nginx-deploy-744dfb6ff-f4px5:/sams# cat nginx.conf welcome nginxroot@nginx-deploy-744dfb6ff-f4px5:/sams# echo $projectedsproot@nginx-deploy-744dfb6ff-f4px5:/sams# echo $userjiangxiaonanroot@nginx-deploy-744dfb6ff-f4px5:/sams#

ConfigMap挂载成功,Secret配置引用成功。

  1. PV&PVC
root@nginx-deploy-744dfb6ff-f4px5:/sams# cd nginxroot@nginx-deploy-744dfb6ff-f4px5:/sams/nginx# touch aaa.txtroot@nginx-deploy-744dfb6ff-f4px5:/sams/nginx# 
# 到NFS文件系统查看[root@k8s-master test]# cd /nfs/data/01[root@k8s-master 01]# lsaaa.txt[root@k8s-master 01]#

pvc挂载成功。

本文由mdnice多平台发布