AWS VPC を作成する

GKE on AWS は AWS Virtual Private Cloud(VPC)で実行されます。このページでは、クラスタに新しい VPC を設定する方法について説明します。

GKE on AWS では、指定した VPC 内でリソースが作成、管理されます。また、VPC 内には、いくつかのサブネットを作成する必要もあります。

  • コントロール プレーン ノードのサブネット(最大 3 つ)
  • ノードプール用のサブネット
  • Kubernetes Service ロードバランサ用のサブネット

サンプル VPC

次の手順に沿って、以下の VPC を設定します。独自の本番環境ユースケースでは、ワークロードに適した異なる IP 範囲、アベイラビリティ ゾーン、サブネット、ネットワーク アクセス制御リストを選択できます。

次の図は、これらの手順で作成する VPC のサンプルを示しています。

サンプル VPC

  • この例では、3 つのアベイラビリティ ゾーン(Availability Zone 1、Availability Zone 2、Availability Zone 3)を使用しています。たとえば、VPC を us-east-1 リージョンに作成するには、これらを us-east-1aus-east-1bus-east-1c に設定します。

  • 3 つのアベイラビリティ ゾーンには、それぞれ 1 つの公開サブネットと 1 つの限定公開サブネットがあります。

  • コントロール プレーンのレプリカとロードバランサのエンドポイント、ノードプールは限定公開サブネットに作成されます。

  • 公開サブネットは、限定公開サブネットと公開ロードバランサ エンドポイントに、インターネットへの送信アクセスを提供します。

  • これらのサブネットはすべてサブネット自動検出用にタグ付けされています。内部ロードバランサはプライベート サブネットにプロビジョニングされ、インターネットに接続するロードバランサはパブリック サブネットにプロビジョニングされます。

VPC を作成する

  1. 接頭辞を選択し、選択した接頭辞に設定するために下のコマンドのページ変数 AMC_PREFIX を編集します。下のサンプル コマンドでは、この接頭辞を VPC とそのリソースへのすべての参照に自動的に付加します。

  2. AWS Virtual Private Cloud(VPC)を作成します。

    aws --region AWS_REGION ec2 create-vpc \
        --cidr-block 10.0.0.0/16 \
        --tag-specifications 'ResourceType=vpc, Tags=[{Key=Name,Value=AMC_PREFIXVPC}]'
    

    次のように置き換えます。

  3. VPC ID を環境変数に保存し、AWS が提供する VPC 用 DNS サポートを有効にします。

    VPC_ID=$(aws ec2 describe-vpcs \
      --filters 'Name=tag:Name,Values=AMC_PREFIXVPC' \
      --query "Vpcs[].VpcId" --output text)
    aws ec2 modify-vpc-attribute --enable-dns-hostnames --vpc-id $VPC_ID
    aws ec2 modify-vpc-attribute --enable-dns-support --vpc-id $VPC_ID
    

    VPC に異なる DNS 設定を使用することもできます。詳細については、AWS VPC DNS をご覧ください。

コントロール プレーンのサブネット

コントロール プレーンのレプリカ用に最大 3 つのサブネットを構成できます。3 つ未満のサブネットを指定すると、GKE on AWS は 3 つのコントロール プレーン レプリカを作成し、指定されたサブネットに分散します。

クラスタは VPC に対して限定公開されます。インターネットからクラスタへの直接の受信アクセスは許可されません。GKE on AWS では、クラスタを作成して管理するために、制限付きの送信インターネット アクセスが必要です。この例では、送信アクセスにインターネット ゲートウェイを使用します。

サブネットの要件

サブネットでは、次のことができなければなりません。

  • DNS アドレスを解決できるようにする
  • ポート 443 でルーティング可能な IP アドレスへの送信 TCP 接続を確立できます。
  • 次のエンドポイントに接続できる
エンドポイント 目的
storage.googleapis.com インストール中に Cloud Storage からダウンロードする。
*.gcr.io インストール中に Container Registry からダウンロードする。
gkeconnect.googleapis.com 管理サービスに接続する。
oauth2.googleapis.com クラスタ認証の場合。
sts.googleapis.com クラスタ認証の場合。
logging.googleapis.com Cloud Logging にログを送信する場合
monitoring.googleapis.com Cloud Monitoring に指標を送信する場合
opsconfigmonitoring.googleapis.com` リソース メタデータを Cloud Monitoring に送信する場合
servicecontrol.googleapis.com Cloud Audit Logging の場合

コントロール プレーン インスタンス用のサブネットがない場合は、以下のコマンドを使用してサブネットを作成します。

限定公開サブネットを作成する

対応するアベイラビリティ ゾーンに 3 つの限定公開サブネットを作成します。

   aws ec2 create-subnet \
     --availability-zone AWS_ZONE_1 \
     --vpc-id $VPC_ID \
     --cidr-block 10.0.1.0/24 \
     --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name,Value=AMC_PREFIXPrivateSubnet1}]'
   aws ec2 create-subnet \
     --availability-zone AWS_ZONE_2 \
     --vpc-id $VPC_ID \
     --cidr-block 10.0.2.0/24 \
     --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name,Value=AMC_PREFIXPrivateSubnet2}]'
   aws ec2 create-subnet \
     --availability-zone AWS_ZONE_3 \
     --vpc-id $VPC_ID \
     --cidr-block 10.0.3.0/24 \
     --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name,Value=AMC_PREFIXPrivateSubnet3}]'

次のように置き換えます。

公開サブネットを作成する

  1. 3 つの公開サブネットを作成します。これらは、限定公開サブネットにインターネットへの送信アクセスを提供するために使用されます。

    aws ec2 create-subnet \
      --availability-zone AWS_ZONE_1 \
      --vpc-id $VPC_ID \
      --cidr-block 10.0.101.0/24 \
      --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name,Value=AMC_PREFIXPublicSubnet1}]'
    aws ec2 create-subnet \
      --availability-zone AWS_ZONE_2 \
      --vpc-id $VPC_ID \
      --cidr-block 10.0.102.0/24 \
      --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name,Value=AMC_PREFIXPublicSubnet2}]'
    aws ec2 create-subnet \
      --availability-zone AWS_ZONE_3 \
      --vpc-id $VPC_ID \
      --cidr-block 10.0.103.0/24 \
      --tag-specifications 'ResourceType=subnet, Tags=[{Key=Name,Value=AMC_PREFIXPublicSubnet3}]'
    

    次のように置き換えます。

    • AWS_ZONE_1
    • AWS_ZONE_2
    • AWS_ZONE_3
  2. サブネットを公開としてマークします。

    PUBLIC_SUBNET_ID_1=$(aws ec2 describe-subnets \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPublicSubnet1' \
      --query "Subnets[].SubnetId" --output text)
    PUBLIC_SUBNET_ID_2=$(aws ec2 describe-subnets \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPublicSubnet2' \
      --query "Subnets[].SubnetId" --output text)
    PUBLIC_SUBNET_ID_3=$(aws ec2 describe-subnets \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPublicSubnet3' \
      --query "Subnets[].SubnetId" --output text)
    aws ec2 modify-subnet-attribute \
      --map-public-ip-on-launch \
      --subnet-id $PUBLIC_SUBNET_ID_1
    aws ec2 modify-subnet-attribute \
      --map-public-ip-on-launch \
      --subnet-id $PUBLIC_SUBNET_ID_2
    aws ec2 modify-subnet-attribute \
      --map-public-ip-on-launch \
      --subnet-id $PUBLIC_SUBNET_ID_3
    

インターネット ゲートウェイを作成する

  1. インターネット ゲートウェイを作成し、公開サブネットがインターネットにアクセスできるようにします。

    aws --region AWS_REGION  ec2 create-internet-gateway \
      --tag-specifications 'ResourceType=internet-gateway, Tags=[{Key=Name,Value=AMC_PREFIXInternetGateway}]'
    

    AWS_REGION は、VPC が作成された AWS リージョンの名前に置き換えます。

  2. インターネット ゲートウェイを VPC に接続します。

    INTERNET_GW_ID=$(aws ec2 describe-internet-gateways \
      --filters 'Name=tag:Name,Values=AMC_PREFIXInternetGateway' \
      --query "InternetGateways[].InternetGatewayId" --output text)
    aws ec2 attach-internet-gateway \
      --internet-gateway-id $INTERNET_GW_ID \
      --vpc-id $VPC_ID
    

公開サブネットのルーティング テーブルを構成する

  1. それぞれの公開サブネットのルートテーブルを作成します。

    aws ec2 create-route-table --vpc-id $VPC_ID \
      --tag-specifications 'ResourceType=route-table, Tags=[{Key=Name,Value=AMC_PREFIXPublicRouteTbl1}]'
    aws ec2 create-route-table --vpc-id $VPC_ID \
      --tag-specifications 'ResourceType=route-table, Tags=[{Key=Name,Value=AMC_PREFIXPublicRouteTbl2}]'
    aws ec2 create-route-table --vpc-id $VPC_ID \
      --tag-specifications 'ResourceType=route-table, Tags=[{Key=Name,Value=AMC_PREFIXPublicRouteTbl3}]'
    
  2. 公開ルートテーブルを公開サブネットに関連付けます。

    PUBLIC_ROUTE_TABLE_ID_1=$(aws ec2 describe-route-tables \
        --filters 'Name=tag:Name,Values=AMC_PREFIXPublicRouteTbl1' \
        --query "RouteTables[].RouteTableId" --output text)
    PUBLIC_ROUTE_TABLE_ID_2=$(aws ec2 describe-route-tables \
        --filters 'Name=tag:Name,Values=AMC_PREFIXPublicRouteTbl2' \
        --query "RouteTables[].RouteTableId" --output text)
    PUBLIC_ROUTE_TABLE_ID_3=$(aws ec2 describe-route-tables \
        --filters 'Name=tag:Name,Values=AMC_PREFIXPublicRouteTbl3' \
        --query "RouteTables[].RouteTableId" --output text)
    aws ec2 associate-route-table \
      --route-table-id $PUBLIC_ROUTE_TABLE_ID_1 \
      --subnet-id $PUBLIC_SUBNET_ID_1
    aws ec2 associate-route-table \
      --route-table-id $PUBLIC_ROUTE_TABLE_ID_2 \
      --subnet-id $PUBLIC_SUBNET_ID_2
    aws ec2 associate-route-table \
      --route-table-id $PUBLIC_ROUTE_TABLE_ID_3 \
      --subnet-id $PUBLIC_SUBNET_ID_3
    
  3. インターネット ゲートウェイへのデフォルト ルートを作成します。

    aws ec2 create-route --route-table-id $PUBLIC_ROUTE_TABLE_ID_1 \
      --destination-cidr-block 0.0.0.0/0 --gateway-id $INTERNET_GW_ID
    aws ec2 create-route --route-table-id $PUBLIC_ROUTE_TABLE_ID_2 \
      --destination-cidr-block 0.0.0.0/0 --gateway-id $INTERNET_GW_ID
    aws ec2 create-route --route-table-id $PUBLIC_ROUTE_TABLE_ID_3 \
      --destination-cidr-block 0.0.0.0/0 --gateway-id $INTERNET_GW_ID
    
  4. 各 NAT ゲートウェイに Elastic IP(EIP)アドレスを割り振ります。

    aws ec2 allocate-address \
      --tag-specifications 'ResourceType=elastic-ip, Tags=[{Key=Name,Value=AMC_PREFIXNatEip1}]'
    aws ec2 allocate-address \
      --tag-specifications 'ResourceType=elastic-ip, Tags=[{Key=Name,Value=AMC_PREFIXNatEip2}]'
    aws ec2 allocate-address \
      --tag-specifications 'ResourceType=elastic-ip, Tags=[{Key=Name,Value=AMC_PREFIXNatEip3}]'
    

NAT ゲートウェイを作成する

3 つの公開サブネットのそれぞれに NAT ゲートウェイを作成します。

   NAT_EIP_ALLOCATION_ID_1=$(aws ec2 describe-addresses \
     --filters 'Name=tag:Name,Values=AMC_PREFIXNatEip1' \
     --query "Addresses[].AllocationId" --output text)
   NAT_EIP_ALLOCATION_ID_2=$(aws ec2 describe-addresses \
     --filters 'Name=tag:Name,Values=AMC_PREFIXNatEip2' \
     --query "Addresses[].AllocationId" --output text)
   NAT_EIP_ALLOCATION_ID_3=$(aws ec2 describe-addresses \
     --filters 'Name=tag:Name,Values=AMC_PREFIXNatEip3' \
     --query "Addresses[].AllocationId" --output text)
   aws ec2 create-nat-gateway \
     --allocation-id $NAT_EIP_ALLOCATION_ID_1 \
     --subnet-id $PUBLIC_SUBNET_ID_1 \
     --tag-specifications 'ResourceType=natgateway, Tags=[{Key=Name,Value=AMC_PREFIXNatGateway1}]'
   aws ec2 create-nat-gateway \
     --allocation-id $NAT_EIP_ALLOCATION_ID_2 \
     --subnet-id $PUBLIC_SUBNET_ID_2 \
     --tag-specifications 'ResourceType=natgateway, Tags=[{Key=Name,Value=AMC_PREFIXNatGateway2}]'
   aws ec2 create-nat-gateway \
     --allocation-id $NAT_EIP_ALLOCATION_ID_3 \
     --subnet-id $PUBLIC_SUBNET_ID_3 \
     --tag-specifications 'ResourceType=natgateway, Tags=[{Key=Name,Value=AMC_PREFIXNatGateway3}]'

限定公開サブネットのルーティング テーブルを構成する

  1. 限定公開サブネットごとにルートテーブルを作成します。

    aws ec2 create-route-table --vpc-id $VPC_ID \
      --tag-specifications 'ResourceType=route-table, Tags=[{Key=Name,Value=AMC_PREFIXPrivateRouteTbl1}]'
    aws ec2 create-route-table --vpc-id $VPC_ID \
      --tag-specifications 'ResourceType=route-table, Tags=[{Key=Name,Value=AMC_PREFIXPrivateRouteTbl2}]'
    aws ec2 create-route-table --vpc-id $VPC_ID \
      --tag-specifications 'ResourceType=route-table, Tags=[{Key=Name,Value=AMC_PREFIXPrivateRouteTbl3}]'
    
  2. 限定公開ルートテーブルを限定公開サブネットに関連付けます。

    PRIVATE_SUBNET_ID_1=$(aws ec2 describe-subnets \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPrivateSubnet1' \
      --query "Subnets[].SubnetId" --output text)
    PRIVATE_SUBNET_ID_2=$(aws ec2 describe-subnets \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPrivateSubnet2' \
      --query "Subnets[].SubnetId" --output text)
    PRIVATE_SUBNET_ID_3=$(aws ec2 describe-subnets \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPrivateSubnet3' \
      --query "Subnets[].SubnetId" --output text)
    PRIVATE_ROUTE_TABLE_ID_1=$(aws ec2 describe-route-tables \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPrivateRouteTbl1' \
      --query "RouteTables[].RouteTableId" --output text)
    PRIVATE_ROUTE_TABLE_ID_2=$(aws ec2 describe-route-tables \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPrivateRouteTbl2' \
      --query "RouteTables[].RouteTableId" --output text)
    PRIVATE_ROUTE_TABLE_ID_3=$(aws ec2 describe-route-tables \
      --filters 'Name=tag:Name,Values=AMC_PREFIXPrivateRouteTbl3' \
      --query "RouteTables[].RouteTableId" --output text)
    aws ec2 associate-route-table --route-table-id $PRIVATE_ROUTE_TABLE_ID_1 \
      --subnet-id $PRIVATE_SUBNET_ID_1
    aws ec2 associate-route-table --route-table-id $PRIVATE_ROUTE_TABLE_ID_2 \
      --subnet-id $PRIVATE_SUBNET_ID_2
    aws ec2 associate-route-table --route-table-id $PRIVATE_ROUTE_TABLE_ID_3 \
      --subnet-id $PRIVATE_SUBNET_ID_3
    
  3. NAT ゲートウェイへのデフォルト ルートを作成します。

    NAT_GW_ID_1=$(aws ec2 describe-nat-gateways \
     --filter 'Name=tag:Name,Values=AMC_PREFIXNatGateway1' \
     --query "NatGateways[].NatGatewayId" --output text)
    NAT_GW_ID_2=$(aws ec2 describe-nat-gateways \
     --filter 'Name=tag:Name,Values=AMC_PREFIXNatGateway2' \
     --query "NatGateways[].NatGatewayId" --output text)
    NAT_GW_ID_3=$(aws ec2 describe-nat-gateways \
     --filter 'Name=tag:Name,Values=AMC_PREFIXNatGateway3' \
     --query "NatGateways[].NatGatewayId" --output text)
    aws ec2 create-route --route-table-id $PRIVATE_ROUTE_TABLE_ID_1  \
      --destination-cidr-block 0.0.0.0/0 --gateway-id $NAT_GW_ID_1
    aws ec2 create-route --route-table-id $PRIVATE_ROUTE_TABLE_ID_2  \
      --destination-cidr-block 0.0.0.0/0 --gateway-id $NAT_GW_ID_2
    aws ec2 create-route --route-table-id $PRIVATE_ROUTE_TABLE_ID_3 \
      --destination-cidr-block 0.0.0.0/0 --gateway-id $NAT_GW_ID_3
    

ノードプールのサブネット

各ノードプールは 1 つのサブネットに配置されます。1 つのサブネットに複数のノードプールを配置できます。作成できるノードとノードプールの数は、サブネットで使用可能な IP アドレス範囲によって制限されます。

各ノードプールのサブネットは、次の条件を満たす必要があります。

  • コントロール プレーンのサブネットと同じ送信インターネット アクセス要件を満たす
  • ノードプールのサイズに対応する十分な IP アドレス空間がある
  • [公開 IP を自動割り当て] が有効になっていない

前に作成した限定公開サブネットは、コントロール プレーンのサブネットとノードプールのサブネットの両方の要件を満たしています。

サービス ロードバランサのサブネット

ネットワーク ロードバランサまたは HTTP ロードバランサを作成する場合、自動検出のためロードバランサ サブネットにタグを付けます。

公開サブネットに kubernetes.io/role/elb というタグを付けます。

aws ec2 create-tags \
  --resources $PUBLIC_SUBNET_ID_1 \
  --tags Key=kubernetes.io/role/elb,Value=1
aws ec2 create-tags \
  --resources $PUBLIC_SUBNET_ID_2 \
  --tags Key=kubernetes.io/role/elb,Value=1
aws ec2 create-tags \
  --resources $PUBLIC_SUBNET_ID_3 \
  --tags Key=kubernetes.io/role/elb,Value=1

限定公開サブネットに kubernetes.io/role/internal-elb というタグを付けます。

aws ec2 create-tags \
  --resources $PRIVATE_SUBNET_ID_1 \
  --tags Key=kubernetes.io/role/internal-elb,Value=1
aws ec2 create-tags \
  --resources $PRIVATE_SUBNET_ID_2 \
  --tags Key=kubernetes.io/role/internal-elb,Value=1
aws ec2 create-tags \
  --resources $PRIVATE_SUBNET_ID_3 \
  --tags Key=kubernetes.io/role/internal-elb,Value=1

次のステップ

AWS KMS 鍵を作成する。