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: v1
kind: Pod
metadata:
name: producer-consumer
spec:
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

k8s 數據持久化

這裡創建的pod producer-consumer內有兩個容器producer和consumer。

producer容器創建了一個文件,consumer容器來讀取這個文件。

2. NFS

PersistentVolume(PV)

PV 是管理員創建維護的一塊存儲空間,pv的生命週期獨立於Pod。

搭建NFS

yum -y install nfs-utils rpcbind
systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl start nfs.service
systemctl enable nfs.service
rpcinfo -p localhost
ps -ef|egrep "rpc|nfs"
mkdir -p /nfs-share
chmod a+w /nfs-share
echo "/nfs-share 172.16.0.0/16(rw,async,no_root_squash)" >> /etc/exports
showmount -e
systemctl restart nfs.service
firewall-cmd --permanent --zone=public --add-port=2049/tcp --add-port=111/tcp --add-port=111/udp --add-port=4046/udp
firewall-cmd --reload

所有節點都需要nfs.service服務

nfs_pv1.yml

apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv1
spec:
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: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc1
spec:
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

k8s 數據持久化

k8s 數據持久化

此刻pvc1已經Bound到pv1,資源申請成功,現在開始創建pod資源,在pod中使用nfs存儲

nfspod.yml

apiVersion: v1
kind: Pod
metadata:
name: nfspod
spec:
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

k8s 數據持久化

3. 回收PV

不需要使用PV的時候,刪除PVC回收pv

資源管理

kubectl delete pvc mypvc1

kubectl get pod -o wide

kubectl get pv

k8s 數據持久化

新的Pod recycler-for-mypv1 是用來清除PV mypv1的數據,

mypv1的狀態為Released 表示pv已經解除了pvc的Bound

數據清除完畢,mypv1的狀態重新變為Available

如果不希望pvc數據被清除,我們可以設置persistentVolumeReclaimPolicy策略為Retain,這樣即使刪除pvc資源也不會成功。

NFS是不支持Delete策略。

4. 數據庫實例

mysql.yml

apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
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

k8s 數據持久化

k8s 數據持久化


分享到:


相關文章: