這篇文章已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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。
如果偵測到異常磁碟區狀況,外部健康監控控制器會呼叫 ListVolumes
或 ControllerGetVolume
CSI RPC,並在 PVC 上回報包含訊息的 VolumeConditionAbnormal 事件。只有具有 LIST_VOLUMES
和 VOLUME_CONDITION
控制器功能,或 GET_VOLUME
和 VOLUME_CONDITION
控制器功能的 CSI 驅動程式,才支援外部控制器中的磁碟區健康監控。
若要從控制器端實作磁碟區健康功能,CSI 驅動程式必須新增對新控制器功能的支援。
如果 CSI 驅動程式支援 LIST_VOLUMES
和 VOLUME_CONDITION
控制器功能,則必須實作控制器 RPC ListVolumes
,並在回應中回報磁碟區狀況。
如果 CSI 驅動程式支援 GET_VOLUME
和 VOLUME_CONDITION
控制器功能,則必須實作控制器 PRC ControllerGetVolume
,並在回應中回報磁碟區狀況。
如果 CSI 驅動程式支援 LIST_VOLUMES
、GET_VOLUME
和 VOLUME_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)。我們正在快速成長,隨時歡迎新的貢獻者。