協助改進此頁面
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
部署 Amazon EKS IPv6 叢集和受管 Amazon Linux 節點
在本教學課程中,您將部署 IPv6 Amazon VPC、含 IPv6 系列的 Amazon EKS 叢集,以及含有 Amazon EC2 Amazon Linux 節點的受管節點群組。您無法在 IPv6 叢集中部署 Amazon EC2 Windows 節點。您也可以將 Fargate 節點部署到自己的叢集,但為了簡單起見,本主題中未提供這些指示。
先決條件
開始本教學之前,先完成下列動作:
安裝和設定下列所需工具和資源,以便建立和管理 Amazon EKS 叢集。
-
建議您先熟悉所有設定,再使用符合需求的設定來部署叢集。如需詳細資訊,請參閱此主題的 建立 Amazon EKS 叢集、透過受管節點群組來簡化節點生命週期 與考量。您只可在建立叢集時啟用某些設定。
-
已在裝置或 AWS CloudShell 上安裝
kubectl命令列工具。版本可以與您的叢集 Kubernetes 版本相同,或是為最多比該版本更舊一版或更新一版的次要版本。例如,如果您的叢集版本為1.29,則可以搭配使用kubectl1.28、1.29或1.30版。若要安裝或升級kubectl,請參閱 設定 kubectl 和 eksctl。 -
您使用的 IAM 安全主體必須具有使用 Amazon EKS IAM 角色、服務連結角色、AWS CloudFormation、VPC 和相關資源的許可。如需詳細資訊,請參閱《IAM 使用者指南》中的動作和使用服務連結角色。
-
如果您使用 eksctl,在電腦上安裝版本
0.214.0或更新版本。如需有關安裝或更新的指示,請參閱eksctl文件中的 Installation一節。 -
已在裝置或 AWS CloudShell 上安裝和設定 AWS 命令列介面 (AWS CLI) 版本
2.12.3或更新版本,或是版本1.27.160或更新版本。若要檢查您目前的版本,請使用aws --version | cut -d / -f2 | cut -d ' ' -f1。如yum、apt-get或適用於 macOS 的 Homebrew 等套件管理工具通常比最新版本的 AWS CLI 落後數個版本之多。若要安裝最新版本,請參閱《AWS 命令列介面使用者指南》中的安裝與使用 aws configure 的快速組態。AWS CloudShell 中安裝的 AWS CLI 版本也可能比最新版本落後數個版本。若要更新,請參閱《AWS CloudShell 使用者指南》中的安裝 AWS CLI 至您的主目錄。如果您使用 AWS CloudShell,則可能需要安裝版本 2.12.3 或更新版本,或 AWS CLI 的版本 1.27.160 或更新版本,因為安裝在 AWS CloudShell 中的預設 AWS CLI 版本可能是較早的版本。
您可使用 eksctl 或 CLI 來部署 IPv6 叢集。
使用 eksctl 部署 IPv6 叢集
-
建立
ipv6-cluster.yaml檔案。將隨後的命令複製到您的裝置。視需要對命令進行下列修改,然後執行修改後的命令:-
使用您的叢集名稱取代
my-cluster。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭,且長度不可超過 100 個字元。在您要建立叢集的 AWS 區域和 AWS 帳戶中,該名稱必須是唯一的。 -
使用 Amazon EKS 支援的任何 AWS 區域取代
region-code。如需 AWS 區域的清單,請參閱《AWS 一般參考》指南中的 Amazon EKS 端點和配額。 -
包含叢集版本的
version值。如需詳細資訊,請參閱 Amazon EKS 支援的版本。 -
將
my-nodegroup取代為您的節點群組名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。 -
將
t3.medium取代為任何 AWS Nitro 系統執行個體類型。cat >ipv6-cluster.yaml <<EOF --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: "X.XX" kubernetesNetworkConfig: ipFamily: IPv6 addons: - name: vpc-cni version: latest - name: coredns version: latest - name: kube-proxy version: latest iam: withOIDC: true managedNodeGroups: - name: my-nodegroup instanceType: t3.medium EOF
-
-
建立叢集。
eksctl create cluster -f ipv6-cluster.yaml叢集建立需要幾分鐘的時間。在看到最後一行輸出之前,請勿繼續操作,該行看起來類似於以下輸出。
[...] [✓] EKS cluster "my-cluster" in "region-code" region is ready -
確認已為預設 Pod 指派
IPv6位址。kubectl get pods -n kube-system -o wide範例輸出如下。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES aws-node-rslts 1/1 Running 1 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> aws-node-t74jh 1/1 Running 0 5m32s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-cw7w2 1/1 Running 0 56m 2600:1f13:b66:8203:34e5:: ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-tx6n8 1/1 Running 0 56m 2600:1f13:b66:8203:34e5::1 ip-192-168-253-70.region-code.compute.internal <none> <none> kube-proxy-btpbk 1/1 Running 0 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> kube-proxy-jjk2g 1/1 Running 0 5m33s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> -
確認已為預設服務指派
IPv6地址。kubectl get services -n kube-system -o wide範例輸出如下。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kube-dns ClusterIP fd30:3087:b6c2::a <none> 53/UDP,53/TCP 57m k8s-app=kube-dns -
(選用) 部署範例應用程式或部署 AWS Load Balancer 控制器和範例應用程式,以透過 透過 Application Load Balancer 路由應用程式與 HTTP 流量 對 HTTP 應用程式進行負載平衡,或透過 透過 Network Load Balancer 路由 TCP 與 UDP 流量 對
IPv6Pod 的網路流量進行負載平衡。 -
在完成為本教學建立的叢集和節點後,您應該使用如下命令清除所建立的資源。
eksctl delete cluster my-cluster
使用 AWS CLI 部署 IPv6 叢集
重要
-
您必須以同一位使用者的身分完成本程序中的所有步驟。若要檢查目前使用者,請執行以下命令:
aws sts get-caller-identity -
必須在同一 shell 中完成此程序中的所有步驟。若干步驟使用前面步驟中設定的變數。如果在其他 shell 中設定變數值,則使用此變數的步驟將無法正常工作。如果您使用 AWS CloudShell 完成以下程序,請記住,如果您在大約 20—30 分鐘內沒有使用鍵盤或指標與其互動,則 shell 工作階段將結束。正在執行的進程不算作互動。
-
這些指示是針對 Bash shell 編寫的,在其他 shell 中可能需要進行調整。
將程序此步驟中的所有範例值取代為您自己的值。
-
執行下列命令以設定稍後步驟中使用的某些變數。將
region-code取代為希望在其中部署資源的 AWS 區域。此值可以為 Amazon EKS 支援的任何 AWS 區域。如需 AWS 區域的清單,請參閱《AWS 一般參考》指南中的 Amazon EKS 端點和配額。使用您的叢集名稱取代my-cluster。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭,且長度不可超過 100 個字元。在您要建立叢集的 AWS 區域和 AWS 帳戶中,該名稱必須是唯一的。將my-nodegroup取代為您的節點群組名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。使用您的帳戶 ID 取代111122223333。export region_code=region-code export cluster_name=my-cluster export nodegroup_name=my-nodegroup export account_id=111122223333 -
使用符合 Amazon EKS 和
IPv6要求的公有和私有子網建立 Amazon VPC。-
執行下列命令,以設定您的 AWS CloudFormation 堆疊名稱的變數。您可以使用選擇的任何名稱取代
my-eks-ipv6-vpc。export vpc_stack_name=my-eks-ipv6-vpc -
透過使用
IPv6CloudFormation 範本,建立 AWS VPC。aws cloudformation create-stack --region $region_code --stack-name $vpc_stack_name \ --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-ipv6-vpc-public-private-subnets.yaml堆疊需要幾分鐘的時間建立。執行下列命令。在命令輸出為
CREATE_COMPLETE之前,請勿繼續下一步。aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name --query Stacks[].StackStatus --output text -
檢索已建立的公有子網路的 ID。
aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPublic`].OutputValue' --output text範例輸出如下。
subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE -
為已建立的公有子網啟用自動指派
IPv6地址選項。aws ec2 modify-subnet-attribute --region $region_code --subnet-id subnet-0a1a56c486EXAMPLE --assign-ipv6-address-on-creation aws ec2 modify-subnet-attribute --region $region_code --subnet-id subnet-099e6ca77aEXAMPLE --assign-ipv6-address-on-creation -
檢索由已部署 AWS CloudFormation 堆疊中的範本建立的子網路和安全群組的名稱,並將它們儲存在變數中,以便在稍後的步驟中使用。
security_groups=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SecurityGroups`].OutputValue' --output text) public_subnets=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPublic`].OutputValue' --output text) private_subnets=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPrivate`].OutputValue' --output text) subnets=${public_subnets},${private_subnets}
-
-
建立叢集 IAM 角色,並將所需的 Amazon EKS IAM 受管政策連接到該角色。受 Amazon EKS 管理的 Kubernetes 叢集會代表您呼叫其他 AWS 服務,以管理您搭配本服務使用的資源。
-
執行下列命令以建立
eks-cluster-role-trust-policy.json檔案。cat >eks-cluster-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF -
執行下列命令,以設定角色名稱的變數。您可以將
myAmazonEKSClusterRole取代為選擇的任何名稱。export cluster_role_name=myAmazonEKSClusterRole -
建立角色。
aws iam create-role --role-name $cluster_role_name --assume-role-policy-document file://"eks-cluster-role-trust-policy.json" -
擷取 IAM 角色的 ARN 並將其儲存在變數中,以便在稍後的步驟中使用。
CLUSTER_IAM_ROLE=$(aws iam get-role --role-name $cluster_role_name --query="Role.Arn" --output text) -
將必要的 Amazon EKS 受管 IAM 政策連接到角色。
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy --role-name $cluster_role_name
-
-
建立叢集。
aws eks create-cluster --region $region_code --name $cluster_name --kubernetes-version 1.XX \ --role-arn $CLUSTER_IAM_ROLE --resources-vpc-config subnetIds=$subnets,securityGroupIds=$security_groups \ --kubernetes-network-config ipFamily=ipv6-
請注意:您可能會收到錯誤,表示在請求中的其中一個可用區域沒有足夠的容量可建立 Amazon EKS 叢集。如果發生這種情況,錯誤輸出包含的可用區域可支援新的叢集。使用至少兩個位於帳戶的支援可用區域子網路來建立您的叢集。如需詳細資訊,請參閱 容量不足。
建立叢集需要幾分鐘才能完成。執行下列命令。在命令輸出為
ACTIVE之前,請勿繼續下一步。aws eks describe-cluster --region $region_code --name $cluster_name --query cluster.status
-
-
為叢集建立或更新
kubeconfig檔案,以便能夠與您的叢集通訊。aws eks update-kubeconfig --region $region_code --name $cluster_name根據預設,已在
~/.kube建立了config檔案,或者已將新叢集的組態新增至~/.kube中的現有config檔案。 -
建立節點 IAM 角色。
-
執行下列命令以建立
vpc-cni-ipv6-policy.json檔案。cat >vpc-cni-ipv6-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] } EOF -
建立 IAM 政策。
aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json -
執行下列命令以建立
node-role-trust-relationship.json檔案。cat >node-role-trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF -
執行下列命令,以設定角色名稱的變數。您可以將
AmazonEKSNodeRole取代為選擇的任何名稱。export node_role_name=AmazonEKSNodeRole -
建立 IAM 角色。
aws iam create-role --role-name $node_role_name --assume-role-policy-document file://"node-role-trust-relationship.json" -
將 IAM 政策連接至 IAM 角色。
aws iam attach-role-policy --policy-arn arn:aws:iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name $node_role_name重要
為實現本教學的簡單性,將政策連接至此 IAM 角色。但是,在生產叢集中,我們建議將政策連接至單獨的 IAM 角色。如需詳細資訊,請參閱 設定 Amazon VPC CNI 外掛程式以使用 IRSA。
-
將兩個所需的 IAM 受管政策連接到 IAM 角色。
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \ --role-name $node_role_name aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name $node_role_name -
擷取 IAM 角色的 ARN 並將其儲存在變數中,以便在稍後的步驟中使用。
node_iam_role=$(aws iam get-role --role-name $node_role_name --query="Role.Arn" --output text)
-
-
建立受管節點群組。
-
查看您在上一個步驟中建立的子網路的 ID。
echo $subnets範例輸出如下。
subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE,subnet-0377963d69EXAMPLE,subnet-0c05f819d5EXAMPLE -
建立節點群組。將
0a1a56c486EXAMPLE、099e6ca77aEXAMPLE、0377963d69EXAMPLE和0c05f819d5EXAMPLE取代為上一個步驟輸出中傳回的值。請確保從以下命令中的上一個輸出刪除子網路 ID 之間的逗號。您可以將t3.medium取代為任何 AWS Nitro 系統執行個體類型。aws eks create-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name \ --subnets subnet-0a1a56c486EXAMPLE subnet-099e6ca77aEXAMPLE subnet-0377963d69EXAMPLE subnet-0c05f819d5EXAMPLE \ --instance-types t3.medium --node-role $node_iam_role此節點群組需要幾分鐘的時間建立。執行下列命令。在傳回的輸出為
ACTIVE之前,請勿進行下一個步驟。aws eks describe-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name \ --query nodegroup.status --output text
-
-
確認在
IP欄中已為預設 Pod 指派IPv6位址。kubectl get pods -n kube-system -o wide範例輸出如下。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES aws-node-rslts 1/1 Running 1 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> aws-node-t74jh 1/1 Running 0 5m32s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-cw7w2 1/1 Running 0 56m 2600:1f13:b66:8203:34e5:: ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-tx6n8 1/1 Running 0 56m 2600:1f13:b66:8203:34e5::1 ip-192-168-253-70.region-code.compute.internal <none> <none> kube-proxy-btpbk 1/1 Running 0 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> kube-proxy-jjk2g 1/1 Running 0 5m33s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> -
確認在
IP欄中已為預設服務指派IPv6地址。kubectl get services -n kube-system -o wide範例輸出如下。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kube-dns ClusterIP fd30:3087:b6c2::a <none> 53/UDP,53/TCP 57m k8s-app=kube-dns -
(選用) 部署範例應用程式或部署 AWS Load Balancer 控制器和範例應用程式,以透過 透過 Application Load Balancer 路由應用程式與 HTTP 流量 對 HTTP 應用程式進行負載平衡,或透過 透過 Network Load Balancer 路由 TCP 與 UDP 流量 對
IPv6Pod 的網路流量進行負載平衡。 -
在完成為本教學建立的叢集和節點後,您應該使用如下命令清除所建立的資源。在刪除之前,請確保您沒有使用本教程以外的任何資源。
-
如果您在與完成之前步驟不同的 shell 中完成此步驟,請設定之前步驟中使用的所有變數的值,並將
範例值取代為在完成之前步驟時指定的值。如果您要在與完成之前步驟相同的 shell 中完成此步驟,請跳至下一步。export region_code=region-code export vpc_stack_name=my-eks-ipv6-vpc export cluster_name=my-cluster export nodegroup_name=my-nodegroup export account_id=111122223333 export node_role_name=AmazonEKSNodeRole export cluster_role_name=myAmazonEKSClusterRole -
刪除節點群組。
aws eks delete-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name刪除需要幾分鐘的時間。執行下列命令。如果傳回任何輸出,請勿繼續下一步。
aws eks list-nodegroups --region $region_code --cluster-name $cluster_name --query nodegroups --output text -
刪除叢集。
aws eks delete-cluster --region $region_code --name $cluster_name叢集需要幾分鐘的時間刪除。在繼續之前,請務必使用下列命令來確定叢集已被刪除。
aws eks describe-cluster --region $region_code --name $cluster_name在輸出與下列輸出類似之前,請不要進行下一個步驟。
An error occurred (ResourceNotFoundException) when calling the DescribeCluster operation: No cluster found for name: my-cluster. -
刪除您建立的 IAM 資源。將
AmazonEKS_CNI_IPv6_Policy取代為您選擇的名稱 (如果您選擇的名稱與之前步驟中使用的名稱不同)。aws iam detach-role-policy --role-name $cluster_role_name --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws:iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy aws iam delete-policy --policy-arn arn:aws:iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy aws iam delete-role --role-name $cluster_role_name aws iam delete-role --role-name $node_role_name -
刪除建立 VPC 的 AWS CloudFormation 堆疊。
aws cloudformation delete-stack --region $region_code --stack-name $vpc_stack_name
-