Amazon EKS IPv6
クラスターとマネージド Amazon Linux ノードをデプロイする
このチュートリアルでは、IPv6
ファミリーを使用する IPv6
Amazon VPC と Amazon EKS クラスターのデプロイ、および Amazon EC2 Amazon Linux ノードを使用するマネージド型ノードグループのデプロイ方法を説明します。IPv6
クラスター内では、Amazon EC2 Windows のノードをデプロイすることはできません。Fargate ノードをクラスターにデプロイすることもできますが、理解しやすくするため、これらの手順はこのトピックでは説明していません。
前提条件
このチュートリアルを開始する前に以下を完了してください。
Amazon EKS クラスターの作成と管理に必要な次のツールおよびリソースをインストールおよび設定します。
-
すべての設定を習熟し、要件を満たす設定でクラスターをデプロイすることをお勧めします。詳細については、「Amazon EKS クラスターを作成します。」、「マネージドノードグループを使用してノードライフサイクルを簡素化する」、ならびにこのトピックの「考慮事項」を参照してください。一部の設定の有効化は、クラスターの作成時にのみ行えます。
-
デバイスまたは AWS CloudShell に、
kubectl
コマンドラインツールがインストールされていること。バージョンは、ご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが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
ドキュメントの「インストール」を参照してください。 -
ご使用のデバイスまたは AWS CloudShell で、バージョン
2.12.3
以降、または AWS コマンドラインインターフェイス (AWS CLI) のバージョン1.27.160
以降がインストールおよび設定されていること。現在のバージョンを確認するには、「aws --version | cut -d / -f2 | cut -d ' ' -f1
」を参照してください。macOS のyum
、apt-get
、または Homebrew などのパッケージマネージャーは、AWS CLI の最新バージョンより数バージョン遅れることがあります。最新バージョンをインストールするには、「AWS コマンドラインインターフェイスユーザーガイド」の「インストール」および「aws configure を使用したクイック設定」を参照してください。AWS CloudShell にインストールされている AWS CLI バージョンも最新バージョンより数バージョン遅れることがあります。更新するには、「AWS CloudShell ユーザーガイド」の「ホームディレクトリへの AWS CLI のインストール」を参照してください。AWS CloudShell を使用する場合は、バージョン 2.12.3 以降または 1.27.160 以降の AWS CLI をインストールする必要があります。AWS CloudShell には、デフォルトとして AWS CLI の古いバージョンがインストールされている可能性があります。
eksctl または CLI を使用して IPv6
クラスターをデプロイできます。
eksctl を使用して IPv6 クラスターをデプロイする
-
ipv6-cluster.yaml
ファイルを作成します。デバイスに沿ったコマンドをコピーします。必要に応じてコマンドに次の変更を加え、変更したコマンドを実行します。-
my-cluster
の部分は、自分のクラスター名に置き換えます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。 -
region-code
は、Amazon EKS がサポートする任意の AWS リージョンに置き換えます。AWS リージョンの一覧については、AWS の全般的なリファレンスガイドの Amazon EKS エンドポイントとクォータを参照してください。 -
version
の値には、クラスターのバージョンを設定する必要があります。詳細については、「EKS の Kubernetes バージョンライフサイクルを理解する」を参照してください。 -
my-nodegroup
を、ノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。 -
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 コントローラーとサンプルアプリケーションをデプロイして、Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする で HTTP アプリケーションをロードバランシングするか、Network Load Balancer を使用して TCP および UDP トラフィックをルーティングする で
IPv6
Pods に対するネットワークトラフィックをロードバランシングします。 -
このチュートリアルのために作成したクラスターとノードの使用が終了したら、それらのリソースは、次のコマンドにより削除しておきます。
eksctl delete cluster my-cluster
AWS CLI を使用して IPv6 クラスターをデプロイする
重要
-
この手順のすべてのステップは、同一のユーザーとして実行する必要があります。現在のユーザーを確認するには、次のコマンドを実行します。
aws sts get-caller-identity
-
この手順のすべてのステップは、同一のシェル内で実行する必要があります。いくつかのステップには、これより前のステップで設定した変数を使用します。変数の値が異なるシェル内で設定されていると、その変数を使用するステップは正しく機能しません。AWS CloudShell を使用して次の手順を実行する際、約 20~30 分の間キーボードまたはポインタによる操作がないと、シェルセッションが終了することを銘記しておいてください。実行中のプロセスは、操作数としてカウントされません。
-
各命令は Bash シェル用に記述されているので、他のシェルでは修正が必要な場合があります。
この手順の各ステップにおいて、すべての example values
は、ご自分が使用する値に置き換える必要があります。
-
以下のコマンドを実行して、後のステップで使用するいくつかの変数を設定します。
region-code
は、リソースをデプロイする AWS リージョンに置き換えます。この値には、Amazon EKS でサポートされている任意の AWS リージョンが設定できます。AWS リージョンの一覧については、AWS の全般的なリファレンスガイドの Amazon EKS エンドポイントとクォータを参照してください。my-cluster
の部分は、自分のクラスター名に置き換えます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。my-nodegroup
を、ノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。111122223333
は、ご自分のアカウント ID に置き換えます。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
-
AWS CloudFormation のテンプレートを使用して
IPv6
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 クラスターの作成に十分な容量がない場合には、エラーが表示されることがあります。このエラー出力には、新しいクラスターをサポートできるアベイラビリティーゾーンが表示されます。アカウント向けにサポートされているアベイラビリティーゾーンにある 2 つ以上のサブネットを使用して、クラスターを作成します。詳細については、「容量不足」を参照してください。
クラスターが作成されるまでに数分かかります。以下のコマンドを実行します。コマンドの出力が「
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 ロールにポリシーをアタッチすることをお勧めします。詳細については、「IRSA を使用するように Amazon VPC CNI プラグインを設定する」を参照してください。
-
IAM ロールに、2 つの必須なマネージド 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 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 に
IPv6
アドレスが割り当てられていることを、IP
列で確認します。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
アドレスが割り当てられていることを、IP
列で確認します。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 トラフィックをルーティングする で
IPv6
Pods に対するネットワークトラフィックをロードバランシングします。 -
このチュートリアルのために作成したクラスターとノードの使用が終了したら、以下のコマンドにより、作成したリソースのクリーンアップを行う必要があります。削除を行う前に、これらのリソースが、このチュートリアルの外部で使用されていないことを確認します。
-
ここまでの手順を実行したのとは異なるシェルで、このステップを完了する場合は、
サンプル値
を前の手順を実行した際に指定した値に置き換えながら、すべての変数を前の手順で使用した値に設定します。前の手順を実行したのと同じシェルでこのステップを完了する場合は、このまま次のステップに進みます。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
-