インターネットへのアクセスを必要としない Amazon EKS クラスターとノードグループを作成する方法を教えてください。

最終更新日: 2020 年 7 月 10 日

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 サブネットを更新します。設定ファイルで他の属性を変更したり、属性を追加したりすることもできます。例えば、名前instanceTypedesiredCapacity を更新できます。

設定ファイルの例:

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 について、privateNetworkingtrue に設定します。clusterEndpoints については、privateAccesstrue に設定します。

重要: 解決に際して eksctl ツールは必要ありません。他のツールまたは Amazon EKS コンソールを使用して、Amazon EKS クラスターおよびノードを作成できます。他のツールまたはコンソールを使用してワーカーノードを作成する場合、ワーカーノードのブートストラップスクリプトを呼び出しつつ、Amazon EKS クラスターの CA 証明書と API サーバーエンドポイントを引数として渡す必要があります。

2.    手順 1 で更新された設定ファイルに基づいて Amazon EKS クラスターとノードグループを作成するには、次のコマンドを実行します。

$ eksctl create cluster -f config.yaml

前述のコマンドでは、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

注意: コンソールまたは eksctl を使用して、クラスター内にマネージドノードグループまたはアンマネージドノードグループを作成することもできます。eksctl の詳細については、Weaveworks ウェブサイトの Managing nodegroups を参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?