Kubernetes 升級不棄 Docker:KubeKey 的絲滑之道

kubesphere發表於2024-04-09

作者:尹珉,KubeSphere Ambaasador&Contributor,KubeSphere 社群使用者委員會杭州站站長。

引言

隨著 Kubernetes 社群的不斷髮展,即將迎來 Kubernetes 1.30 版本的迭代。在早先的 1.24 版本中,社群作出一個重要決策:不再預設整合 Docker 作為容器執行時,即取消了對 Docker 的預設支援。這就像咱們家廚房換了個新灶頭,雖然廚藝的本質沒變,但用起來感覺肯定不一樣。這篇文章就帶你摸透這個變化,直擊 Kubernetes 1.24+ 版本拋棄 Docker 後的影響,同時手把手教你如何藉助 KubeKey 這個神器,讓你在給 Kubernetes “裝修升級”的過程中既穩又順,還能把 Docker 那些貼心好用的功能保留下來。

file

Docker 移除帶來的潛在風險分析

工具鏈與生態相容性

  1. 對於大量使用 Jenkins 等 CI/CD 工具的企業而言,原先基於 Docker 的映象構建、推送和拉取流程可能需要重構。Jenkinsfile 中的 Docker 構建步驟需調整為相容 containerd 的方式進行,否則可能造成流水線中斷。
  2. 監控系統和其他依賴於 Docker API 的周邊工具需要進行改造或更換,以適應新的容器執行時環境,這涉及到了大量的驗證工作和可能的二次開發成本。

開發環境一致性

開發者們習慣了在本地使用 Docker 進行快速迭代和測試,移除 Docker 後,需要重新適應 containerd 或尋找相容 Docker API 的替代方案,以保持開發環境與生產環境的一致性。

現有運維指令碼失效

許多自動化指令碼、運維命令和 Helm Chart 等資原始檔可能直接引用了 Docker 命令或依賴於 Docker 的特定行為,這些都需要逐步審查和適配。

升叢集時手動保留 Docker 特性的成本分析

運維複雜度增加

  1. 需要在 Kubernetes 叢集中手動整合第三方外掛或其他相容方案以模擬 Docker 的執行時環境,這要求運維團隊具備更高的技術水平和對 Kubernetes 內部機制的深入瞭解。
  2. 需要密切關注 Kubernetes 更新與 Docker 相容性之間的差異,每次升級 Kubernetes 都可能導致與 Docker 整合的部分出現問題,需要額外的時間和精力進行維護和除錯。

叢集規模操作成本劇增

  1. 假設面臨如 100 個節點的叢集時,每個節點上的容器執行時切換都需要單獨進行,這意味著至少需要分別在 100 個節點上執行啟停容器執行時的操作,耗費巨大的人力和時間成本。
  2. 對於大型叢集,這種逐一操作的管理模式極其低效且容易出錯,可能需要編寫複雜的指令碼或者使用批次管理工具,進一步增加實施難度。

測試驗證與恢復預案

若操作過程中遇到問題,需要有完備的回滾策略和恢復預案,準備應對可能發生的各類異常狀況,以防業務長時間受到影響。

總結: 因此,在 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

file

準備叢集配置檔案

如果建立叢集時的配置檔案存在,本步驟可跳過。

  1. 建立當前叢集配置
./kk create config [--with-kubernetes version] [(-f | --filename) path]
  1. 填入真實叢集資訊

file

修改 configmap

  1. 修改 kubeadm-config

注意:確保配置中的 featuregate 在新版本中沒有被移除。

kubectl -n kube-system edit cm kubeadm-config

file

  1. 修改 kubelet-config-1.23

注意:確保配置中的 featuregate 在新版本中沒有被移除。

kubectl -n kube-system edit cm kubelet-config-1.23

file

開始升級

./kk upgrade -f sample.yaml --with-kubernetes v1.24.17 --skip-dependency-check

驗證叢集版本

kubectl get node -A -o wide

file

驗證容器執行時

kubectl get nodes -o json | jq '.items[].status.nodeInfo.containerRuntimeVersion'

file

結尾彩蛋

正如我們在這篇文章中所揭示的,Kubernetes 1.24 版本及其後續迭代雖逐步摒棄了對 Docker 的直接依賴,但這並不意味著我們必須捨棄熟悉的 Docker 工作流。透過 KubeKey 這樣的強大工具,我們可以享受到 Kubernetes 最新版本的種種改進,同時還能優雅地保留 Docker 的某些關鍵特性,讓升級之路變得更為順暢。勇敢擁抱變化,善用工具的力量,每一次的技術升級都將成為我們打造高效、穩定、可擴充套件基礎設施的寶貴經驗。

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章