目錄
一、簡單基本存儲
1、EmptyDir
1.1概念
1.2作用
1.3配置文件
1.4測試
2、HostPath
2.1概念
2.2作用
2.3配置文件
2.4測試
①、數據共享
②、持久化存儲
3、NFS
3.1概念
3.2作用
3.3NFS服務安裝
①、設置主節點為NFS服務器
②、給副節點安裝NFS客戶端工具
3.4配置文件
3.4測試
①、數據共享
②、持久化存儲
由于k8s中Pod的生命周期短暫,會被頻繁的創建和銷毀,容器的重啟或遷移也會導致數據丟失,而有狀態應用需求,如數據庫、消息隊列等需要持久化存儲,確保數據在容器生命周期之外依然存在,方便用戶調用,為了實現持久化保存數據,k8s引入Volume實現同一個Pod中的不同容器的數據共享和數據持久化,即使容器重啟或遷移等等都不會導致Volume數據丟失。
常見Volume類型:
-
簡單基本存儲:EmptyDir、HostPath、NFS
-
高級核心存儲:PV、PVC
-
配置存儲:ConfigMap、Secret
一、簡單基本存儲
1、EmptyDir
1.1概念
? EmptyDir是在Pod被分配到Node時創建的,初始內容為空,無法指定宿主機對應的文件目錄,一個EmptyDir相當于一個Host的空目錄,當Pod銷毀時,EmptyDir的數據也會被永久刪除,即EmptyDir只在Pod的生命周期內有效。
1.2作用
由于EmptyDir只在Pod的生命周期內有效,故不適合做持久化的數據存儲,只適合做臨時存儲:
-
作為臨時空間,無須長久保留
-
為同一個Pod內的不同容器實現數據共享
1.3配置文件
apiVersion: v1kind: Podmetadata:name: nginx-busybox-lognamespace: defaultspec:containers:# ---------- Nginx ----------- name: nginximage: nginx:1.24.0 ? ? ? ? ? # 體積小、鏡像拉取快ports:- containerPort: 80volumeMounts:- name: logs-volumemountPath: /var/log/nginx ? # Nginx 默認日志目錄# ---------- BusyBox ----------- name: busyboximage: busybox:1.36.1 ? ? ? ? # 推薦穩定版本command: ["/bin/sh","-c","tail -f /logs/access.log"] ? # 初始命令,動態讀取指定文件內容volumeMounts:- name: logs-volumemountPath: /logs ? ? ? ? ? ?# BusyBox 內查看目錄# ---------- 共享卷 ----------volumes:- name: logs-volume ? ? ? ? ? ? # 共享卷名稱emptyDir: {} ? ? ? ? ? ? ? ? ?# 數據卷類型,Pod 級臨時目錄,兩容器共享
1.4測試
最終實現:每當我訪問nginx,nginx會將訪問的日志信息存儲到/var/log/nginx目錄下,而busybox可通過命令查看是否有日志生成,即實現同一個Pod中兩個不同容器之間通過數據卷emptydir進行了數據共享。
# 創建 Pod# 記住要在yaml文件目錄下kubectl create -f nginx-busybox-emptydir.yaml?# 查看是否創建 Pod 成功kubectl get po nginx-busybox-log -o wide?# 訪問 nginx kubectl exec nginx-busybox-log -- curl http://localhost?#-----------------雙開終端--------------------------# 雙開終端方便查看指定容器的標準輸出# kubectl logs -f <你創建的數據卷名稱> -n <你創建數據卷指定的命名空間> -c <指定容器>kubectl logs -f nginx-busybox-log -c busybox
# 刪除Pod,查看數據是否仍存在,是否仍可以進行數據共享kubectl delete -f nginx-busybox-emptydir.yaml?# 驗證刪除成功kubectl get po nginx-busybox-log -o wide?# 雙開終端方便查看指定容器的標準輸出# kubectl logs -f <你創建的數據卷名稱> -n <你創建數據卷指定的命名空間> -c <指定容器>kubectl logs -f nginx-busybox-log -c busybox
發現數據已經不見了
2、HostPath
2.1概念
? 當Pod銷毀時,EmptyDir的數據也會被永久刪除,即EmptyDir只在Pod的生命周期內有效。為了實現簡單的數據持久化,即簡單地將數據掛載到主機上,可選擇HostPath
2.2作用
HostPath就是將Node主機上的一個實際目錄掛載到Pod中,提供給容器使用,最終實現即使Pod銷毀,數據依然存在在Node主機。
2.3配置文件
apiVersion: v1kind: Podmetadata:name: nginx-busybox-lognamespace: defaultspec:containers:# ---------- Nginx ----------- name: nginximage: nginx:1.24.0 ? ? ? ? ? # 體積小、鏡像拉取快ports:- containerPort: 80volumeMounts:- name: logs-volumemountPath: /var/log/nginx ? # Nginx 默認日志目錄# ---------- BusyBox ----------- name: busyboximage: busybox:1.36.1 ? ? ? ? # 推薦穩定版本command: ["/bin/sh","-c","tail -f /logs/access.log"] ? # 初始命令,動態讀取指定文件內容volumeMounts:- name: logs-volumemountPath: /logs ? ? ? ? ? ?# BusyBox 內查看目錄# ---------- 共享卷 ----------volumes:- name: logs-volume ? ? ? ? ? ? # 共享卷名稱hostPath: ? ? ? ? ? ? ? ? ? ? # 數據卷類型path: /root/logs ? ? ? ? ? ?# 保存到K8s 節點(即 Linux 虛擬機或裸機) 上的目錄type: DirectoryOrCreate ? ? # 目錄存在就直接使用,不存在就先創建后使用
2.4測試
最終實現:每當我訪問nginx,nginx會將訪問的日志信息存儲到K8s 節點(即 Linux 虛擬機或裸機) 上的目錄(路徑為path: /root/logs ),而我們可以直接去節點通過命令查看是否有日志生成,即實現將數據持久化存儲到Node主機上,即使Pod刪除了,數據仍存在。
①、數據共享
# 創建 Pod# 記住要在yaml文件目錄下kubectl create -f nginx-busybox-hostpath.yaml?# 查看是否創建 Pod 成功,并查看是創建在哪個節點kubectl get po nginx-busybox-log -o wide?# 訪問 nginx kubectl exec nginx-busybox-log -- curl http://localhost?#-----------------雙開終端--------------------------# 雙開終端,方便查看指定文件docker exec -it <你的Pod創建所在節點> bash# 如我的是 docker exec -it my-multi-node-cluster1-worker bash?# 進入指定的節點路徑,查看共享目錄ls -l /root/logs?# 查看文件日志tail -f /root/logs/access.log
②、持久化存儲
# 刪除Pod,查看數據是否仍存在,是否仍可以進行數據共享kubectl delete -f nginx-busybox-hostpath.yaml?# 驗證刪除成功kubectl get po nginx-busybox-log -o wide?#-----------------雙開終端--------------------------# 雙開終端,方便查看指定文件docker exec -it <你的Pod創建所在節點> bash# 如我的是 docker exec -it my-multi-node-cluster1-worker bash?# 進入指定的節點路徑,查看共享目錄ls -l /root/logs?# 查看文件日志是否仍然存在tail -f /root/logs/access.log
發現數據仍然存在
3、NFS
3.1概念
? 雖然HostPath可以解決數據的持久化問題,但當數據存儲所在的Node節點崩潰時,其內部的Pod和數據也會一并丟失,Pod此時需要轉移到其他節點,需要準備單獨的網絡存儲系統,此時可選NFS或CIFS等其他,這里只是使用NFS作為例子進行學習。
3.2作用
NFS作為一個網絡文件的存儲系統,我們可通過搭建一臺NFS服務器,然后將Pod中的數據直接存儲其中,這樣即使Pod在節點上如何轉移,我們只需要保證Node和NFS連接正常,數據即可正常訪問。
NFS服務器一般需要備份,設置為高可用
3.3NFS服務安裝
①、設置主節點為NFS服務器
# 獲取已有節點,找到control-plane容器記下輸出容器內 IP( INTERNAL-IP )例如 172.18.0.2kubectl get node -o wide?# 進入控制面(control-plane)容器docker exec -it my-multi-node-cluster1-control-plane bash?# ---- 容器內執行 ----# 更新并安裝NFS服務apt update && apt install -y nfs-kernel-server# 創建共享目錄mkdir -p /root/logs# 把共享目錄權限改成 “任何人可讀可寫可執行”chmod 777 /root/logs# 向 /etc/exports 追加一行 導出規則# 當然也可以手動進入 /etc/exports 然后編輯添加規則echo "/root/logs *(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports# 重新加載 /etc/exports 并立即生效exportfs -rav# 重啟 NFS 服務進程systemctl restart nfs-kernel-server# 如果不可用systemctl,可改為:service nfs-kernel-server restart?# 退出控制面容器exit
②、給副節點安裝NFS客戶端工具
NFS 客戶端功能已經內置在 Linux 內核的 nfs
文件系統模塊,所以一般不需要額外安裝
3.4配置文件
直接掛 NFS,無 PV/PVC
apiVersion: v1kind: Podmetadata:name: nginx-busybox-lognamespace: defaultspec:containers:# ---------- Nginx ----------- name: nginximage: nginx:1.24.0 ? ? ? ? ? # 體積小、鏡像拉取快ports:- containerPort: 80volumeMounts:- name: logs-volumemountPath: /var/log/nginx ? # Nginx 默認日志目錄# ---------- BusyBox ----------- name: busyboximage: busybox:1.36.1 ? ? ? ? # 推薦穩定版本command: ["/bin/sh","-c","tail -f /logs/access.log"] ? # 初始命令,動態讀取指定文件內容volumeMounts:- name: logs-volumemountPath: /logs ? ? ? ? ? ?# BusyBox 內查看目錄# ---------- 共享卷 ----------volumes:- name: logs-volume ? ? ? ? ? ? # 共享卷名稱nfs: ? ? ? ? ? ? ? ? ? ? ? ? ?# 數據卷類型path: /root/logs ? ? ? ? ? ?# 共享目錄路徑(與上方在控制面容器創建的共享目錄相同)server: 172.18.0.2 ? ? ? ? ?# nfs服務器地址(控制面容器的內部 IP )
3.4測試
①、數據共享
# 創建 Pod
# 記住要在yaml文件目錄下
kubectl create -f nginx-busybox-nfs.yaml# 查看是否創建 Pod 成功kubectl get po nginx-busybox-log -o wide# 訪問 nginx
kubectl exec nginx-busybox-log -- curl http://localhost#-----------------雙開終端--------------------------
# 雙開終端,方便查看指定文件
kubectl logs -f nginx-busybox-log -c busybox# 進入主節點
docker exec -it my-multi-node-cluster1-control-plane bash# 查看共享目錄
ls /tmp/logs# 查看是否含訪問記錄
cat /tmp/logs/access.log
②、持久化存儲
# 刪除Pod,查看數據是否仍存在,是否仍可以進行數據共享
kubectl delete pod nginx-busybox-log# 驗證刪除成功
kubectl get po nginx-busybox-log -o wide# 立即重新創建同名 Pod(只讀驗證)
kubectl apply -f nginx-busybox-nfs.yaml# 查看是否創建成功
kubectl get po nginx-busybox-log -o wide# 進入主節點,查看歷史日志是否存在
docker exec -it my-multi-node-cluster1-control-plane bash
ls /tmp/logs
cat /tmp/logs/access.log
exit# 退出主節點后,立即查看busybox歷史日志
kubectl exec nginx-busybox-log -c busybox -- cat /logs/access.log
發現數據仍然存在,并沒有隨著Pod的生命周期而丟失
PS:為什么我的snipaste截圖的照片,過一段時間會自動消失,導致我又要重新做一遍演示,有沒有大佬救救我QAQ