k8s 数据持久化
数据管理
kubernetes volume : 持久化保存容器的数据,本质上它是一个目录。这个卷是挂载到Pod上的供容器使用
docker volume: 持久化保存容器的数据,本质上它是一个目录。这个卷是挂载到容器上供容器使用
如同docker volume有很多的后端(backend)类型,kubernetes volume也有很多backend 类型,常用的有:
emptyDir、hostPath、AWS Elastic Block Story、NFS、ceph
接下来我将给大家介绍一下简单的emptyDir、NFS存储后端类型的数据卷用法。
1. emptyDir
一个emptyDir就是一个空目录,emptyDir对于容器来说是持久的但是它的生命周期和Pod是一致的,对于Pod来说是短暂的。有点类似于docker -v
emptyDir.yml
apiVersion: v1kind: Podmetadata: name: producer-consumerspec: containers: - image: busybox name: producer volumeMounts: - mountPath: /producer_dir name: shared-volume args: - /bin/sh - -c - echo "hello world" > /producer_dir/hello; sleep 3000 - image: busybox name: consumer volumeMounts: - mountPath: /consumer_dir name: shared-volume args: - /bin/sh - -c - cat /consumer_dir/hello; sleep 3000 volumes: - name: shared-volume emptyDir: {}
参数解析
volumeMounts 是pod挂载信息
mountPath 是pod的目录
name 是指定挂载的emptyDir目录名
volumes 是emptyDir挂载信息
name 是挂载的emptyDir目录名
资源管理
kubectl apply -f emptyDir.yml
这里创建的pod producer-consumer内有两个容器producer和consumer。
producer容器创建了一个文件,consumer容器来读取这个文件。
2. NFS
PersistentVolume(PV)
PV 是管理员创建维护的一块存储空间,pv的生命周期独立于Pod。
搭建NFS
yum -y install nfs-utils rpcbindsystemctl start rpcbind.servicesystemctl enable rpcbind.servicesystemctl start nfs.servicesystemctl enable nfs.servicerpcinfo -p localhostps -ef|egrep "rpc|nfs"mkdir -p /nfs-sharechmod a+w /nfs-shareecho "/nfs-share 172.16.0.0/16(rw,async,no_root_squash)" >> /etc/exportsshowmount -esystemctl restart nfs.servicefirewall-cmd --permanent --zone=public --add-port=2049/tcp --add-port=111/tcp --add-port=111/udp --add-port=4046/udpfirewall-cmd --reload
所有节点都需要nfs.service服务
nfs_pv1.yml
apiVersion: v1kind: PersistentVolumemetadata: name: mypv1spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: mynfs nfs: path: /nfs-share server: 172.16.2.235
参数解析
capacity 指定PV的容量为1G
accessModes 指定访问模式为ReadWriteOnce;ReadWriteOnce,只能在单节点可读可写;ReadOnlyMany,能在多节点只读;ReadWriteMany,能做多节点可读可写。
persistentVolumeReclaimPolicy 指定PV回收策略,Retain 需要管理员手工回收,Delete 删除对应的存储资源,Recycle 清除PV中的数据。
storageClassName 指定PV的class
path 指定PV在NFS服务器上对应的目录
nfs_pvc1.yml
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mypvc1spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: mynfs
资源管理
kubectl appliy -f nfs_pv1.yml
kubectl appliy -f nfs_pvc1.yml
kubectl get pv
kubectl get pvc
此刻pvc1已经Bound到pv1,资源申请成功,现在开始创建pod资源,在pod中使用nfs存储
nfspod.yml
apiVersion: v1kind: Podmetadata: name: nfspodspec: containers: - name: nfspod image: busybox args: - /bin/sh - -c - sleep 3000 volumeMounts: - mountPath: "/mydata" name: nfsdata nodeSelector: disktype: xfs volumes: - name: nfsdata persistentVolumeClaim: claimName: mypvc1
资源管理
kubectl apply -f nfspod.yml
kubectl get pod -o wide
kubectl exec nfspod touch /mydata/hello
ll /nfs-share/hello
3. 回收PV
不需要使用PV的时候,删除PVC回收pv
资源管理
kubectl delete pvc mypvc1
kubectl get pod -o wide
kubectl get pv
新的Pod recycler-for-mypv1 是用来清除PV mypv1的数据,
mypv1的状态为Released 表示pv已经解除了pvc的Bound
数据清除完毕,mypv1的状态重新变为Available
如果不希望pvc数据被清除,我们可以设置persistentVolumeReclaimPolicy策略为Retain,这样即使删除pvc资源也不会成功。
NFS是不支持Delete策略。
4. 数据库实例
mysql.yml
apiVersion: v1kind: Servicemetadata: name: mysqlspec: ports: - port: 3306 selector: app: mysql---apiVersion: apps/v1beta1kind: Deploymentmetadata: name: mysqlspec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mypvc1
资源管理
kubectl apply -f mysql.yml
查看原文 >>