数据管理

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

查看原文 >>
相关文章