大家好!歡迎來到 K8s 的第六天!
昨天的 Day 12,我們把設定檔(ConfigMap
、Secret
)成功「搬」出應用程式,讓 Deployment 看起來更乾淨。這樣的應用還屬於「無狀態 (Stateless)」,因為它們不在乎重啟後是不是資料全沒了。
但現實世界可不是這麼簡單啊!像資料庫、消息隊列這些服務,都需要長久保存資料。那問題來了:如果 Pod 重啟時被調度到另一台機器,原本的資料還能找到嗎?
「哎呀,這不是用 Volume 就好了嗎?」,別急,在單機的 Docker 裡這麼做沒問題,但在 Kubernetes 的多節點世界裡,事情可沒那麼單純。因為 Pod 可能搬家,搬到另一台 Node 上之後,就再也看不到原本那塊本地硬碟的資料了 。
所以今天,我們要來學習 Kubernetes 一套能讓資料跟著應用走的持久化儲存系統。
K8s 處理這個問題的方法很聰明:它把「提供儲存的人」和「使用儲存的人」徹底分開,走的是「供需分離」模式。
就好像公司裡的 IT 流程一樣:
在 Kubernetes 裡,這兩個角色對應到兩個重要物件:
PV 可以想成「已經貼好標籤、放在機房架子上的硬碟」。它是管理員準備好的儲存空間,寫好屬性、大小、類型,但還沒分配給誰用。常見屬性包含:
10Gi
ReadWriteOnce
(一次只能一個節點讀寫)fast-ssd
PV 屬於「叢集層級」資源,不綁定任何 Namespace。
PVC 就像開發者遞交的申請表單,寫上:
ReadWriteOnce
」fast-ssd
類型」K8s 收到 PVC 後,會開始幫你「配對」:
PVC 屬於「Namespace 層級」,必須和 Pod 在同一個 Namespace。
當 PVC 綁定到 PV 後,你就能像用 Volume 一樣,把它掛載到 Pod。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ota-db-pvc <-- 這邊
namespace: project-space
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
volumes:
- name: db-storage
persistentVolumeClaim:
claimName: ota-db-pvc <-- 這邊
這樣 MariaDB 的資料就能存在 PVC 對應的 PV 裡,即使 Pod 搬到另一個 Node 也沒問題 。
以前要用 PV,都得請管理員先準備好硬碟。現在有了 StorageClass,這件事自動化了!你可以把 StorageClass 想像成 IT 部門提供的「資源目錄」:
standard
:HDDfast-ssd
:SSDcloud-backup
:雲端儲存當 PVC 指定了某個 StorageClass,K8s 就會自己去底層幫你動態建立一個 PV,並自動綁定。
管理員只要定義「有哪些類型可用」,不需要一個個手動建。
現在我們的應用,不只可以被部署、帶著設定檔,還能「帶著記憶」一起運行。但下一個問題又來了:Pod 真的健康嗎?光是看到它 Running
,不代表它就能正常接受連線。接下來就要來談 Kubernetes 的「健康檢查 (Probes)」機制 ,明天見!