前言
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
為此,筆者准備了一個 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/)