1. 程式人生 > 其它 >溫柔一刀,優雅且徹底地解除安裝Rancher HA

溫柔一刀,優雅且徹底地解除安裝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 和相關資源。經過測試發現,通過 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/)