協助改善此頁面
想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將應用程式移轉至新節點群組
此主題會說明如何建立新的節點群組,將現有的應用程式從容遷移至新群組,接著從叢集移除舊的節點群組。您可以使用 eksctl
或 AWS Management Console遷移至新的節點群組。
- eksctl
-
使用
eksctl
將應用程式遷移至新的節點群組如需有關使用 eksctl 進行移轉的詳細資訊,請參閱文件中的非受管節點
群組。 eksctl
此程序需要
eksctl
版本0.189.0
或更新版本。您可使用以下命令檢查您的版本:eksctl version
如需有關安裝或更新
eksctl
的指示,請參閱eksctl
文件中的 Installation一節。 注意
此程序只適用於使用
eksctl
所建立的叢集和節點群組。-
擷取現有節點群組的名稱,使用叢集名稱取代
。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
-
使用以下命令啟動具備
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
\ --version1.30
\ --namestandard-nodes-new
\ --node-typet3.medium
\ --nodes3
\ --nodes-min1
\ --nodes-max4
\ --managed=false -
之前的命令完成時,使用下列命令來確認所有節點已達到
Ready
狀態:kubectl get nodes
-
使用下列命令來刪除原始的節點群組。在命令中,將每個
取代為您的叢集和節點群組名稱:example value
eksctl delete nodegroup --cluster
my-cluster
--namestandard-nodes-old
-
- AWS Management Console and AWS CLI
-
使用 AWS Management Console 和將您的應用程式移轉至新節點群組 AWS CLI
-
依照 建立自我管理的 Amazon Linux 節點 中概述的步驟啟動新的節點群組。
-
當當堆疊已完成建立時,從主控台將其選取,然後選擇 Outputs (輸出)。
-
記錄已建立之節點群組的。NodeInstanceRole您需要這個功能才能將新的 Amazon EKS 節點新增至叢集。
注意
如果您將任何其他IAM原則附加至舊節點群組IAM角色,請將這些相同的原則附加至新的節點群組IAM角色,以便在新群組上維護該功能。例如,如果為 Kubernetes Cluster Autoscaler
新增許可,則適用此操作。 -
更新兩個節點群組的安全群組,使其能夠互相通訊。如需詳細資訊,請參閱檢視叢集的 Amazon EKS 安全群組需求。
-
記錄兩個節點群組的安全性群組。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) -
新增輸入規則至每個節點安全群組,使其接受彼此的流量。
下列 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
-
-
編輯
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將
程式碼片段取代為您在上一個步驟中記錄的NodeInstanceRole值。接著,儲存並關閉檔案以套用更新的 configmap。ARN of instance role (not instance profile)
-
注意節點狀態並等待新的節點加入叢集和達到
Ready
狀態。kubectl get nodes --watch
-
(選用) 如果您使用的是 Kubernetes Cluster Autoscaler
,請將部署縮減為零 (0) 個複本以避免衝突的擴展動作。 kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
-
使用以下命令污染每個您想要用
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 -
判斷叢集的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
-
如果您目前的部署執行少於 2 個複本,請將部署擴增為 2 個複本。如果您先前的命令輸出傳回該項目,請以
取代kubedns
。coredns
kubectl scale deployments/
coredns
--replicas=2 -n kube-system -
使用以下命令清空您想要從叢集移除的每個節點:
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 -
在舊的節點完成消耗後,請撤銷您先前授權的安全群組傳入規則。然後,刪除 AWS CloudFormation 堆疊以終止執行個體。
注意
如果您已將任何其他IAM原則附加至舊節點群組IAM角色,例如新增Kubernetes叢集自動配置器
的權限),請先將這些其他原則從角色中斷連結,然後才能刪除堆疊。 AWS CloudFormation -
撤銷您先前為節點安全群組建立的傳入規則。在這些命令中 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 在 https://console.aws.amazon.com/雲
形成開啟 AWS CloudFormation 主控台。 -
選取舊的節點堆疊。
-
選擇 刪除 。
-
在 Delete stack (刪除堆疊) 確認對話方塊中,選擇 Delete stack (刪除堆疊)。
-
-
編輯
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。
-
(選用) 如果您使用的是 Kubernetes Cluster Autoscaler
,請將部署縮減回 1 個複本。 注意
您也必須適當標記新的 Auto Scaling 群組 (例如
k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/
),並更新 Cluster Autoscaler 部署的命令,以指向新標記的 Auto Scaling 群組。如需詳細資訊,請參閱上的叢集自動配置器my-cluster
。 AWS kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
-
(選擇性) 確認您使用的是最新版本 Amazon Kubernetes VPC CNI 外掛程式
。您可能需要更新CNI版本,才能使用最新支援的執行個體類型。如需詳細資訊,請參閱分配IPs到Pods與 Amazon VPC CNI。 -
如果您的叢集正在使
kube-dns
用DNS解決方案 (請參閱上一步),請在kube-dns
部署中擴充為一個複本。kubectl scale deployments/kube-dns --replicas=1 -n kube-system
-