只要你堅持,不放棄,問題總有解決的一天!
與chatgpt進行了幾次溝通,成功解決歷史遺留問題,成功從rancher中刪除了無效的叢集
如果您在 Rancher UI 中無法刪除無效的叢集,您可以通過 Rancher API 刪除它。以下是通過 Rancher API 刪除叢集的步驟:
curl -X DELETE \
'https://rancher.pkulaw.com:1900/v3/cluster/c-2vtcg' \
-H 'Authorization: Basic token-6nd4t:q58c7qcz67nrdz5s7p4gdwqzzs86b9sx9m24d96p5f6hb2vxmzt9c5'
例如:
curl -X DELETE \
'http://10.0.0.1/v3/cluster/c-i2gnt' \
-H 'Authorization: Basic abcdefghijklmnopqrstuvwxyz0123456789+=='
如果您在 Rancher UI 和通過 Rancher API 都無法刪除無效的叢集,這可能意味著該叢集已經在 Rancher 資料庫中被標記為刪除,但是 Rancher 資料庫中仍然存在該叢集的資訊。在這種情況下,您可以嘗試手動從 Rancher 資料庫中刪除該叢集資訊。
首先,您需要登入到 Rancher 伺服器,並開啟 Rancher 資料庫。下面是一些可能用到的命令:
sudo mysql -u root -p cattle
SHOW TABLES;
DESCRIBE TABLE_NAME;
在開啟 MySQL shell 後,您可以嘗試查詢和刪除叢集資訊。以下是可能的步驟:
SELECT id FROM cluster WHERE name = 'CLUSTER-NAME';
請將 CLUSTER-NAME 替換為要刪除的叢集的名稱。
2. 如果上述命令返回一個或多個 ID 值,則執行以下命令以刪除叢集的資訊:
DELETE FROM cluster WHERE id = 'CLUSTER-ID';
請將 CLUSTER-ID 替換為要刪除的叢集的 ID 值。
3. 如果您還需要刪除 Rancher 資料庫中與該叢集相關的其他資訊(例如,關聯的主機、pods 等),則可以根據需要執行其他 DELETE 命令。
4. 最後,退出 MySQL shell,並嘗試重新啟動 Rancher 伺服器或清除 Rancher 資料庫快取(如果您使用了 Rancher 的快取元件)。
請注意,直接從 Rancher 資料庫中刪除資訊可能會導致不可預知的影響,這種方法應該僅用於最後的資源銷燬步驟。建議在實施這些步驟之前,先備份 Rancher 資料庫。
如果您使用的是 RKE 部署的 Rancher,且您的 Rancher 系統沒有使用 MySQL 資料庫,則可以通過以下步驟刪除無效的叢集:
kubectl -n cattle-system
kubectl get clusters
kubectl delete clusters.management.cattle.io CLUSTER-NAME
退出系統名稱空間:
現在,您已經成功地從 RKE 部署的 Rancher 中刪除了無效的叢集。
請注意,通過上述步驟刪除叢集時,可能會丟失與該叢集相關的所有資料。因此,在執行此操作之前,請確保已經備份了 Rancher 資料庫和該叢集繫結的所有資料。
如果你通過RKE方式安裝Rancher,但未指定MySQL資料庫,則Rancher預設會使用內建的Embedded Database(嵌入式資料庫)。 需要注意的是,如果你選擇使用內建的Embedded Database,則你可以安裝Rancher Server並部署應用程式。然而,這並不適用於生產環境,因為內建的Embedded Database是不支援生產環境的。因此,最好是使用外部的MySQL資料庫。 如果你想使用外部的MySQL資料庫,可以在Rancher中指定MySQL資料庫的相關資訊,然後通過執行RKE命令建立管理節點和工作負載節點,並將Rancher Server安裝在該叢集中。
雖然Rancher的Embedded Database不適用於生產環境,但是如果你想檢視或操作它,可以通過以下步驟連線並進入Rancher Embedded Database資料庫: 1. 開啟Rancher伺服器所在的節點的命令列終端。 2. 執行以下命令以獲取Rancher Embedded Database的存取憑據:
sudo docker ps | grep 'rancher/server' | awk '{print $NF}' | xargs -I {} sudo docker exec {} env | grep CATTLE_ | grep MYSQL_ROOT_PASSWORD
3. 複製輸出中包含的MYSQL_ROOT_PASSWORD值。 4. 執行以下命令以啟動一個新的MySQL client容器並連線到Rancher Embedded Database:
sudo docker run -it --rm --link $(sudo docker ps | grep 'rancher/server' | awk '{print $NF}'):rancher-mysql \
mysql sh -c 'exec mysql -h"$RANCHER_MYSQL_SERVICE_HOST" -P"$RANCHER_MYSQL_SERVICE_PORT" -uroot -p"$MYSQL_ROOT_PASSWORD"'
很抱歉,我之前提供的方法有誤。clustercatalogentry 已經是 Rancher v2.5.8 中廢棄的 API 元素,在新版本中已經不再使用。
如果你在 Rancher v2.5.8 中存在無效的叢集,可以嘗試以下步驟來刪除這些叢集:
首先將當前執行的 kubectl 版本��級到最新版本,以確保相容性和最新的功能。
獲取所有已建立的 Rancher 叢集的名稱列表:
kubectl get clusters.management.cattle.io -n cattle-system -o jsonpath="{range .items[*]}{.metadata.name} {'\n'}{end}"
確認那些是無效的叢集,將它們的名稱記錄下來。
通過 Kubernetes 命令刪除無效的 Rancher 叢集:
kubectl delete clusters.management.cattle.io <cluster_name> -n cattle-system
其中 <cluster_name> 為無效的 Rancher 叢集的名稱。
請注意,這將刪除叢集及其所有底層資源,因此請確保你要刪除的叢集是無效的,並且在 Rancher UI 中不能正常使用。
執行以上步驟後,你可以再次在 Rancher UI 中檢查叢集列表並確認無效叢集已被刪除。
是的,kubectl delete clusters.management.cattle.io <cluster_name> -n cattle-system 命令支援強制刪除標誌 -f/--force 。
如果你遇到刪除 Rancher 叢集時出現錯誤,比如在刪除過程中叢集被鎖定,或者存在意外資源洩漏時,你可以使用 -f/--force 標誌來強制刪除指定的 Rancher 叢集。使用 -f/--force 標誌將跳過所有錯誤,使用預設設定刪除指定的 Rancher 叢集。
請注意,在使用 -f/--force 標誌時,需要謹慎操作。強制刪除可能會導致資源損失或者 Rancher 系統出現問題,因此請在確認所有操作之前備份你的資料,確保你已經準備好了強制刪除可能帶來的後果。
如果執行 kubectl delete clusters.management.cattle.io <cluster_name> -n cattle-system --force 命令後,返回 "cluster.management.cattle.io "<cluster_name>" force deleted",說明該 Rancher 叢集已經被成功刪除。
但是,有時 Rancher UI 可能會由於快取或其他原因而延遲響應。你可��嘗試清除瀏覽器的快取並重新登入 Rancher UI,或者在 Rancher UI 中嘗試重新載入頁面。
如果 Rancher UI 已經重新整理並且 Rancher 叢集仍然存在,你可以嘗試重新啟動 Rancher Server Kubernetes 叢集,以便重新載入和清除 Rancher Server 的快取。你可以使用以下命令重啟 Rancher Server Kubernetes 叢集:
kubectl -n cattle-system rollout restart deploy/rancher
請注意,重新啟動 Rancher Server Kubernetes 叢集將導致 Rancher Server 服務在整個過程中不可用,直到重啟完成。因此,你應該在維護開銷、業務需求和服務可用性之間做出權衡,謹慎執行重新啟動操作。
這可能是由於 Rancher 中的一些 wrangler 後臺任務沒有成功處理刪除該叢集的請求。您可以嘗試在 Rancher 伺服器上手動刪除相關資源,以便清理 Rancher 的狀態。
以下是手動刪除 Rancher 中無效叢集的步驟:
登入 Rancher 伺服器。
在命令列中執行以下命令以查詢與無效叢集相關的名稱空間:
kubectl get namespace | grep <cluster_name>
執行以下命令以刪除與無效叢集相關的所有名稱空間:
kubectl delete namespace <namespace_name>
然後,重新啟動 Rancher 伺服器:
sudo docker restart <rancher_container_id>
在 Rancher UI 中檢查叢集是否已被刪除。如果還沒有被刪除,請再次執行以上命令,以確保 Rancher 中的所有相關資源都已清理。
注意:刪除名稱空間會將所有繫結到該名稱空間的資源都刪除。因此,請務必確保要刪除的名稱空間只包含與無效叢集相關的資源。
如果叢集在 Rancher UI 上被刪除了,但是在 Kubernetes 中一直顯示 Terminating,這可能是由於在叢集上還存在未完成的資源,例如 Pod、Deployment 等。
您可以嘗試在 Kubernetes 中手動刪除這些資源以完成該叢集的刪除。以下是一個簡單的清理步驟:
使用以下命令列出叢集中的所有名稱空間:
kubectl get namespaces
對於每個與要刪除的叢集相關的名稱空間,執行以下命令以刪除其上所有資源:
kubectl delete all --all -n <namespace>
等待一段時間以確保所有資源都已刪除(可能需要幾分鐘或更長時間)。
如果在列表中列出叢集時,該叢集顯示 Terminating,則可以使用下面的命令在 Kubernetes 中手動刪除它:
kubectl delete cluster <cluster-id>
其中
kubectl get clusters.management.cattle.io
最後,請注意,刪除叢集可能需要一段時間才能完成,具體時間取決於叢集中存在的資源數量。請耐心等待一段時間以確保叢集已被完全刪除。
現在,您已經在 etcd pod 的 shell 中,使用以下命令,檢視是否存在無法刪除的無效叢集資料:
etcdctl get / --prefix=true --keys-only | grep "/clusters/"
使用以下命令,備份 etcd 資料:
etcdctl snapshot save /root/snapshot20230512.db
這將建立一個名為 snapshot.db 的備份檔案,我們將使用它來還原 etcd 資料,以防意外刪除其他資料。
刪除上面的無效叢集中的資源
ETCDCTL_API=3 etcdctl del /path/to/invalid/cluster --prefix=true
請確保將 /path/to/invalid/cluster 替換為實際的無效叢集的資料路徑。