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 つのサブネットを構成できます。2 つ以下のサブネットを指定すると、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 鍵を作成する