將應用程式移轉至新節點群組 - Amazon EKS

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將應用程式移轉至新節點群組

此主題會說明如何建立新的節點群組,將現有的應用程式從容遷移至新群組,接著從叢集移除舊的節點群組。您可以使用 eksctl 或 AWS Management Console遷移至新的節點群組。

eksctl
使用 eksctl 將應用程式遷移至新的節點群組

如需有關使用 eksctl 進行移轉的詳細資訊,請參閱文件中的非受管節點群組。eksctl

此程序需要 eksctl 版本 0.189.0 或更新版本。您可使用以下命令檢查您的版本:

eksctl version

如需有關安裝或更新 eksctl 的指示,請參閱 eksctl 文件中的 Installation 一節。

注意

此程序只適用於使用 eksctl 所建立的叢集和節點群組。

  1. 擷取現有節點群組的名稱,使用叢集名稱取代 my-cluster

    eksctl get nodegroups --cluster=my-cluster

    範例輸出如下。

    CLUSTER NODEGROUP CREATED MIN SIZE MAX SIZE DESIRED CAPACITY INSTANCE TYPE IMAGE ID default standard-nodes 2019-05-01T22:26:58Z 1 4 3 t3.medium ami-05a71d034119ffc12
  2. 使用以下命令啟動具備 eksctl 的新節點群組。在命令中,替換 範例值 用你自己的價值觀。版本編號不能比控制平面的 Kubernetes 版本還要舊。也不能為比控制平面的 Kubernetes 版本舊兩個版本以上的次要版本。建議使用與控制平面相同的版本。

    IMDS如果下列情況成立,我們建議您封鎖Pod存取:

    • 您計劃將IAM角色指派給所有Kubernetes服務帳戶,以便Pods只有他們需要的最低權限。

    • 叢集Pods中的否因其他原因而需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS),例如擷取目前的執行個體 AWS 區域。

    如需詳細資訊,請參閱‬限制存取指派給工作節點的執行個體設定檔‭

    若要封鎖Pod存取IMDS,請將選--disable-pod-imds項新增至下列命令。

    注意

    如需更多可用旗標及其描述的資訊,請參閱 https://eksctl.io/

    eksctl create nodegroup \ --cluster my-cluster \ --version 1.30 \ --name standard-nodes-new \ --node-type t3.medium \ --nodes 3 \ --nodes-min 1 \ --nodes-max 4 \ --managed=false
  3. 之前的命令完成時,使用下列命令來確認所有節點已達到 Ready 狀態:

    kubectl get nodes
  4. 使用下列命令來刪除原始的節點群組。在命令中,將每個 example value 取代為您的叢集和節點群組名稱:

    eksctl delete nodegroup --cluster my-cluster --name standard-nodes-old
AWS Management Console and AWS CLI
使用 AWS Management Console 和將您的應用程式移轉至新節點群組 AWS CLI
  1. 依照 建立自我管理的 Amazon Linux 節點 中概述的步驟啟動新的節點群組。

  2. 當當堆疊已完成建立時,從主控台將其選取,然後選擇 Outputs (輸出)

  3. 記錄已建立之節點群組的。NodeInstanceRole您需要這個功能才能將新的 Amazon EKS 節點新增至叢集。

    注意

    如果您將任何其他IAM原則附加至舊節點群組IAM角色,請將這些相同的原則附加至新的節點群組IAM角色,以便在新群組上維護該功能。例如,如果為 Kubernetes Cluster Autoscaler 新增許可,則適用此操作。

  4. 更新兩個節點群組的安全群組,使其能夠互相通訊。如需詳細資訊,請參閱檢視叢集的 Amazon EKS 安全群組需求

    1. 記錄兩個節點群組的安全性群組。IDs這顯示為 AWS CloudFormation 堆棧輸出中的NodeSecurityGroup值。

      您可以使用下列 AWS CLI 命令IDs從堆疊名稱取得安全性群組。在這些命令中 AWS CloudFormation ,oldNodes是舊節點堆疊的堆疊名稱,newNodes也是您要移轉到的堆疊名稱。使用您自己的值取代每一個 ‭example value‬。

      oldNodes="old_node_CFN_stack_name" newNodes="new_node_CFN_stack_name" oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text) newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text)
    2. 新增輸入規則至每個節點安全群組,使其接受彼此的流量。

      下列 AWS CLI 命令會將輸入規則新增至每個安全性群組,以允許來自其他安全性群組的所有通訊協定上的所有流量。此組態可讓每個節點群組中的 Pods 在您將工作負載遷移至新群組時互相通訊。

      aws ec2 authorize-security-group-ingress --group-id $oldSecGroup \ --source-group $newSecGroup --protocol -1 aws ec2 authorize-security-group-ingress --group-id $newSecGroup \ --source-group $oldSecGroup --protocol -1
  5. 編輯aws-auth組態映射以對應中的新節點執行個體角色RBAC。

    kubectl edit configmap -n kube-system aws-auth

    為新節點群組新增 mapRoles 項目。如果您的叢集位於 AWS GovCloud (美國東部) 或 AWS GovCloud (美國西部) AWS 區域,請取代arn:aws:為. arn:aws-us-gov:

    apiVersion: v1 data: mapRoles: | - rolearn: ARN of instance role (not instance profile) username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes> - rolearn: arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-U11V27W93CX5 username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes

    ARN of instance role (not instance profile)程式碼片段取代為您在上一個步驟中記錄的NodeInstanceRole值。接著,儲存並關閉檔案以套用更新的 configmap。

  6. 注意節點狀態並等待新的節點加入叢集和達到 Ready 狀態。

    kubectl get nodes --watch
  7. (選用) 如果您使用的是 Kubernetes Cluster Autoscaler,請將部署縮減為零 (0) 個複本以避免衝突的擴展動作。

    kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
  8. 使用以下命令污染每個您想要用 NoSchedule 移除的節點。這樣就不會在您要取代的節點上排程或重新排程新的 Pods。如需詳細資訊,請參閱 Kubernetes 文件中的污點和容差

    kubectl taint nodes node_name key=value:NoSchedule

    如果要將節點升級至新的 Kubernetes 版本,您可以使用以下程式碼片段識別並標示特定 Kubernetes 版本 (在此情況下為 1.28) 的所有節點。版本編號不能比控制平面的 Kubernetes 版本還要舊。也不能為比控制平面的 Kubernetes 版本舊兩個以上的次要版本。建議使用與控制平面相同的版本。

    K8S_VERSION=1.28 nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}") for node in ${nodes[@]} do echo "Tainting $node" kubectl taint nodes $node key=value:NoSchedule done
  9. 判斷叢集的DNS提供者。

    kubectl get deployments -l k8s-app=kube-dns -n kube-system

    範例輸出如下。此群集正在用CoreDNS於DNS解析,但您的集群可以kube-dns返回):

    NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE coredns 1 1 1 1 31m
  10. 如果您目前的部署執行少於 2 個複本,請將部署擴增為 2 個複本。如果您先前的命令輸出傳回該項目,請以 kubedns 取代 coredns

    kubectl scale deployments/coredns --replicas=2 -n kube-system
  11. 使用以下命令清空您想要從叢集移除的每個節點:

    kubectl drain node_name --ignore-daemonsets --delete-local-data

    如果要將節點升級至新的 Kubernetes 版本,請使用以下程式碼片段識別並耗盡特定 Kubernetes 版本 (在此情況下為 1.28) 的所有節點。

    K8S_VERSION=1.28 nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}") for node in ${nodes[@]} do echo "Draining $node" kubectl drain $node --ignore-daemonsets --delete-local-data done
  12. 在舊的節點完成消耗後,請撤銷您先前授權的安全群組傳入規則。然後,刪除 AWS CloudFormation 堆疊以終止執行個體。

    注意

    如果您已將任何其他IAM原則附加至舊節點群組IAM角色,例如新增Kubernetes叢集自動配置器的權限),請先將這些其他原則從角色中斷連結,然後才能刪除堆疊。 AWS CloudFormation

    1. 撤銷您先前為節點安全群組建立的傳入規則。在這些命令中 AWS CloudFormation ,oldNodes是舊節點堆疊的堆疊名稱,newNodes也是您要移轉到的堆疊名稱。

      oldNodes="old_node_CFN_stack_name" newNodes="new_node_CFN_stack_name" oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text) newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text) aws ec2 revoke-security-group-ingress --group-id $oldSecGroup \ --source-group $newSecGroup --protocol -1 aws ec2 revoke-security-group-ingress --group-id $newSecGroup \ --source-group $oldSecGroup --protocol -1
    2. https://console.aws.amazon.com/雲形成開啟 AWS CloudFormation 主控台。

    3. 選取舊的節點堆疊。

    4. 選擇 刪除

    5. Delete stack (刪除堆疊) 確認對話方塊中,選擇 Delete stack (刪除堆疊)。

  13. 編輯aws-auth組態映射以從RBAC中移除舊的節點執行個體角色。

    kubectl edit configmap -n kube-system aws-auth

    刪除舊節點群組的 mapRoles 項目。如果您的叢集位於 AWS GovCloud (美國東部) 或 AWS GovCloud (美國西部) AWS 區域,請取代arn:aws:為. arn:aws-us-gov:

    apiVersion: v1 data: mapRoles: | - rolearn: arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-W70725MZQFF8 username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes - rolearn: arn:aws:iam::111122223333:role/nodes-1-15-NodeInstanceRole-U11V27W93CX5 username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes>

    儲存並關閉檔案以套用更新的 configmap。

  14. (選用) 如果您使用的是 Kubernetes Cluster Autoscaler,請將部署縮減回 1 個複本。

    注意

    您也必須適當標記新的 Auto Scaling 群組 (例如 k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster),並更新 Cluster Autoscaler 部署的命令,以指向新標記的 Auto Scaling 群組。如需詳細資訊,請參閱上的叢集自動配置器。 AWS

    kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
  15. (選擇性) 確認您使用的是最新版本 Amazon Kubernetes VPC CNI 外掛程式。您可能需要更新CNI版本,才能使用最新支援的執行個體類型。如需詳細資訊,請參閱分配IPs到Pods與 Amazon VPC CNI

  16. 如果您的叢集正在使kube-dns用DNS解決方案 (請參閱上一步),請在kube-dns部署中擴充為一個複本。

    kubectl scale deployments/kube-dns --replicas=1 -n kube-system