作者:尹珉,KubeSphere Ambaasador&Contributor,KubeSphere 社群使用者委員會杭州站站長。
引言
隨著 Kubernetes 社群的不斷髮展,即將迎來 Kubernetes 1.30 版本的迭代。在早先的 1.24 版本中,社群作出一個重要決策:不再預設整合 Docker 作為容器執行時,即取消了對 Docker 的預設支援。這就像咱們家廚房換了個新灶頭,雖然廚藝的本質沒變,但用起來感覺肯定不一樣。這篇文章就帶你摸透這個變化,直擊 Kubernetes 1.24+ 版本拋棄 Docker 後的影響,同時手把手教你如何藉助 KubeKey 這個神器,讓你在給 Kubernetes “裝修升級”的過程中既穩又順,還能把 Docker 那些貼心好用的功能保留下來。
Docker 移除帶來的潛在風險分析
工具鏈與生態相容性
- 對於大量使用 Jenkins 等 CI/CD 工具的企業而言,原先基於 Docker 的映象構建、推送和拉取流程可能需要重構。Jenkinsfile 中的 Docker 構建步驟需調整為相容 containerd 的方式進行,否則可能造成流水線中斷。
- 監控系統和其他依賴於 Docker API 的周邊工具需要進行改造或更換,以適應新的容器執行時環境,這涉及到了大量的驗證工作和可能的二次開發成本。
開發環境一致性
開發者們習慣了在本地使用 Docker 進行快速迭代和測試,移除 Docker 後,需要重新適應 containerd 或尋找相容 Docker API 的替代方案,以保持開發環境與生產環境的一致性。
現有運維指令碼失效
許多自動化指令碼、運維命令和 Helm Chart 等資原始檔可能直接引用了 Docker 命令或依賴於 Docker 的特定行為,這些都需要逐步審查和適配。
升叢集時手動保留 Docker 特性的成本分析
運維複雜度增加
- 需要在 Kubernetes 叢集中手動整合第三方外掛或其他相容方案以模擬 Docker 的執行時環境,這要求運維團隊具備更高的技術水平和對 Kubernetes 內部機制的深入瞭解。
- 需要密切關注 Kubernetes 更新與 Docker 相容性之間的差異,每次升級 Kubernetes 都可能導致與 Docker 整合的部分出現問題,需要額外的時間和精力進行維護和除錯。
叢集規模操作成本劇增
- 假設面臨如 100 個節點的叢集時,每個節點上的容器執行時切換都需要單獨進行,這意味著至少需要分別在 100 個節點上執行啟停容器執行時的操作,耗費巨大的人力和時間成本。
- 對於大型叢集,這種逐一操作的管理模式極其低效且容易出錯,可能需要編寫複雜的指令碼或者使用批次管理工具,進一步增加實施難度。
測試驗證與恢復預案
若操作過程中遇到問題,需要有完備的回滾策略和恢復預案,準備應對可能發生的各類異常狀況,以防業務長時間受到影響。
總結: 因此,在 Kubernetes 1.24 之後,手動保留 Docker 特性並進行大規模節點執行時切換是一項極具挑戰的任務,不僅會導致高昂的操作成本,還可能帶來較大的業務風險。相比之下,尋求平滑過渡和相容方案(如 KubeKey)成為更具價效比的選擇。
什麼是 Kubekey
KubeKey 是一個開源的輕量級工具,用於部署 Kubernetes 叢集。它提供了一種靈活、快速、方便的方式來安裝 Kubernetes/K3s、Kubernetes/K3s 和 KubeSphere,以及相關的雲原生附加元件。它也是擴充套件和升級叢集的有效工具。此外,KubeKey 還支援定製離線包(artifact),方便使用者在離線環境下快速部署叢集。
為什麼選擇 Kubekey?
KubeKey 由 Go 語言開發,使用便捷、輕量,支援多種主流 Linux 發行版。KubeKey 支援多種叢集部署模式,例如 All-in-One、多節點、高可用以及離線叢集部署。KubeKey 也支援支援快速構建離線安裝包,加速離線交付場景下的叢集交付效率。KubeKey 實現多節點並行安裝,且利用 Kubeadm 對叢集和節點進行初始化,極大地節省了叢集部署時間,同時也遵循了 Kubernetes 社群主流叢集部署方法。KubeKey 提供內建高可用模式,支援一鍵部署高可用 Kubernetes 叢集。
升級實操
etcd 資料備份
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
snapshot save <backup-file-location>
下載 Kubekey 工具
版本:v3.1.0-rc.2 (這個版本當前是穩定已測,即將釋出 v3.1.0)。
export KKZONE=cn
支援手動下載:https://github.com/kubesphere/kubekey/releases。
curl -sfL https://get-kk.kubesphere.io | sh -
檢查當前叢集狀態
kubectl get node -o wide
準備叢集配置檔案
如果建立叢集時的配置檔案存在,本步驟可跳過。
- 建立當前叢集配置
./kk create config [--with-kubernetes version] [(-f | --filename) path]
- 填入真實叢集資訊
修改 configmap
- 修改 kubeadm-config
注意:確保配置中的 featuregate 在新版本中沒有被移除。
kubectl -n kube-system edit cm kubeadm-config
- 修改 kubelet-config-1.23
注意:確保配置中的 featuregate 在新版本中沒有被移除。
kubectl -n kube-system edit cm kubelet-config-1.23
開始升級
./kk upgrade -f sample.yaml --with-kubernetes v1.24.17 --skip-dependency-check
驗證叢集版本
kubectl get node -A -o wide
驗證容器執行時
kubectl get nodes -o json | jq '.items[].status.nodeInfo.containerRuntimeVersion'
結尾彩蛋
正如我們在這篇文章中所揭示的,Kubernetes 1.24 版本及其後續迭代雖逐步摒棄了對 Docker 的直接依賴,但這並不意味著我們必須捨棄熟悉的 Docker 工作流。透過 KubeKey 這樣的強大工具,我們可以享受到 Kubernetes 最新版本的種種改進,同時還能優雅地保留 Docker 的某些關鍵特性,讓升級之路變得更為順暢。勇敢擁抱變化,善用工具的力量,每一次的技術升級都將成為我們打造高效、穩定、可擴充套件基礎設施的寶貴經驗。
本文由部落格一文多發平臺 OpenWrite 釋出!