1,pod异常会重启,或者各种原因导致pod删除,那么之前pod里边存储的数据将会丢失。那么就需要将pod进行数据持久化。
2,不同的pod间可能会共享一些数据,这些数据需要持久化。
为了解决这个问题,官网也给出了一些解决方案,具体可以到 https://kubernetes.io/docs/concepts/storage/volumes/ 了解支持的数据卷类型种类,不同的应用常用使用不同的volume。这里仅简单记录下学习持久化数据卷以及如何使用pv,pvc过程。
个人理解:
volume就是我们所说的数据卷。
pv 就是我们规划好的一个存储集群池
pvc 就是pod申请具体大小的pv,通过pvc来消耗pv里边的资源。
一,常见volume
官网支持的volume比较多,个人认为用到比较多的是云厂商的各种云盘,nas,oss,emptydir ,hostpath等。这里简单记录下epmty,hostpath,nfs(为测试pv以及pvc),其他的云盘,nas,对象存储等具体根据自己厂商阿里云或者aws或其他来单独设置。
1,empty
顾名思义,初始值是一个空目录。用于放置一些临时数据,pod重启或移除后会丢失。
apiVersion: v1 kind: Pod metadata: name: emptydir-pod spec: nodeName: 10.1.14.25 containers: - image: nginx:1.14 name: testemptypod volumeMounts: - mountPath: /test name: cache-volume volumes: - name: cache-volume emptyDir: {}
2,hostpath
顾名思义,将node节点的一个目录或文件挂载到pod上边。这个还是比较常用的。
应用场景:挂载node的/etc/hosts,/etc/localtime时区文件,挂载特定目录或者日志文件等。
yaml文件声明里边volume,主要是name以及hostpath, 容器挂载指定volumemounts挂载的路径以及name即可。
apiVersion: v1 kind: Pod metadata: name: hostpath-pod spec: nodeSelector: role: prod containers: - image: nginx:1.14 name: testhostpath volumeMounts: - mountPath: /usr/share/nginx/html name: wwwroot - mountPath: /etc/hosts name: hosts - mountPath: /etc/localtime name: time-zone volumes: - name: wwwroot hostPath: path: /data type: Directory - name: hosts hostPath: path: /etc/hosts - name: time-zone hostPath: path: /etc/localtime
这里分别挂载了目录 以及node节点的/etc/hosts,/etc/localtime 。创建以后,可以进入pod查看挂载:
root@hostpath-pod:/# cat /usr/share/nginx/html/index.html hello node2 /data root@hostpath-pod:/# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.1.14.21 master01 10.1.14.22 master02 10.1.14.23 etcd01 10.1.14.24 etcd02 10.1.14.25 node01 10.1.14.26 node02 10.1.14.27 mastercluster
3,nfs
搭建过程不详细阐述,只记录快速配置
master安装:yum install -y nfs-utils rpcbind mkdir -p /data/wwwroot/test echo "hello nfs server"> /data/wwwroot/test/index.html 注意配置/etc/exports: /data/wwwroot/test 10.1.14.0/24(rw,no_root_squash,no_all_squash,sync) node安装: yum install -y nfs-utils
配置完以后将其服务都启动。
具体参数可以参考: https://blog.csdn.net/shenhonglei1234/article/details/80827570
测试yamal如下:
[root@master01 volume]# cat nfsvolume.yaml apiVersion: v1 kind: Pod metadata: name: nfs-pod spec: nodeName: 10.1.14.25 containers: - image: nginx:1.14 name: testnfspod volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html volumes: - name: wwwroot nfs: server: 10.1.14.17 path: /data/wwwroot/test
创建以后访问pod:
[root@node01 data]# curl 172.50.4.8 hello nfs server
二,持久化数据卷pv
PersistentVolume 持久卷,简称PV,对存储的具体实现,供集群使用。
创建nfs pv:
[root@master01 volume]# cat nfs-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv-wwwroot spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /data/wwwroot/test server: 10.1.14.17 --- apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv-log spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /data/wwwroot/test server: 10.1.14.17
创建以后查看pv情况:
[root@master01 volume]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfs-pv-log 10Gi RWX Retain Available 4s nfs-pv-wwwroot 5Gi RWX Retain Available 9s
参数说明:
(1)访问模式
spec:
capacity:
storage: 10Gi #容量
accessModes: #访问模式
– ReadWriteMany
访问模式有三种:
ReadWriteOnce #可读写仅一次
ReadOnlyMany #只读
ReadWriteMany #可读写
(2)回收策略
pv可以设置三种回收策略:Retain(默认),Recycle和Delete。
– retain:允许人工处理保留的数据。
– recycle:将执行清除操作,之后可以被新的pvc使用,需要插件支持
– delete:将删除pv和外部关联的存储资源,需要插件支持。
网上资料:目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。
(3)pv状态
Available: pv可用
Bound: pv已被绑定到某pvc
Released: pv已经被释放,但需要手工处理
Faild:pv不可用
三,持久化数据卷申请pvc
persistentvolumeclaim 持久卷申请简称PVC,消费具体的pv,相当于拆分了配额的存储模块。
pod申请pvc作为卷来使用,集群通过pvc查找绑定的pv,达到pod通过指定pvc name间接把数据卷给挂载了。
[root@master01 volume]# cat nfs-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wwwroot-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: log-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi
create以后查看状态:
[root@master01 volume]# kubectl get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/nfs-pv-log 10Gi RWX Retain Bound default/log-pvc 6m32s persistentvolume/nfs-pv-wwwroot 5Gi RWX Retain Bound default/wwwroot-pvc 6m32s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/log-pvc Bound nfs-pv-log 10Gi RWX 5m58s persistentvolumeclaim/wwwroot-pvc Bound nfs-pv-wwwroot 5Gi RWX 5m58s
pvc匹配pv的时候,根据容量以及读写模式来就近匹配。 有了pvc以后,pod就可以直接用来使用了。
创建pod测试下pvc:
[root@master01 volume]# cat pod-pvc.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pvc-nfs spec: containers: - name: testnginxpvfnfs image: nginx:1.14 volumeMounts: - mountPath: /usr/share/nginx/html name: wwwroot volumes: - name: wwwroot persistentVolumeClaim: claimName: wwwroot-pvc
创建并进入带容器:
root@nginx-pvc-nfs:/usr/share/nginx/html# df -h Filesystem Size Used Avail Use% Mounted on overlay 36G 3.3G 32G 10% / tmpfs 64M 0 64M 0% /dev tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos-root 36G 3.3G 32G 10% /etc/hosts shm 64M 0 64M 0% /dev/shm 10.1.14.17:/data/wwwroot/test 36G 3.3G 32G 10% /usr/share/nginx/html
挂载依旧是成功的。
参考文章:
1,搭建NFS服务 ,并在Kubernetes挂载NFS https://blog.csdn.net/shenhonglei1234/article/details/80827570
2,Kubernetes Pv & Pvc https://www.jianshu.com/p/fda9de00ba5f