作者 | 江小南
来源 | 江小南和他的小伙伴们
存储卷类型
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 部署应用
点分享
点收藏
点点赞
点在看