數據管理
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
這裡創建的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
此刻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
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: 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
閱讀更多 崔格拉斯 的文章