インターネットへのアクセスを必要としない Amazon EKS クラスターとノードグループを作成する方法を教えてください。
PrivateOnly ネットワーキングを使用して Amazon Elastic Kubernetes Service (Amazon EKS) クラスターとノードグループを作成したいと考えています。インターネットゲートウェイまたはネットワークアドレス変換 (NAT) ゲートウェイを使用したくありません。
簡単な説明
インターネットへのルートを使用せずに Amazon EKS クラスターとそのノードグループを作成するために、AWS PrivateLink を使用します。
解決方法
Amazon EKS クラスターの Amazon Virtual Private Cloud (Amazon VPC) を作成する
1. 次のテンプレートを使用して AWS CloudFormation スタックを作成します。
https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-06-10/amazon-eks-fully-private-vpc.yaml
スタックは、必要なサービス向けに、3 つの PrivateOnly サブネットと VPC エンドポイントを持つ VPC を作成します。PrivateOnly サブネットには、デフォルトのローカルルートを持つルートテーブルがあり、インターネットへのアクセスがありません。
重要: AWS CloudFormation テンプレートは、フルアクセスポリシーを使用して VPC エンドポイントを作成しますが、要件に基づいてポリシーをさらに制限することができます。
ヒント: スタックの作成後にすべての VPC エンドポイントを確認するには、Amazon VPC コンソールを開き、ナビゲーションペインから [エンドポイント] を選択します。
2. AWS CloudFormation コンソールを開きます。
3. ナビゲーションペインで、[スタック] をクリックします。
4. スタックを選択し、[出力] タブを選択します。このタブでは、VPC ID など、後で必要になるサブネットに関する情報を確認できます。
Amazon EKS クラスター設定ファイルを設定し、クラスターとノードグループを作成する
1. 次の設定ファイルで、「Amazon EKS クラスターの VPC を作成する」のセクションで作成した AWS リージョンと 3 つの PrivateOnly サブネットを更新します。設定ファイルで他の属性を変更したり、属性を追加したりすることもできます。例えば、名前、instanceType、desiredCapacity を更新できます。
config ファイルの例:
apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: prod region: us-east-1 nodeGroups: - name: ng-1 instanceType: m5.xlarge desiredCapacity: 2 privateNetworking: true vpc: subnets: private: us-east-1a: id: "subnet-0111111111111111" us-east-1b: id: "subnet-0222222222222222" us-east-1c: id: "subnet-0333333333333333" clusterEndpoints: publicAccess: true privateAccess: true
前述の設定ファイルで、nodeGroups について、privateNetworking を true に設定します。clusterEndpoints については、privateAccess を true に設定します。
重要: 解決に際して eksctl ツールは必要ありません。他のツールまたは Amazon EKS コンソールを使用して、Amazon EKS クラスターおよびノードを作成できます。しかし、他のツールまたはコンソールを使用してノードを作成する場合、ノードのブートストラップスクリプトを呼び出しつつ、Amazon EKS クラスターの CA 証明書と API サーバーエンドポイントを引数として渡す必要があります。
2. 手順 1 で更新された設定ファイルに基づいて Amazon EKS クラスターとノードグループを作成するには、次のコマンドを実行します。
$ eksctl create cluster -f config.yaml
注: eksctl のバージョンによっては、ファイルに client.authentication.k8s.io/v1alpha1 が記述されていると、Kubeconfig ファイルの作成でエラーが発生することがあります。update-kubeconfig コマンドを実行して Kubeconfig ファイルを更新することができます (最新の AWS CLI バージョンを使用していることを確認してください)。
前述のコマンドでは、AWS PrivateLink を使用して、インターネットへのアクセスを持たない Amazon EKS クラスターとノードグループを PrivateOnly ネットワークに作成します。このプロセスには約 30 分かかります。
この出力は次のようになります。
Output [ℹ] eksctl version 0.21.0 [ℹ] using region us-east-1 [✔] using existing VPC (vpc-01234567) and subnets (private:[subnet-01111111111111111 subnet-02222222222222222 subnet-03333333333333333] public:[]) [!] custom VPC/subnets will be used; if resulting cluster doesn't function as expected, make sure to review the configuration of VPC/subnets [ℹ] nodegroup "ng-1" will use "ami-0ee0652ac0722f0e3" [AmazonLinux2/1.16] [ℹ] using Kubernetes version 1.16 [ℹ] creating EKS cluster "prod" in "us-east-1" region with un-managed nodes [ℹ] 1 nodegroup (ng-1) was included (based on the include/exclude rules) [ℹ] will create a CloudFormation stack for cluster itself and 1 nodegroup stack(s) [ℹ] will create a CloudFormation stack for cluster itself and 0 managed nodegroup stack(s) [ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=us-east-1 --cluster=prod' [ℹ] CloudWatch logging will not be enabled for cluster "prod" in "us-east-1" [ℹ] you can enable it with 'eksctl utils update-cluster-logging --region=us-east-1 --cluster=prod' [ℹ] Kubernetes API endpoint access will use provided values {publicAccess=true, privateAccess=true} for cluster "prod" in "us-east-1" [ℹ] 2 sequential tasks: { create cluster control plane "prod", 2 sequential sub-tasks: { update cluster VPC endpoint access configuration, create nodegroup "ng-1" } } [ℹ] building cluster stack "eksctl-prod-cluster" [ℹ] deploying stack "eksctl-prod-cluster" [ℹ] building nodegroup stack "eksctl-prod-nodegroup-ng-1" [ℹ] --nodes-min=2 was set automatically for nodegroup ng-1 [ℹ] --nodes-max=2 was set automatically for nodegroup ng-1 [ℹ] deploying stack "eksctl-prod-nodegroup-ng-1" [✔] all EKS cluster resources for "prod" have been created [✔] saved kubeconfig as "/Users/garpunee/.kube/config" [ℹ] adding identity "arn:aws:iam::444444444444:role/eksctl-prod-nodegroup-ng-1-NodeInstanceRole-H37FWX4H84GH" to auth ConfigMap [ℹ] nodegroup "ng-1" has 0 node(s) [ℹ] waiting for at least 2 node(s) to become ready in "ng-1" [ℹ] nodegroup "ng-1" has 2 node(s) [ℹ] node "ip-192-168-254-139.ec2.internal" is ready [ℹ] node "ip-192-168-60-191.ec2.internal" is ready [ℹ] kubectl command should work with "/Users/<>/.kube/config", try 'kubectl get nodes' [✔] EKS cluster "prod" in "us-east-1" region is ready
注意: AWS マネジメントコンソールまたは eksctl を使用して、クラスター内にマネージドノードグループまたはアンマネージドノードグループを作成することもできます。eksctl の詳細については、Weaveworks ウェブサイトの Managing nodegroups を参照してください。
関連情報

関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 4年前lg...
- 承認された回答質問済み 1ヶ月前lg...
- 質問済み 10ヶ月前lg...
- AWS公式更新しました 6ヶ月前
- AWS公式更新しました 1年前