一、持久化存儲理論
官方中文參考文檔:
1、為什么要做數(shù)據(jù)持久化存儲?
在k8s中部署的應用都是以pod容器的形式運行的,假如我們部署MySQL、Redis等數(shù)據(jù)庫,需要對這些數(shù)據(jù)庫產(chǎn)生的數(shù)據(jù)做備份。因為Pod是有生命周期的,如果pod不掛載數(shù)據(jù)卷,那pod被刪除或重啟后這些數(shù)據(jù)會隨之消失,如果想要長久的保留這些數(shù)據(jù)就要用到pod數(shù)據(jù)持久化存儲。
2、常見持久化存儲方案
- emptyDir:是一種臨時性的卷,它的生命周期與 Pod 相同。emptyDir 卷是在 Pod 被調度到節(jié)點上時創(chuàng)建的,并且在 Pod 被刪除時一并刪除。emptyDir 卷通常用于在容器之間共享文件或者緩存數(shù)據(jù)。
- HostPath:是一種本地存儲卷,可以將宿主機目錄映射到容器中,刪除Pod后宿主機卷不會跟隨刪除,但是調用到不通節(jié)點,卷內容會不一致(MySQL數(shù)據(jù)在Node1節(jié)點存儲,刪除MySQL Pod后調度到Node2上了,導致數(shù)據(jù)不一致)。
- NFS:是一種共享卷,需要依賴于NFS服務端,所有Pod共享NFS卷內容,不需要考慮Pod調度在不同節(jié)點導致數(shù)據(jù)不一致問題,但是NFS基于網(wǎng)絡傳輸,會占用帶寬。
- PVC:用來實現(xiàn)持久化存儲,可以將存儲資源獨立出來,方便管理和共享。
二、案例:持久化存儲方案
1、emptydir臨時存儲卷
臨時卷,當Pod被刪除時,卷也會刪除,用于存儲一些不重要的數(shù)據(jù)。
創(chuàng)建Pod資源,使用emptydir卷方式掛載 ,YAML如下:
cat emptydir-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: empty-pod
labels:
type: empty-pod
spec:
containers:
- name: empty-pod
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: volume-empty # 掛載路徑名稱,必須與下面卷名稱一致
mountPath: /usr/share/nginx/html # 卷掛載目錄
volumes:
- emptyDir: {} # emptyDir類型,{}表示一個空的配置
name: volume-empty # 卷名稱
執(zhí)行YAML文件:
kubectl apply -f emptydir-pod.yaml
如何查看本地掛載卷路徑位置呢?
第一步:確認Pod當前所在節(jié)點,可以使用以下命令確認:
kubectl get pods empty-pod -o wide
第二步:確認Pod的uid值,可以使用以下名稱確認:
kubectl get pods empty-pod -o yaml|grep uid
uid: 9f76e568-05a9-41c3-9fb2-c43505214b99
第三步:在Pod所在節(jié)點中的/var/lib/kubelet/pods/uid
目錄下:
cd /var/lib/kubelet/pods/9f76e568-05a9-41c3-9fb2-c43505214b99
cd volumes/kubernetes.io~empty-dir/volume-empty # 此目錄對應Pod中/usr/share/nginx/html 目錄
確認本地卷對應目錄后,我們進入路徑,創(chuàng)建index.html文件:
cd /var/lib/kubelet/pods/9f76e568-05a9-41c3-9fb2-c43505214b99/volumes/kubernetes.io~empty-dir/volume-empty
echo "qinzt666" > index.html
訪問Pod網(wǎng)站內容:
kubectl get pods empty-pod -o wide
curl 10.244.235.233
我們刪除Pod后宿主機上此目錄也會跟隨刪除
kubectl delete pods empty-pod
2、hostPath本地存儲卷
本地存儲卷,指定宿主機目錄,與容器目錄做映射,刪除Pod,宿主機目錄不會跟隨刪除,hostPath可以支持很多掛載類型,如掛載目錄,掛載文件等,如下圖,此圖來自官方:
創(chuàng)建Pod資源,使用hostPath卷方式掛載 ,YAML如下:
cat hostpath-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: hostpath-pod
labels:
type: hostpath-pod
spec:
containers:
- name: hostpath-pod
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: volume-hostpath # 掛載路徑名稱,必須與下面卷名稱一致
mountPath: /usr/share/nginx/html # 容器掛載目錄
volumes:
- hostPath:
path: /data1 # 宿主機掛載目錄
type: DirectoryOrCreate # 卷類型,DirectoryOrCreate表示目錄,宿主機不存在則創(chuàng)建空目錄
name: volume-hostpath # 卷名稱
執(zhí)行YAML文件:
kubectl apply -f hostpath-pod.yaml
在Pod調度節(jié)點的宿主機掛載卷位置創(chuàng)建 index.html 文件
kubectl get pods hostpath-pod -o wide
echo "hello world qinzt 666 ...." >/data1/index.html
訪問Pod網(wǎng)站內容,Pod 的IP地址如上圖也可以查看到:
curl 10.244.235.198
刪除此Pod,節(jié)點上的數(shù)據(jù)依舊存在。
kubectl delete pod hostpath-pod
ls /data1/
index.html
3、NFS網(wǎng)絡共享存儲卷
NFS共享存儲卷,需要先搭建NFS服務端,Pod共享NFS服務端數(shù)據(jù),解決了Pod調度在不通Node節(jié)點,導致數(shù)據(jù)不一致問題,但是NFS需要依賴網(wǎng)絡帶寬。
搭建NFS服務端:所有Node節(jié)點上都需要安裝 nfs-utils
yum install nfs-utils -y
mkdir /data/volumes -p
vim /etc/exports
/data/volumes *(rw,no_root_squash)
加載配置生效 && 啟動NFS服務
exportfs -arv
systemctl enable nfs --now
在其他Node節(jié)點上面測試 NFS 是否可以正常掛載:
yum install nfs-utils -y
mkdir /test
mount 16.32.15.200:/data/volumes /test
df -hT /test/
如上圖測試無問題,卸載掛載:
umount /test
OK,至此NFS服務端已經(jīng)搭建完成,測試沒有問題了。
編寫 YAML 使用 NFS 類型存儲卷:
cat nfs-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-test
namespace: default
labels:
type: nfs
spec:
replicas: 3
selector:
matchLabels:
type: nfs
template:
metadata:
labels:
type: nfs
spec:
volumes:
- name: nfs-test-volume # 卷名稱
nfs:
server: 16.32.15.200 # NFS服務端IP地址
path: /data/volumes # NFS服務端共享目錄
containers:
- name: nfs-test
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-test-volume # 掛載卷名稱
mountPath: /usr/share/nginx/html # 容器內掛載目錄
執(zhí)行YAML 資源清單文件:
kubectl apply -f nfs-deployment.yaml
在 宿主機NFS共享卷創(chuàng)建 index.html
文件
echo "qinzt coolest 666." > /data/volumes/index.html
訪問 Pod網(wǎng)站,由于沒有創(chuàng)建Service資源,我們使用Pod IP地址進行訪問。
kubectl get pods -o wide
文章來源:http://www.zghlxwxcb.cn/news/detail-479169.html
上面curl 兩個節(jié)點上的Pod都可以訪問,說明掛載nfs存儲卷成功了,nfs支持多個客戶端掛載,可以創(chuàng)建多個pod,掛載同一個nfs服務器共享出來的目錄;但是nfs如果宕機了,數(shù)據(jù)也就丟失了,所以需要使用分布式存儲,常見的分布式存儲有glusterfs和cephfs。文章來源地址http://www.zghlxwxcb.cn/news/detail-479169.html
到了這里,關于【Kubernetes存儲篇】常見存儲方案及場景分析的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!