Volume - Introduction
Kubernetes Volumes 是管理 Kubernetes 集群中儲存資源的關鍵。它們提供了容器之間共享數據的方式,並確保即使容器重啟或重新調度,數據仍然可以持久化。在這一部分,我們將介紹 Volume 是什麼、Volume 類型以及不同 Volume 的生命週期。
Volume 是什麼?
在 Kubernetes 中,Volume
是一種儲存資源,它允許容器在 Pod 內共享和持久化數據。Volume 抽象化了底層儲存系統的細節,為應用程式提供一致的接口。Volume 可以是暫時性的(ephemeral)或持久性的(persistent),並且其數據可以在 Pod 內的多個容器間共享。
與 Docker 中的容器文件系統不同,Kubernetes 的 Volume 使得數據能夠超越個別容器的生命週期,即使容器被銷毀或重新創建,數據仍然保持不變。
Volume 類型
Kubernetes 支援多種 Volume 類型,每種類型的用途不同。以下是一些常見的 Volume 類型:
1. EmptyDir
- 生命週期:
EmptyDir
是 Pod 中的臨時存儲,它會在 Pod 啟動時創建,並且會在 Pod 被刪除時自動清除。 - 特點:
- Volume 在 Pod 的生命週期內有效,Pod 被刪除時,
EmptyDir
也會被刪除。 - 不會在 Pod 被重新調度到其他節點時保留數據。
- 常用於短期存儲、緩存等需求。
- Volume 在 Pod 的生命週期內有效,Pod 被刪除時,
2. HostPath
- 生命週期:
HostPath
將本地節點的文件系統掛載到 Pod 中。當 Pod 被刪除時,HostPath
不會被刪除,因為它依賴於主機上的文件系統。 - 特點:
HostPath
的生命週期與 Pod 不完全同步,Pod 被刪除時,HostPath
中的數據仍保留在主機上。- 如果 Pod 重新啟動並再次掛載
HostPath
,它將繼續使用原來的資料。 - 用於訪問節點本地資源,如日志文件、配置文件等。
3. PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)
- 生命週期:
PersistentVolume
是由集群管理的持久化儲存,它的生命週期不會隨著 Pod 的消失而終止。PersistentVolumeClaim
允許用戶申請儲存資源,並且會依賴於 PV 的存在。 - 特點:
PersistentVolume
的數據在 Pod 生命週期結束後仍然存在,除非明確刪除。PersistentVolumeClaim
用於申請和繫結到PersistentVolume
,當 PVC 被刪除時,對應的 PV 不一定會被刪除。- 可設定不同的回收策略:
Retain
(保留)、Recycle
(回收)、Delete
(刪除)。
4. NFS (Network File System)
- 生命週期:NFS 是一個網絡儲存系統,Pod 在其生命週期內將持久地掛載 NFS 目錄。這些文件系統通常跨多個節點共享,因此 Pod 可以在不同的節點上訪問相同的數據。
- 特點:
- NFS 的生命週期不與 Pod 直接綁定。Pod 被刪除後,NFS 文件系統仍然存在。
- 數據會存儲在 NFS 伺服器中,Pod 只是用來訪問這些數據。
- 適用於需要跨多個節點和 Pod 共享數據的情況。
5. AWS EBS (Elastic Block Store)
- 生命週期:AWS EBS 卷是 AWS 的持久區塊儲存服務,掛載到 Pod 上後,儲存數據將保留在 AWS 中。當 Pod 被刪除時,EBS 卷不會自動刪除,除非設定刪除策略。
- 特點:
- EBS 卷與 Pod 的生命週期無關。Pod 被刪除時,EBS 卷仍然存在,數據保持不變。
- 必須手動清理或設定回收策略來管理 EBS 卷的刪除。
- 適用於需要高效能和持久存儲的應用程式。
6. Azure Disk
- 生命週期:Azure Disk 是 Microsoft Azure 提供的區塊儲存。與 AWS EBS 類似,Azure Disk 在 Pod 刪除後保持不變。
- 特點:
- 它的數據保持在 Azure 雲端,Pod 刪除後,磁碟仍然存在。
- 如同 EBS,Azure Disk 的生命週期不依賴於 Pod,需要手動清理。
7. ConfigMap 和 Secret Volume
- 生命週期:
ConfigMap
和Secret
是用來儲存配置信息和敏感數據的 Volume,通常與 Pod 一起創建並掛載。當 Pod 被刪除時,這些 Volume 也會被清除。 - 特點:
ConfigMap
和Secret
的生命週期通常和 Pod 同步。- 在容器重啟或重新創建時,這些 Volume 會繼續使用原來的配置或敏感資料。
8. Ceph、GlusterFS 等分佈式儲存
- 生命週期:這些 Volume 是跨多個節點和 Pod 使用的分佈式儲存系統,當 Pod 被刪除後,儲存的數據會保留在分佈式儲存系統中。
- 特點:
- 這些 Volume 的數據在 Pod 的生命週期外保持,Pod 可以在不同的節點間共享同一個 Volume。
- 依賴於 底層分佈式儲存系統,通常在多節點間提供高可用性。
Volume 生命週期
Volume 的生命週期與 Pod 以及相關的 PersistentVolume 和 PersistentVolumeClaim 物件的生命週期緊密相連。以下是主要的生命週期階段:
1. Volume 創建
- Volume 可以是動態創建的,也可以是靜態創建的。對於持久儲存,會創建 PersistentVolume(PV),並且 PersistentVolumeClaim(PVC) 用來請求存取這個 Volume。
- 在某些情況下,當 Pod 啟動時,Volume 會被創建並與 Pod 的生命週期關聯。
2. 掛載 Volume
- 一旦 Volume 被創建或請求,Kubernetes 會將其掛載到 Pod 的容器中。此時,容器中的應用程式可以訪問 Volume 中的數據。
3. 訪問 Volume
- Pod 內的容器現在可以讀寫 Volume 中的數據。Volume 的數據會在容器的生命週期之外持久化,因此即使容器崩潰或被替換,數據仍然保持。
4. Volume 分離
- 當 Pod 被刪除或 Volume 不再需要時,Kubernetes 會自動將 Volume 從容器中分離。對於持久 Volume,這也會觸發回收策略(Retain、Recycle 或 Delete),決定後續對 Volume 的處理方式。
5. Volume 清理
- 如果 Volume 設定為刪除,Pod 被刪除時,底層儲存資源(例如 EBS 卷、NFS 共享)會被清理。如果 Volume 設定為保留,則 Volume 會保持不變並可重新使用。