溫柔一刀,優雅且徹底地卸載Rancher HA

前言

Rancher 從 v2.5 開始,支持將 Rancher HA 安裝在任何經過 CNCF 認證的標準 K8s 發行版上,這個集羣可以使用上游 Kubernetes,也可以使用 Rancher 的 Kubernetes 發行版之一,也可以是來自 Amazon EKS 等提供商的託管 Kubernetes 集羣。無論安裝到哪種集羣上,Rancher 都推薦使用一個獨立的 K8S/K3S 集羣作爲 Rancher HA 的 Local 集羣,這樣 Rancher HA 不會和業務集羣相互影響。

如果在獨立的 Local 集羣上卸載 Rancher HA,一般的做法是將 Local 集羣刪掉,從而達到卸載 Rancher HA 的目的,這樣做的好處是比較簡單、數據清理的比較徹底。

但有些用戶將 Rancher HA 安裝到了某些業務或生產集羣上,這樣的話,就無法通過移除 Local 集羣去卸載 Rancher HA。我們需要找到一個辦法可以在不影響 Local 集羣運行的情況下卸載掉 Rancher HA。

Rancher 提供了一個卸載 Rancher HA 的工具:system-tools。我們可以藉助 system-tools 來將 Rancher HA 生成的 namespace 和其他資源移除。執行remove命令會移除以下資源:

  • Rancher 部署的命名空間,默認名稱是cattle-system。
  • Rancher 通過cattle.io/creator:norman標籤標記的serviceAccount、 clusterRoles和clusterRoleBindings。
  • 使用 Rancher v2.1.0 或更新版本創建的所有及資源都會被打上cattle.io/creator:norman的標籤。
  • Labels、annotations、finalizers。
  • Rancher Deployment。
  • 集羣、項目和用戶相關的 CRD。
  • management.cattle.io API Group 內創建的所有資源。

使用 Rancher v2.x 創建的所有 CRD。 但 system-tools 年久失修(最後一次更新於 2019 年 4 月 11 日),針對後續 Rancher 版本新增的一些 namespace 等資源並沒有被移除,所以導致我們沒有一個方法可以完全在 Local 集羣上卸載掉 Rancher HA。

卸載 Rancher HA

爲了在 Local 集羣上徹底卸載掉 Rancher HA,我們可以先篩選出哪些 namesaces 是由 Rancher HA 創建的,然後再通過 system-tools remove --kubeconfig <$KUBECONFIG> --namespace <NAMESPACE> 來刪除對應的 namespace 和相關資源。經過測試發現,通過 system-tools 移除 namespace 後,namespace 的狀態始終爲Terminating,還需要手動的移除掉.spec.finalizers和.metadata.finalizers,然後才能徹底的將 namespace 刪除。

爲此,筆者準備了一個 shell 腳本來完成以上的刪除流程:

注意:

  • 本腳本只基於 Rancher v2.5.8 上進行測試,理論上 v2.5.x 系列版本均支持。其他版本(例如:2.4.x)需要修改步驟 4 中對應的NS參數來設置要刪除的 namespace
  • 本腳本在 Local 集羣爲 k3s 和 rke 集羣上做過驗證,如 Local 集羣爲其他 K8s 集羣,需要確認步驟 4 中對應的NS參數來設置要刪除的 namespace
  • Rancher HA 會創建c-、p-、user- 開頭的 namespace,這些不需要用戶關注,當通過system-tools移除cattle-system會自動將這些 namespace 移除

1.下載腳本

root@ip-172-31-22-79:~# wget https://raw.githubusercontent.com/kingsd041/some_script/master/remove-rancher-ha/remove_r_ha.sh

2.在該主機上安裝kubectl、jq、system-tools,並且創建 kubeconfig 文件。

3.編輯腳本,設置 KUBE_CONFIG目錄

KUBE_CONFIG='/root/.kube/config'

4.編輯腳本,確認NS變量設置的 namespace 是否爲將要被刪除的 namespace,避免誤刪 namespace。

NS="cattle-system|*fleet*|rancher-operator-system|cattle-global-nt|cattle-global-data"

5.執行腳本,卸載 Rancher HA

root@ip-172-31-22-79:~# ./remove_r_ha.sh

cattle-system
cattle-global-data
cattle-global-nt
rancher-operator-system
fleet-clusters-system
fleet-local
cluster-fleet-local-local-1a3d67d0a899
fleet-system
fleet-default
cluster-fleet-default-c-9zwzq-dd029f17f988
Are you sure to remove the above namespace? [y/n] y
INFO[0000] Removing Rancher management plane in namespace: [cattle-system]
INFO[0000] Getting connection configuration
INFO[0000] Removing Cattle deployment
INFO[0000] Removed Cattle deployment succuessfully
INFO[0000] Removing ClusterRoleBindings
...
...

大約 5 分鐘,腳本執行完成。此時,可以通過kubectl get ns 來確認 Rancher HA 是否被卸載:

root@ip-172-31-22-79:~# kubectl get ns
NAME              STATUS   AGE
kube-public       Active   65m
default           Active   65m
kube-node-lease   Active   65m
kube-system       Active   65m

後記

雖然 Rancher v2.5 開始可以將 Rancher HA 安裝在任何經過 CNCF 認證的 K8s 集羣上,但還是建議大家在生產環境上將 Rancher HA 安裝在一個獨立的 Local 集羣上,這樣可以避免 Rancher HA 和業務集羣相互影響。如果你將 Rancher HA 安裝到了業務 K8s 集羣上,可以使用本文的方式去完美的卸載 Rancher HA,對原集羣不會有任何影響。

鳴謝

感謝 IT 老男孩 博文:強制刪除 Terminating 狀態的 namespace (原文鏈接:https://www.xtplayer.cn/kubernetes/forces-delete-terminated-namespace/)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章