GKE on AWS は AWS Virtual Private Cloud(VPC)で実行されます。このページでは、クラスタに新しい VPC を設定する方法について説明します。
GKE on AWS では、指定した VPC 内でリソースが作成され、管理されます。次のように、VPC 内にいくつかのサブネットを作成する必要があります。
- コントロール プレーン ノードのサブネット(最大 3 つ)
- ノードプールのサブネット
- Kubernetes Service ロードバランサのサブネット
サンプル VPC
次の手順に沿って、以下の VPC を設定します。本番環境のユースケースでは、ワークロードに適した異なる IP 範囲、アベイラビリティ ゾーン、サブネット、ネットワーク アクセス制御リストを選択できます。
次の図は、これらの手順で作成する VPC のサンプルを示しています。
この例では、3 つのアベイラビリティ ゾーン(Availability Zone 1、Availability Zone 2、Availability Zone 3)を使用しています。たとえば、VPC を
us-east-1
リージョンに作成するには、これらをus-east-1a
、us-east-1b
、us-east-1c
に設定します。3 つのアベイラビリティ ゾーンには、それぞれ 1 つのパブリック サブネットと 1 つのプライベート サブネットがあります。
コントロール プレーンのレプリカとロードバランサのエンドポイント、ノードプールはプライベート サブネットに作成されます。
パブリック サブネットは、プライベート サブネットとパブリック ロードバランサ エンドポイントに、インターネットへのアウトバウンド アクセスを提供します。
これらのサブネットはすべてサブネット自動検出用にタグ付けされています。内部ロードバランサはプライベート サブネットにプロビジョニングされ、インターネットに接続するロードバランサはパブリック サブネットにプロビジョニングされます。
VPC を作成する
プレフィックスを選択し、選択したプレイフィックスに設定するために以下のコマンドのページ変数 AMC_PREFIX を編集します。下のサンプル コマンドでは、このプレフィックスを VPC とそのリソースへのすべての参照で自動的に付加します。
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}]'
次のように置き換えます。
AWS_REGION
: VPC を作成するサポート対象の AWS リージョンの名前AMC_PREFIX
: VPC とそのリソース用に選択した VPC 名のプレフィックス
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}]'
次のように置き換えます。
AWS_ZONE_1
: Availability Zone 1AWS_ZONE_2
: Availability Zone 2AWS_ZONE_3
: Availability Zone 3
パブリック サブネットを作成する
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
サブネットをパブリックとしてマークします。
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
インターネット ゲートウェイを作成する
インターネット ゲートウェイを作成し、パブリック サブネットがインターネットにアクセスできるようにします。
aws --region AWS_REGION ec2 create-internet-gateway \ --tag-specifications 'ResourceType=internet-gateway, Tags=[{Key=Name,Value=AMC_PREFIXInternetGateway}]'
AWS_REGION
は、VPC が作成された AWS リージョンの名前に置き換えます。インターネット ゲートウェイを 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
パブリック サブネットのルーティング テーブルを構成する
それぞれのパブリック サブネットのルートテーブルを作成します。
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}]'
パブリック ルートテーブルをパブリック サブネットに関連付けます。
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
インターネット ゲートウェイへのデフォルト ルートを作成します。
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
各 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}]'
プライベート サブネットのルーティング テーブルを構成する
プライベート サブネットごとにルートテーブルを作成します。
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}]'
プライベート ルートテーブルをプライベート サブネットに関連付けます。
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
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