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

Kubernetes 1.27:kubectl apply 中更安全、效能更高的修剪

使用 kubectl apply 命令進行宣告式組態管理是建立或修改 Kubernetes 資源的黃金標準方法。然而,它帶來的一個挑戰是如何刪除不再需要的資源。在 Kubernetes 1.5 版本中,引入了 --prune 標記來解決此問題,讓 kubectl apply 可以自動清理先前應用但已從目前組態中移除的資源。

遺憾的是,現有的 --prune 實作存在設計缺陷,會降低其效能,並可能導致意外行為。主要問題源於先前 apply 操作未明確編碼先前套用的集合,因此需要容易出錯的動態探索。物件洩漏、不慎過度選擇資源以及與自訂資源的有限相容性是此實作的一些顯著缺點。此外,其與用戶端套用的耦合阻礙了使用者升級到更優越的伺服器端套用機制。

kubectl 1.27 版本引入了經過改進的修剪實作的 Alpha 版本,以解決這些問題。這個基於名為 ApplySet 概念的新實作,有望帶來更好的效能和安全性。

ApplySet 是一組與叢集上物件相關聯的資源,透過標準化標籤和註釋進行識別和組態。額外的標準化元數據允許準確識別叢集內的 ApplySet 成員物件,簡化了修剪等操作。

若要利用基於 ApplySet 的修剪,請設定 KUBECTL_APPLYSET=true 環境變數,並在您的 kubectl apply 調用中包含 --prune--applyset 標記

KUBECTL_APPLYSET=true kubectl apply -f <directory/> --prune --applyset=<name>

預設情況下,ApplySet 使用 Secret 作為父物件。但是,您也可以使用 ConfigMap,格式為 --applyset=configmaps/<name>。如果所需的 Secret 或 ConfigMap 物件尚不存在,kubectl 將為您建立它。此外,可以啟用自訂資源以用作 ApplySet 父物件。

ApplySet 實作基於新的底層規範,可以透過提高互通性來支援更高等級的生態系統工具。此規範的輕量級特性使這些工具能夠繼續使用現有的物件分組系統,同時選擇加入 ApplySet 的元數據慣例,以防止其他工具(例如 kubectl)造成意外變更。

基於 ApplySet 的修剪為先前 kubectl--prune 實作的缺點提供了一個有希望的解決方案,並且可以幫助簡化您的 Kubernetes 資源管理。請試用這項新功能,並與社群分享您的經驗——ApplySet 正在積極開發中,您的回饋非常寶貴!

其他資源

  • 如需更多關於如何使用基於 ApplySet 的修剪的資訊,請閱讀 Kubernetes 文件中的使用組態檔案宣告式管理 Kubernetes 物件
  • 若要深入了解此功能的技術設計,或學習如何在您自己的工具中實作 ApplySet 規範,請參閱 KEP 3659ApplySet:kubectl apply --prune 重新設計和畢業策略

如何參與?

如果您想參與 ApplySet 開發,可以透過 SIG CLI 與開發人員聯繫。若要提供有關該功能的意見回饋,請在 kubernetes/kubectl 儲存庫上提交錯誤報告請求增強功能