AWS VPC 만들기

AWS용 GKE는 AWS Virtual Private Cloud(VPC)에서 실행됩니다. 이 페이지에서는 클러스터의 새 VPC를 설정하는 방법을 설명합니다.

AWS용 GKE는 지정된 VPC 내에 리소스를 만들고 관리합니다. 또한 VPC 내에 여러 서브넷을 만들어야 합니다.

  • 제어 영역 노드를 위한 최대 3개의 서브넷
  • 노드 풀을 위한 서브넷
  • Kubernetes 서비스 부하 분산기를 위한 서브넷

샘플 VPC

다음 단계에 따라 아래 그림에 표시된 VPC를 설정하십시오. 자체 프로덕션 사용 사례의 경우 워크로드에 맞게 다른 IP 범위, 가용성 영역, 서브넷, 네트워크 액세스 제어 목록을 선택할 수 있습니다.

다음 다이어그램은 이 단계를 수행할 때 생성되는 샘플 VPC를 보여줍니다.

샘플 VPC

  • 이 예시에서는 가용성 영역 1, 가용성 영역 2, 가용성 영역 3이 사용됩니다. 예를 들어 us-east-1 리전에서 VPC를 만들려면 이를 us-east-1a, us-east-1b, us-east-1c로 설정할 수 있습니다.

  • 3개의 각 가용성 영역 내에는 공개 서브넷과 비공개 서브넷이 각각 하나씩 있습니다.

  • 노드 풀과 함께 제어 영역 복제본과 부하 분산기 엔드포인트가 비공개 서브넷에 생성됩니다.

  • 공개 서브넷은 비공개 서브넷 및 공개 부하 분산기 엔드포인트에 대한 아웃바운드 인터넷 액세스를 제공합니다.

  • 이러한 모든 서브넷은 서브넷 자동 검색을 사용하도록 태그가 지정되어 있습니다. 내부 부하 분산기가 비공개 서브넷에 프로비저닝되고 인터넷에 연결되는 부하 분산기도 공개 서브넷에 프로비저닝됩니다.

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}]'
    

    다음을 바꿉니다.

    • AWS_REGION: VPC를 만들도록 지원되는 AWS 리전의 이름입니다.
    • AMC_PREFIX: VPC 및 해당 리소스에 선택한 VPC 이름 프리픽스입니다.
  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개 미만으로 지정하면 AWS용 GKE가 제어 영역 복제본을 3개 만들고 지정된 서브넷에 이를 배포합니다.

클러스터는 VPC에 대해 비공개입니다. 인터넷에서 클러스터로의 직접 인바운드 액세스는 허용되지 않습니다. AWS용 GKE는 클러스터 만들기 및 관리를 위해 제한된 아웃바운드 인터넷 액세스가 필요합니다. 이 예시에서는 아웃바운드 액세스를 위해 인터넷 게이트웨이가 사용됩니다.

서브넷 요구사항

서브넷이 다음 요건을 충족해야 합니다.

  • 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_REGIONVPC가 생성된 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
    

노드 풀 서브넷

각 노드 풀은 단일 서브넷에 배치됩니다. 서브넷에 여러 노드 풀을 배치할 수 있습니다. 만들 수 있는 노드 수와 노드 풀 수는 서브넷에서 사용할 수 있는 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 키 만들기