跳轉至主要內容

Kubernetes 持久卷聲明詳解

Table of Contents

分享本頁

Yifat Perry
Yifat Perry

什麼是 Kubernetes 持久磁碟區和持久磁碟區宣告?

Kubernetes 持久性磁碟區(PV) 是一種允許 Pod 存取儲存裝置上的持久儲存的物件,該儲存裝置透過 Kubernetes StorageClass 進行定義。與本質上是暫時性的一般磁碟區不同,PV 是持久性的,支援具狀態應用程式使用案例。PV 是 Kubernetes 叢集中的資源物件,即使使用它的 Pod 被銷毀後,PV 仍然存在。

持久性磁碟區(PV)必須透過持久性磁碟區宣告(PVC)來要求,PVC 是一種儲存請求。PVC 本質上是在 Pod 上掛載滿足特定要求的 PV 的請求。PVC 並非指定具體的 PV,而是指定 Pod 所需的 StorageClass。管理員可以定義 StorageClasses,以指示儲存設備的屬性,例如效能、服務等級和後端策略。

Kubernetes 中 PVC 模式的一個主要優勢是,它允許開發人員動態請求儲存資源,而無需了解底層儲存裝置的實作。

相關內容:閱讀我們的 Kubernetes StorageClass 指南

在本文中:

持久性磁碟區宣告:靜態佈建與動態佈建

若要將 pod 繫結至 PV,pod 必須包含磁碟區掛載和 PVC。這些宣告可讓使用者在不瞭解基礎儲存設備詳細資訊的情況下,將 PV 掛載至 pod 中。

將 PV 掛載到 Pod 有兩種選項:

  • 靜態配置是指管理者手動建立 PV 並定義一個符合這些 PV 條件的 StorageClass。當 Pod 使用指定了 StorageClass 的 PVC 時,它就可以存取這些靜態 PV 之一。
  • 動態配置會在沒有與 PVC 相符的靜態 PV 時發生。在這種情況下,Kubernetes 叢集會根據 StorageClass 定義配置新的 PV。

相關內容:閱讀我們的 Kubernetes 共享儲存指南

建立持久性磁碟區宣告並繫結至持久性磁碟區

本教學示範了 PV 和 PVC 的工作原理。它是 Kubernetes 文件中完整教程 的概要。

1.設定節點
使用單一節點設定 Kubernetes 叢集,並確保 kubectl 命令列已連接到控制平面。在節點上建立一個目錄,如下所示:

sudo mkdir /mnt/data

在目錄中建立 index.html 檔案。

2.建立持久卷
建立如下 YAML 檔案來定義 PV。

k8s pvc 1

執行此命令在節點上建立 PV:

kubectl apply -f https://k8s.io/examples/pods/storage/pv-volume.yaml

3.建立持久磁碟區宣告並將其繫結至持久磁碟區
建立需要 PV 的 PVC,並符合下列條件以符合您先前建立的 PV:

  • 3 GB 或以上的儲存容量
  • 啟用讀取 / 寫入存取權限
k8s pvc 2

執行以下命令以應用 PVC:

kubectl apply -f https://k8s.io/examples/pods/storage/pv-claim.yaml

建立持久性磁碟區宣告時,Kubernetes 控制平面會找到正確的 PV。如果找到,它會將 PVC 綁定到該 PV。

執行以下命令檢查先前建立的 PV 狀態:

kubectl get pv task-pv-volume

如果綁定成功,輸出應如下所示:

k8s pvc 3

4.建立 Pod 並掛載持久卷宣告
最後,建立一個使用 PVC 的 Pod。使用 NGINX 映像執行該 Pod,並在 Pod 規範的相關部分指定您預先建立的 PVC:

k8s pvc 4

使用 bash 命令在您的 pod 中安裝 curl,然後執行以下命令:

curl http://localhost/

輸出應顯示步驟 1 中建立的 index.html 檔案的內容。它應顯示新的 pod 可以透過 PVC 存取 PV 中的資料。

Kubernetes PVC 錯誤:常見原因及解決方法 [C]

Kubernetes PVC 的使用可能較為複雜,所產生的錯誤可能難以診斷和解決。PVC 錯誤通常與三大類問題相關:PV 創建問題、PV 配置問題以及 PV 或 PVC 規範的變更。

與 PVC 相關的最常見錯誤是 FailedAttachVolume、FailedMount 和 CrashLoopBackOff。

FailedAttachVolume 和 FailedMount 錯誤

這兩個錯誤都表示 pod 無法掛載 PV。差別在於,FailedAttachVolume 發生在磁碟區無法從先前的節點分離時,FailedMount 發生在磁碟區無法掛載到所需路徑時。

這兩個錯誤可能有多種原因,包括新節點故障、新節點連接的磁碟過多、網路分割錯誤以及先前節點上的儲存設備故障。

診斷問題

若要診斷諸如 FailedAttachVolume 和 FailedMount 之類的問題,請執行 describe pod 命令,並在「事件」部分搜尋指示錯誤的訊息。該訊息還應提供有關問題原因的資訊。

解決問題

Kubernetes 無法自動處理 FailedAttachVolume 和 FailedMount 錯誤,因此您需要手動處理這些問題:

  • 如果錯誤原因是「無法分離」,請使用儲存裝置的介面手動分離磁碟區。
  • 如果錯誤為 Failure to Attach 或 Mount- 請檢查網路分割問題或網路路徑不正確。如果這不是問題所在,請嘗試讓 Kubernetes 將 pod 排程到另一個節點上,或調查並修復新節點上的問題。

CrashLoopBackOff 由 PersistentVolumeClaim 導致的錯誤

CrashLoopBackOff 表示某個 pod 崩潰、重新啟動後又再次崩潰,這種情況反覆發生。在某些情況下,此錯誤是由於 PersistentVolumeClaims 損壞造成的。

診斷問題

若要確定 CrashLoopBackOff 錯誤是否由 PVC 引起,請檢查掛載 PV 的先前容器執行個體的日誌、部署日誌,如有必要,請在容器上執行 shell 以確定其崩潰的原因。

解決問題

如果 CrashLoopBackOff 是 PVC 問題導致的,請嘗試以下步驟:

  1. 將部署規模縮減至 0 個執行個體以啟用偵錯功能。
  2. 使用以下查詢取得失效 PVC 的標識符:
    kubectl get deployment -o jsonpath="{.spec.template.spec.volumes[*].persistentVolumeClaim.claimName}" failed-deployment 
    
  3. 建立一個新的偵錯 pod,並使用以下命令執行 shell:
    exec -it volume-debugger sh
    
  4. 確定目前掛載在 /datadirectory 中的磁碟區,並修復導致 pod 當機的問題。
  5. 退出 shell、刪除調試 pod,並將部署擴展回所需的副本數。

使用 Cloud Volumes ONTAP 進行 Kubernetes 儲存最佳化

NetApp Cloud Volumes ONTAP 是領先業界的企業級儲存管理解決方案,可在 AWS、Azure 和 Google Cloud 上提供安全可靠、實證肯定的儲存管理服務。Cloud Volumes ONTAP 容量可以擴充至 PB 級,並支援各種使用案例,例如檔案服務、資料庫、DevOps 或任何其他企業工作負載,並具有一系列強大的功能,包括高可用度、資料保護、儲存效率、Kubernetes 整合等。

特別值得一提的是,Cloud Volumes ONTAP 可支援容器化工作負載的 Kubernetes Persistent Volume 資源配置和管理 需求。

了解更多關於 Cloud Volumes ONTAP 如何協助解決容器化應用程式面臨的挑戰,請參閱這些 Kubernetes Workloads with Cloud Volumes ONTAP 案例研究。

Yifat Perry

Yifat Perry

查看 Yifat Perry 的所有文章
Kubernetes 持久卷聲明詳解 | NetApp