當叢集升級失敗時,如何將 EKS Anywhere 叢集返回工作狀態?

4 分的閱讀內容
0

我想要使用 eksctl 命令來升級 Amazon Elastic Kubernetes Service (Amazon EKS) Anywhere 管理叢集。不過,升級程序會失敗或在完成前中斷。

解決方法

升級 Amazon EKS Anywhere 管理叢集時,程序包括兩個階段:驗證階段和升級階段。升級失敗的復原步驟取決於升級中斷的哪個階段。

驗證階段

當您升級 EKS Anywhere 叢集時,eksctl 會執行一組預檢查,以確保叢集已就緒。這會發生在升級之前,eksctl 會修改叢集以符合更新的規格。

當 eksctl 執行這些檢查時,您會看到類似下列範例的訊息:

Performing setup and validations
   Connected to server
   Authenticated to vSphere
   Datacenter validated
   Network validated
Creating template. This might take a while.
   Datastore validated
   Folder validated
   Resource pool validated
   Datastore validated
   Folder validated
   Resource pool validated
   Datastore validated
   Folder validated
   Resource pool validated
   Machine config tags validated
   Control plane and Workload templates validated
   Vsphere provider validation
   Validate certificate for registry mirror
   Control plane ready
   Worker nodes ready
   Nodes ready
   Cluster CRDs ready
   Cluster object present on workload cluster
   Upgrade cluster kubernetes version increment
   Validate authentication for git provider
   Validate immutable fields
   Upgrade preflight validations pass

接下來,eksctl 會繼續驗證在管理叢集中執行的 CAPI 控制器。如果這些控制器中的任何一個需要升級,則 eksctl 也會升級它們。在此程序期間,eksctl 也會建立 KinD 啟動程序叢集來升級管理叢集。您會看到反映此程序的訊息:

Ensuring etcd CAPI providers exist on management cluster before
Pausing EKS-A cluster controller reconcile
Pausing GitOps cluster resources reconcile
Upgrading core components
Creating bootstrap cluster
Provider specific pre-capi-install-setup on bootstrap cluster
Provider specific post-setup
Installing cluster-api providers on bootstrap cluster

如果這些檢查或動作中的任何一項失敗,則升級會停止,而您的管理叢集會保持原始版本相同。

如需有關失敗之特定檢查的詳細資訊,請檢查 eksctl 記錄。

驗證階段發生的問題

若要從此階段的失敗復原,請完成下列步驟:

1.    疑難排解並修正導致驗證失敗的問題。

2.    再次執行 eksctl anywhere 叢集升級命令。使用 -v9 旗標是最佳作法。

升級階段

在升級階段,eksctl 會執行下列主要動作:

  • 將您的管理叢集 CAPI 物件 (例如機器、KubeadmControlPlane 和 EtcdadmCluster) 移至啟動程序叢集
  • 升級 etcd 和控制平面元件
  • 升級工作者節點元件

在此階段中,您會看到類似下列範例的訊息:

Moving cluster management from bootstrap to workload cluster
Applying new EKS-A cluster resource
Resuming EKS-A controller reconcile
Updating Git Repo with new EKS-A cluster spec
GitOps field not specified, update git repo skipped
Forcing reconcile Git repo with latest commit
GitOps not configured, force reconcile flux git repo skipped
Resuming GitOps cluster resources kustomization
Writing cluster config file
    Cluster upgraded!

eksctl 使用滾動程序來就地執行升級,類似於 Kubernetes 部署。它也會透過此升級建立新的虛擬機器 (VM),然後移除舊的虛擬機器。此程序會套用至每個元件,一次套用一個元件,直到升級所有控制平面元件為止。

如果虛擬機器無法執行,則升級會失敗,並在設定的逾時間隔後停止。滾動處理程序會讓舊的虛擬機器保持執行,以確保叢集保持就緒狀態。

升級階段期間的問題

若要在此階段從失敗中復原,請完成下列步驟:

1.    疑難排解並修正導致升級失敗的問題。如需失敗的詳細資訊,請檢查 eksctl 記錄檔。

2.    為了促進復原過程,請設置一個環境變量:

  • **CLUSTER_NAME:**叢集的名稱
  • CLITOOLS_CONT:在升級中斷後,執行環境中留下的image cli-tools 的容器名稱
  • **KINDKUBE:**您用來存取 KinD 啟動程序叢集的 Kubeconfig 檔案
  • **MGMTKUBE:**您用來存取管理叢集的 Kubeconfig 檔案
  • EKSA_VSPHERE_USERNAME 和 **EKSA_VSPHERE_PASSWORD:**存取 vCenter 的憑證

請參閱下列這些變數範例:

CLUSTER_NAME=cluster3
CLITOOLS_CONT=eksa_1681572481616591501
KINDKUBE=$CLUSTER_NAME/generated/${CLUSTER_NAME}.kind.kubeconfig
MGMTKUBE=$CLUSTER_NAME/$CLUSTER_NAME-eks-a-cluster.kubeconfig
EKSA_VSPHERE_USERNAME=xxxxx
EKSA_VSPHERE_PASSWORD=yyyyy

3.    確定您的管理叢集 CAPI 元件 (例如機器和叢集) 處於就緒狀態。此外,請確定管理叢集中的 kubeApi-server 具有回應能力。若要這麼做,請執行下列命令:

kubectl --kubeconfig $KINDKUBE -n eksa-system get machines
docker exec -i $CLITOOLS_CONT clusterctl describe cluster cluster3  --kubeconfig $KINDKUBE -n eksa-system
kubectl --kubeconfig $MGMTKUBE -n kube-system get node

您會收到類似下列範例的輸出:

NAME                            CLUSTER    NODENAME                        PROVIDERID                                       PHASE     AGE     VERSION
cluster3-2snw8                  cluster3   cluster3-2snw8                  vsphere://4230efe1-e1f5-c8e5-9bff-12eca320f5db   Running   3m13s   v1.23.17-eks-1-23-19
cluster3-etcd-chkc5             cluster3                                   vsphere://4230826c-b25d-937a-4728-3e607e6af579   Running   4m14s
cluster3-md-0-854976576-tw6hr   cluster3   cluster3-md-0-854976576-tw6hr   vsphere://4230f2e5-0a4b-374c-f06b-41ac1f80e41f   Running   4m30s   v1.22.17-eks-1-22-24

$ docker exec -i $CLITOOLS_CONT clusterctl describe cluster cluster3  --kubeconfig $KINDKUBE -n eksa-system
NAME                                               READY  SEVERITY  REASON  SINCE  MESSAGE
Cluster/cluster3                                   True                     49s
├─ClusterInfrastructure - VSphereCluster/cluster3  True                     4m53s
├─ControlPlane - KubeadmControlPlane/cluster3      True                     49s
│ └─Machine/cluster3-2snw8                         True                     2m51s
└─Workers
  ├─MachineDeployment/cluster3-md-0                True                     4m53s
  │ └─Machine/cluster3-md-0-854976576-tw6hr        True                     4m53s
  └─Other
    └─Machine/cluster3-etcd-chkc5                  True                     3m55s

$ kubectl --kubeconfig $MGMTKUBE -n kube-system get node
NAME                             STATUS   ROLES                  AGE   VERSION
cluster3-md-0-854976576-tw6hr    Ready    [none]                 18m   v1.22.17-eks-a51510b
cluster3-2snw8                   Ready    control-plane,master   19m   v1.23.17-eks-a51510b

4.    備份您的管理叢集 CAPI 元件:

mkdir ${CLUSTER_NAME}-backup
docker exec -i $CLITOOLS_CONT clusterctl move --to-directory ${CLUSTER_NAME}-backup  --kubeconfig $KINDKUBE -n eksa-system

5.    將管理叢集 CAPI 元件移回管理叢集:

$ docker exec -i $CLITOOLS_CONT clusterctl move --to-kubeconfig $MGMTKUBE  --kubeconfig $KINDKUBE -n eksa-system
Performing move...
Discovering Cluster API objects
Moving Cluster API objects Clusters=1
Moving Cluster API objects ClusterClasses=0
Creating objects in the target cluster
Deleting objects from the source cluster

您會收到類似下列範例的輸出:

$ docker exec -i $CLITOOLS_CONT clusterctl move --to-kubeconfig $MGMTKUBE  --kubeconfig $KINDKUBE -n eksa-system
Performing move...
Discovering Cluster API objects
Moving Cluster API objects Clusters=1
Moving Cluster API objects ClusterClasses=0
Creating objects in the target cluster
Deleting objects from the source cluster

6.    確定管理叢集 CAPI 元件 (例如機器和叢集) 不再位於 KinD 啟動程序叢集中。確認它們顯示在管理叢集中。若要執行此操作,請執行下列命令:

kubectl --kubeconfig $KINDKUBE -n eksa-system get cluster -n eksa-system
kubectl --kubeconfig $MGMTKUBE get machines -n eksa-system

您會收到類似下列範例的輸出:

$ kubectl --kubeconfig $KINDKUBE -n eksa-system get cluster -n eksa-system
No resources found in eksa-system namespace.

$ kubectl --kubeconfig $MGMTKUBE get machines -n eksa-system
NAME                           CLUSTER    NODENAME                       PROVIDERID                                       PHASE     AGE     VERSION
cluster2-4n7qd                 cluster2   cluster2-4n7qd                 vsphere://4230fb07-2823-3474-c41f-b7223dec3089   Running   2m27s   v1.23.17-eks-1-23-19
cluster2-etcd-h4tpl            cluster2                                  vsphere://42303b36-1991-67a9-e942-dd9959760649   Running   2m27s
cluster2-md-0-fd6c558b-6cfvq   cluster2   cluster2-md-0-fd6c558b-6cfvq   vsphere://423019a3-ad3f-1743-e7a8-ec8772d3edc2   Running   2m26s   v1.22.17-eks-1-22-24

7.    再次執行升級。使用標誌 --force-cleanup -v9 標誌:

eksctl anywhere upgrade cluster -f cluster3/cluster3-eks-a-cluster.yaml --force-cleanup -v9

相關資訊

升級 vSphere、CloudStack、Nutanix 或 Snow 叢集

EKS-A 疑難排解

叢集 API 手冊 (位於 Kubernetes 網站上)

AWS 官方
AWS 官方已更新 1 年前