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

卷健康監控 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出現異常健康狀況,將使用該PVC在Pod物件上報告一個事件。如果多個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主機路徑驅動程式中有一個卷健康狀況的示例實現。

控制器側卷健康監控

要了解如何部署外部卷健康監控控制器,請參閱CSI文件中的CSI外部健康監控控制器

如果檢測到異常卷狀況,外部健康監控控制器會呼叫`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)在外部健康監控倉庫中實現了最初的卷健康監控控制器和代理,感謝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)。我們正在快速發展,並始終歡迎新的貢獻者。