本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
部署 Amazon EKS IPv6
叢集和受管 Amazon Linux 節點
在本教學課程中,您會部署 IPv6
Amazon VPC、具有 IPv6
系列 的 Amazon EKS 叢集,以及具有 Amazon EC2 Amazon Linux 節點的受管節點群組。您無法部署 Amazon EC2 Windows IPv6
叢集中的節點。您也可以將 Fargate 節點部署至叢集,但為了簡化起見,本主題中並未提供這些指示。
必要條件
在開始教學課程之前,請先完成下列各項:
安裝並設定建立和管理 Amazon EKS 叢集所需的下列工具和資源。
-
建議您熟悉所有設定,並使用符合您需求的設定部署叢集。如需詳細資訊,請參閱 建立 Amazon EKS 叢集、 使用受管節點群組簡化節點生命週期和此主題的考量事項。您只可在建立叢集時啟用某些設定。
-
kubectl
命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與 相同,也可以比 更早或更晚的一個次要版本相同 Kubernetes 叢集的版本。例如,如果您的叢集版本為1.29
,則可以搭配使用kubectl
1.28
、1.29
或1.30
版。若要安裝或升級kubectl
,請參閱 設定 kubectl 和 eksctl。 -
您使用的 IAM 安全主體必須具有使用 Amazon EKS IAM、服務連結角色、 AWS CloudFormation、VPC 和相關資源的許可。如需詳細資訊,請參閱 IAM 使用者指南中的動作和使用服務連結角色。
-
如果您使用 eksctl,在您的電腦上安裝 版本
0.194.0
或更新版本。如需有關安裝或更新的指示,請參閱eksctl
文件中的 Installation一節。 -
在您的裝置 or AWS CloudShell 上安裝和設定的 AWS 命令列介面 (AWS CLI) 版本
1.27.160
2.12.3
或更新版本。若要檢查您目前的版本,請使用aws --version | cut -d / -f2 | cut -d ' ' -f1
。套件管理員apt-get
,例如yum
、 或 Homebrew for macOS 通常是最新版本 AWS CLI 後面的幾個版本。若要安裝最新版本,請參閱 AWS 命令列介面使用者指南中的使用 aws 設定安裝 和 快速組態。 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config安裝在 in AWS CLI 中的 AWS CloudShell 版本也可能是最新版本後面的幾個版本。若要更新它,請參閱 AWS CLI 使用者指南中的將 Word 安裝到您的主目錄。 AWS CloudShell 如果您使用 AWS CloudShell,則可能需要安裝 2.12.3 版或更新版本,或 1.27.160 版或更新版本的 AWS CLI,因為安裝在 AWS CLI中的預設 AWS CloudShell 版本可能是舊版。
您可以使用 eksctl 或 CLI 來部署IPv6
叢集。
使用 部署 IPv6 叢集 eksctl
-
建立
ipv6-cluster.yaml
檔案。將隨後的命令複製到您的裝置。視需要對命令進行下列修改,然後執行修改後的命令:-
Replace (取代)
my-cluster
叢集的名稱。此名稱僅能使用英數字元 (區分大小寫) 和連字號。它必須以英數字元開頭,且長度不得超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。 -
Replace (取代)
region-code
Amazon EKS 支援的任何 AWS 區域。如需 AWS 區域清單,請參閱 AWS 一般參考指南中的 Amazon EKS 端點和配額。 -
包含叢集版本的
version
值。如需詳細資訊,請參閱了解 EKS 上的 Kubernetes 版本生命週期。 -
Replace (取代)
my-nodegroup
節點群組的名稱。節點群組名稱不能超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。 -
Replace (取代)
t3.medium
任何 AWS Nitro System 執行個體類型。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
-
確認該預設值 Pods 是指派
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 控制器和範例應用程式,以將 HTTP 應用程式與 使用 Application Load Balancer 路由應用程式和 HTTP 流量或 網路流量與 載入平衡 使用 Network Load Balancer 路由 TCP 和 UDP 流量
IPv6
Pods. -
完成您為本教學課程建立的叢集和節點之後,您應該清除使用下列命令建立的資源。
eksctl delete cluster my-cluster
使用 IPv6 部署 叢集 AWS CLI
重要
-
您必須以同一位使用者的身分完成本程序中的所有步驟。若要檢查目前使用者,請執行以下命令:
aws sts get-caller-identity
-
必須在同一 shell 中完成此程序中的所有步驟。若干步驟使用前面步驟中設定的變數。如果在不同的 Shell 中設定變數值,使用變數的步驟將無法正常運作。如果您使用 AWS CloudShell 完成下列程序,請記住,如果您未使用鍵盤或指標與其互動約 20-30 分鐘,則 shell 工作階段會結束。正在執行的進程不算作互動。
-
這些指示是針對 Bash shell 編寫的,在其他 shell 中可能需要進行調整。
取代全部 example values
此程序的步驟中,使用您自己的值。
-
執行下列命令以設定稍後步驟中使用的某些變數。Replace (取代)
region-code
您想要部署資源 AWS 的區域。此值可以是 Amazon EKS 支援的任何 AWS 區域。如需 AWS 區域清單,請參閱 AWS 一般參考指南中的 Amazon EKS 端點和配額。Replace (取代)my-cluster
叢集的名稱。此名稱僅能使用英數字元 (區分大小寫) 和連字號。它必須以英數字元開頭,且長度不得超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。Replace (取代)my-nodegroup
節點群組的名稱。節點群組名稱不能超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。Replace (取代)111122223333
使用您的帳戶 ID。export region_code=region-code export cluster_name=my-cluster export nodegroup_name=my-nodegroup export account_id=111122223333
-
使用符合 Amazon VPC 和
IPv6
要求的公有和私有子網路建立 Amazon EKS。-
執行下列命令來設定 AWS CloudFormation 堆疊名稱的變數。您可以取代
my-eks-ipv6-vpc
任何您選擇的名稱。export vpc_stack_name=my-eks-ipv6-vpc
-
使用
IPv6
VPC 範本建立 AWS CloudFormation 。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
-
擷取已建立之公有子網路的 IDs。
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受管政策連接至該角色。Kubernetes 由 Amazon EKS 管理的 叢集會代表您呼叫其他 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"
-
擷取 ARN 角色的 IAM,並將其存放在變數中以供後續步驟使用。
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
-
NOTE:您可能會收到錯誤,表示請求中的其中一個可用區域沒有足夠的容量來建立 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
根據預設,
config
檔案是在 中建立,~/.kube
或新叢集的組態會新增至 中的現有config
檔案~/.kube
。 -
建立節點 IAM 角色。
-
執行下列命令以建立
vpc-cni-ipv6-policy.json
檔案。cat >vpc-cni-ipv6-policy <<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
-
擷取 ARN 角色的 IAM,並將其存放在變數中以供後續步驟使用。
node_iam_role=$(aws iam get-role --role-name $node_role_name --query="Role.Arn" --output text)
-
-
建立受管節點群組。
-
檢視您在上一個步驟中建立的子網路的 IDs。
echo $subnets
範例輸出如下。
subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE,subnet-0377963d69EXAMPLE,subnet-0c05f819d5EXAMPLE
-
建立節點群組。Replace (取代)
0a1a56c486EXAMPLE
,099e6ca77aEXAMPLE
,0377963d69EXAMPLE
和0c05f819d5EXAMPLE
在上一個步驟的輸出中傳回值。請務必從下列命令中的上一個輸出中移除子網路 IDs 之間的逗號。您可以取代t3.medium
任何 AWS Nitro System 執行個體類型。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
-
-
確認預設值 Pods 是
IP
欄中的指派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 控制器和範例應用程式,以將 HTTP 應用程式與 使用 Application Load Balancer 路由應用程式和 HTTP 流量或 網路流量與 進行負載平衡 使用 Network Load Balancer 路由 TCP 和 UDP 流量
IPv6
Pods. -
完成您為本教學課程建立的叢集和節點之後,您應該清除使用下列命令建立的資源。刪除之前,請確定您未使用本教學課程以外的任何資源。
-
如果您要在與完成先前步驟不同的 Shell 中完成此步驟,請設定先前步驟中使用的所有變數值,取代
example values
以及您完成先前步驟時指定的值。如果您在完成先前步驟的相同 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 資源。Replace (取代)
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
-
刪除建立 AWS CloudFormation 的 VPC 堆疊。
aws cloudformation delete-stack --region $region_code --stack-name $vpc_stack_name
-