這篇文章已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Volume 健康監控 Alpha 版本更新

CSI 磁碟區健康監控功能最初在 1.19 中引入,已在 1.21 版本中進行了大幅更新。

為什麼要在 Kubernetes 中加入磁碟區健康監控?

若沒有磁碟區健康監控,Kubernetes 在 PVC 被佈建並由 Pod 使用後,無法得知儲存系統底層磁碟區的狀態。在 Kubernetes 中佈建磁碟區後,底層儲存系統可能發生許多狀況。例如,磁碟區可能在 Kubernetes 外部被意外刪除,磁碟區所在的磁碟可能故障,容量可能不足,磁碟可能降級而影響其效能等等。即使磁碟區已掛載到 Pod 並由應用程式使用,之後仍可能發生問題,例如讀取/寫入 I/O 錯誤、檔案系統損毀、在 Kubernetes 外部意外卸載磁碟區等等。當發生類似情況時,很難偵錯和偵測根本原因。

磁碟區健康監控對 Kubernetes 使用者非常有益。它可以與 CSI 驅動程式溝通,以檢索底層儲存系統偵測到的錯誤。PVC 事件可以回報給使用者以採取行動。例如,如果磁碟區容量不足,他們可以請求磁碟區擴展以取得更多空間。

什麼是磁碟區健康監控?

CSI 磁碟區健康監控允許 CSI 驅動程式偵測底層儲存系統的異常磁碟區狀況,並將其回報為 PVC 或 Pod 上的事件。

監控磁碟區並回報磁碟區健康資訊事件的 Kubernetes 組件包括以下:

  • Kubelet 除了收集現有的磁碟區統計資訊外,還會監看該節點上 PVC 的磁碟區健康狀況。如果 PVC 具有異常的健康狀況,將會在 Pod 物件上回報一個事件,使用該 PVC。如果多個 Pod 使用相同的 PVC,則會在所有使用該 PVC 的 Pod 上回報事件。
  • 外部磁碟區健康監控控制器 監看 PVC 的磁碟區健康狀況,並在 PVC 上回報事件。

請注意,當此功能首次在 Kubernetes 1.19 版本中引入時,節點端磁碟區健康監控邏輯是一個外部代理程式。在 Kubernetes 1.21 中,節點端磁碟區健康監控邏輯已從外部代理程式移至 Kubelet 中,以避免重複呼叫 CSI 函數。隨著 1.21 版本的此項變更,為 Kubelet 中的磁碟區健康監控邏輯引入了一個新的 alpha 功能閘道 CSIVolumeHealth

目前,磁碟區健康監控功能僅提供資訊,因為它僅回報 PVC 或 Pod 上異常的磁碟區健康事件。使用者需要檢查這些事件並手動修復問題。此功能是 Kubernetes 未來以程式化方式偵測和解決磁碟區健康問題的墊腳石。

如何在我的 Kubernetes 叢集上使用磁碟區健康監控?

若要使用磁碟區健康監控功能,請先確認您使用的 CSI 驅動程式支援此功能。請參閱此 CSI 驅動程式文件 以找出哪些 CSI 驅動程式支援此功能。

若要從節點端啟用磁碟區健康監控,需要啟用 alpha 功能閘道 CSIVolumeHealth

如果 CSI 驅動程式從控制器端支援磁碟區健康監控功能,則有關異常磁碟區狀況的事件將會記錄在 PVC 上。

如果 CSI 驅動程式從控制器端支援磁碟區健康監控功能,並且在部署外部健康監控控制器時,enable-node-watcher 旗標設定為 true,使用者也可以取得有關節點故障的事件。當偵測到節點故障事件時,將會在 PVC 上回報一個事件,以指示使用此 PVC 的 Pod 位於故障節點上。

如果 CSI 驅動程式從節點端支援磁碟區健康監控功能,則有關異常磁碟區狀況的事件將會記錄在使用 PVC 的 Pod 上。

作為儲存廠商,我該如何在我的 CSI 驅動程式中新增磁碟區健康支援?

磁碟區健康監控包含兩個部分:

  • 外部磁碟區健康監控控制器從控制器端監控磁碟區健康狀況。
  • Kubelet 從節點端監控磁碟區健康狀況。

詳細資訊請參閱 CSI 規格Kubernetes-CSI 驅動程式開發人員指南

CSI host path 驅動程式 中有一個磁碟區健康狀況的範例實作。

控制器端磁碟區健康監控

若要瞭解如何部署外部磁碟區健康監控控制器,請參閱 CSI 文件中的 CSI external-health-monitor-controller

如果偵測到異常磁碟區狀況,外部健康監控控制器會呼叫 ListVolumesControllerGetVolume CSI RPC,並在 PVC 上回報包含訊息的 VolumeConditionAbnormal 事件。只有具有 LIST_VOLUMESVOLUME_CONDITION 控制器功能,或 GET_VOLUMEVOLUME_CONDITION 控制器功能的 CSI 驅動程式,才支援外部控制器中的磁碟區健康監控。

若要從控制器端實作磁碟區健康功能,CSI 驅動程式必須新增對新控制器功能的支援。

如果 CSI 驅動程式支援 LIST_VOLUMESVOLUME_CONDITION 控制器功能,則必須實作控制器 RPC ListVolumes,並在回應中回報磁碟區狀況。

如果 CSI 驅動程式支援 GET_VOLUMEVOLUME_CONDITION 控制器功能,則必須實作控制器 PRC ControllerGetVolume,並在回應中回報磁碟區狀況。

如果 CSI 驅動程式支援 LIST_VOLUMESGET_VOLUMEVOLUME_CONDITION 控制器功能,則外部健康監控控制器只會調用 ListVolumes CSI RPC。

節點端磁碟區健康監控

如果偵測到異常磁碟區狀況,Kubelet 會呼叫 NodeGetVolumeStats CSI RPC,並在 Pod 上回報包含訊息的 VolumeConditionAbnormal 事件。只有具有 VOLUME_CONDITION 節點功能的 CSI 驅動程式,才支援 Kubelet 中的磁碟區健康監控。

若要從節點端實作磁碟區健康功能,CSI 驅動程式必須新增對新節點功能的支援。

如果 CSI 驅動程式支援 VOLUME_CONDITION 節點功能,則必須在節點 RPC NodeGetVoumeStats 中回報磁碟區狀況。

接下來是什麼?

根據回饋和採用情況,Kubernetes 團隊計畫在 1.22 或 1.23 版本中將 CSI 磁碟區健康實作推進到 beta 階段。

我們也在探索如何在 Kubernetes 中使用磁碟區健康資訊進行程式化偵測和自動協調。

如何瞭解更多資訊?

若要瞭解磁碟區健康監控的設計細節,請閱讀 磁碟區健康監控 增強提案。

磁碟區健康監控控制器原始碼位於 https://github.com/kubernetes-csi/external-health-monitor

容器儲存介面文件 中也有關於磁碟區健康檢查的更多詳細資訊。

如何參與?

Kubernetes Slack 頻道 #csi 和任何 標準 SIG Storage 通訊頻道 都是聯繫 SIG Storage 和 CSI 團隊的好媒介。

我們非常感謝協助在 1.21 版本中發布此功能的貢獻者。我們要感謝 Yuquan Ren (NickrenREN) 在外部健康監控 repo 中實作了初始磁碟區健康監控控制器和代理程式,感謝 Ran Xu (fengzixu) 在 1.21 版本中將磁碟區健康監控邏輯從外部代理程式移至 Kubelet,並且我們特別感謝以下人員的精闢審閱:David Ashpole (dashpole)、Michelle Au (msau42)、David Eads (deads2k)、Elana Hashman (ehashman)、Seth Jennings (sjenning) 和 Jiawei Wang (Jiawei0227)。

對於有興趣參與 CSI 或 Kubernetes 儲存系統任何部分之設計及開發的人員,請加入 Kubernetes 儲存特別興趣小組 (SIG)。我們正在快速成長,隨時歡迎新的貢獻者。