kubernetes持久化存储
一、nfs网络存储
kubenetes集群中如果某个节点宕掉了,那么Pod就会漂移到其它节点,此时Pod是一个全新的状态,为了Pod可以使用之前的数据,那么需要将数据进行持久化,以便新的Pod可以继续使用。
1、安装nfs服务器
参考NFS网络文件共享服务 文章,有NFS服务的详细安装与使用,进行nfs的安装与目录挂载:
[root@nfs-server ~]# showmount -e localhost Export list for localhost: /data 192.168.35.0/24
2、集群中的每个节点安装nfs
集群中的每个节点相当于nfs的客户端:
# 在每个节点执行 yum install -y nfs-utils
然后启动每个节点的nfs以及查看挂载情况:
# 每个节点启动 service nfs start # 查看服务端的挂载目录,192.168.35.9是nfs服务器的ip [root@k8snode1 ~]# showmount -e 192.168.35.9 Export list for 192.168.35.9: /data 192.168.35.0/24
有结果就说明已经成功了。
3、集群中使用nfs持久存储
- nfs-nginx.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-nfs spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot nfs: server: 192.168.35.9 path: /data
可以看到volume使用的就是nfs服务器的挂载目录来进行存储的。
现在可以进行测试,将Pod中的/usr/share/nginx/html中的内容存储在nfs服务器中,在Pod中的目录中新建一个文件:
[root@k8smaster ~]# kubectl exec -it nginx-nfs-545c5b9d75-79dl6 bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead. root@nginx-nfs-545c5b9d75-79dl6:/# cd /usr/share/nginx/html/ root@nginx-nfs-545c5b9d75-79dl6:/usr/share/nginx/html# ls root@nginx-nfs-545c5b9d75-79dl6:/usr/share/nginx/html# touch index.html
现在去nfs服务器的/data目录中去查看:
[root@nfs-server data]# ll 总用量 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 6月 28 05:34 index.html
这样就完成了nfs持久存储了。
二、PVC和PV
1、概念
上述的持久化方式是可行的,但是有一些问题,那就是Deployment资源与持久化volumes没有解耦,这样nfs服务器信息就会暴露,这里就是用PVC(PersistentVolumeClaim)和PV(PersistentVolume)。它们是集群中提供的连个新的API资源。
PV是集群中由管理员配置的网络存储,是容量插件,获取存储实现的详细信息,比如NFS等。
PVC是由用户进行存储的请求,PVC消耗PV资源,PVC和PV是一一对应的,它们之间可以通过比如容量等条件进行匹配。
2、使用
如果需要应用必定需要PVC和PV,那么首先定义PV文件:
- pv.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /data server: 192.168.35.9
执行并且查看:
# 执行 [root@k8smaster ~]# kubectl create -f pv.yaml persistentvolume/my-pv created # 查看 [root@k8smaster ~]# kubectl get PersistentVolume NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE my-pv 5Gi RWX Retain Available 10s
- pvc.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-dep1 spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot persistentVolumeClaim: claimName: my-pvc --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi
在pvc中定义了5Gi容量的请求资源,它会去寻找这个匹配容量资源的pv。
执行并且查看:
# 执行 [root@k8smaster ~]# kubectl create -f pvc.yaml deployment.apps/nginx-dep1 created # 查看 persistentvolumeclaim/my-pvc created [root@k8smaster ~]# kubectl get PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE my-pvc Bound my-pv 5Gi RWX 21s [root@k8smaster ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-dep1-58b7bf955f-mmz4q 0/1 ContainerCreating 0 29s nginx-dep1-58b7bf955f-rcg7t 0/1 ContainerCreating 0 29s nginx-dep1-58b7bf955f-zwxwx 1/1 Running 0 29s
- 测试
# 在某个deployment资源中添加文件index1.html [root@k8smaster ~]# kubectl exec -it nginx-dep1-58b7bf955f-mmz4q bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead. root@nginx-dep1-58b7bf955f-mmz4q:/# cd /usr/share/ X11/ debconf/ gcc-8/ man/ polkit-1/ adduser/ debianutils/ gdb/ menu/ readline/ base-files/ dict/ info/ misc/ sensible-utils/ base-passwd/ doc/ java/ nginx/ tabset/ bash-completion/ doc-base/ keyrings/ pam/ terminfo/ bug/ dpkg/ libc-bin/ pam-configs/ xml/ ca-certificates/ fontconfig/ lintian/ perl5/ zoneinfo/ common-licenses/ fonts/ locale/ pixmaps/ zsh/ root@nginx-dep1-58b7bf955f-mmz4q:/# cd /usr/share/nginx/html/ root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# ls index.html root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# touch index1.html root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# ls index.html index1.html # 在nfs服务器挂载目录中查看 [root@nfs-server data]# ll 总用量 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 6月 28 15:34 index1.html -rw-r--r--. 1 nfsnobody nfsnobody 0 6月 28 05:34 index.html
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。