클러스터 만들기

이 페이지에서는 AWS용 GKE 클러스터를 만드는 방법을 설명합니다. Terraform으로 VPC 및 클러스터를 만들 수도 있습니다.

시작하기 전에

클러스터를 만들기 전 기본 요건을 만들어야 합니다. 특히 다음 리소스를 제공해야 합니다.

  • 클러스터가 실행되는 AWS VPC
  • 3개의 제어 영역 복제본을 위한 최대 3개의 AWS 서브넷. 각 서브넷은 서로 다른 AWS 가용성 영역에 있어야 합니다.
  • 클러스터를 관리할 때 AWS용 GKE가 가정하는 AWS IAM 역할. 여기에는 IAM 권한 집합이 필요합니다.
  • 클러스터 데이터(etcd)의 저장 상태에서 암호화를 위한 KMS 대칭 CMK 키와 구성
  • 각 제어 영역 복제본을 위한 AWS IAM 인스턴스 프로필. 여기에는 IAM 권한 집합이 필요합니다.
  • 각 제어 영역 복제본에서 실행되는 EC2 인스턴스에 대해 SSH 액세스가 필요한 경우의 EC2 SSH 키 상(선택사항)

이러한 리소스는 모든 GKE 클러스터 간에 공유될 수 있는 것이며 해당 리소스를 만들고 관리하는 책임은 사용자가 지게 됩니다. 다른 모든 기본 클러스터 범위의 AWS 리소스는 AWS용 GKE에서 관리됩니다.

클러스터의 CIDR 범위 선택

AWS용 GKE에서 클러스터를 만들 때 포드 및 서비스에 사용할 IPv4 주소 범위를 제공해야 합니다.

이러한 IP 범위는 클래스 없는 도메인 간 라우팅(CIDR) 표기법(예: 100.64.0.0/16)을 사용하여 지정합니다.

서비스 및 포드에 다음 CIDR 범위를 사용하는 것이 좋습니다.

  • 서비스: 100.64.0.0/16
  • 포드: 100.96.0.0/11

아무 문제 없이 클러스터를 확장할 수 있을 만큼 충분히 큰 범위입니다.

다음 섹션에서 더 자세히 다룹니다.

범위 선택에 대한 세부정보

AWS용 GKE는 포드와 서비스에 오버레이 네트워크를 사용하므로 이러한 네트워크의 IP 범위를 VPC 내에서 라우팅할 필요가 없습니다. 사용하는 모든 IP 범위를 사용할 수 있어야 합니다. 자세한 내용은 Dataplane V2를 참조하세요.

  • 포드와 서비스 IP 범위는 제어 영역이나 노드 풀 서브넷 IP 범위가 포함되지 않는 경우 VPC 네트워크와 겹칠 수 있습니다.

  • 포드와 서비스 IP 범위는 다음 비공개 IP 범위 중 하나에 속해야 합니다.

    • 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 — 비공개 IP 주소(RFC 1918)
    • 100.64.0.0/10 — 공유 주소 공간(RFC 6598)
    • 192.0.0.0/24 — IETF 프로토콜 할당(RFC 6890)
    • 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 — 문서(RFC 5737)
    • 192.88.99.0/24 — IPv6-IPv4 릴레이(지원 중단됨)(RFC 7526)
    • 198.18.0.0/15 — 벤치마크 테스트(RFC 2544)

100.64.0.0/10(RFC 6598) 내의 IP 범위를 사용하는 것이 좋습니다. 이 범위는 이동통신사급 NAT에 예약되며 VPC에서 사용되지 않을 가능성이 높습니다.

예를 들어 다음은 포드, 서비스, 노드 네트워크가 겹치지 않는 유효한 구성입니다(VPC는 RFC 1918 비공개 IP 주소를 사용하는 반면 포드와 서비스 네트워크는 RFC 6598 비공개 IP와 겹침).

  • VPC 네트워크: 10.0.0.0/16, 172.16.1.0/24, 172.16.2.0/24
  • 포드 네트워크: 100.65.0.0/16
  • 서비스 네트워크: 100.66.0.0/16

다음은 제어 영역 복제본과 겹치지 않으므로 포드와 서비스 네트워크가 VPC 네트워크와 겹치더라도 유효한 구성입니다.

  • VPC 네트워크: 10.0.0.0/16
  • 포드 네트워크: 10.0.1.0/24
  • 서비스 네트워크: 10.0.2.0/24
  • 제어 영역 복제본 서브넷: 10.0.3.0/24, 10.0.4.0/24, 10.0.5.0/24

다음 구성은 포드 IP 범위가 제어 영역 네트워크와 겹치므로 잘못되었습니다. 이러한 중복으로 인해 워크로드가 VPC 네트워크의 제어 영역 복제본과 통신하지 못할 수 있습니다.

  • VPC 네트워크: 10.0.0.0/16
  • 포드 네트워크: 10.0.1.0/24
  • 서비스 네트워크: 10.1.0.0/24
  • 제어 영역 복제본 서브넷: 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24

포드 주소 범위에 대한 세부정보

Kubernetes는 포드 주소 범위에서 포드 객체에 주소를 할당합니다. 클러스터의 포드 범위는 각 노드에 대해 더 작은 범위로 분할됩니다. 포드가 특정 노드에 예약되면 Kubernetes는 노드의 범위에 속하는 포드 IP 주소를 할당합니다.

포드 주소 범위의 크기를 계산하려면 클러스터에 사용할 노드 수와 각 노드에서 실행할 포드 수를 예측해야 합니다.

다음 표에서 실행할 노드 수와 포드 수를 기준으로 포드 CIDR 범위의 크기가 나와 있습니다.

포드 주소 범위 표

포드 주소 범위 최대 포드 IP 주소 수 최대 노드 수 최대 포드 수
/24
가능한 최소 포드 주소 범위
주소 256개 노드 1개 포드 110개
/23 주소 512개 노드 2개 포드 220개
/22 주소 1,024개 노드 4개 포드 440개
/21 주소 2,048개 노드 8개 포드 880개
/20 주소 4,096개 노드 16개 포드 1,760개
/19 주소 8,192개 노드 32개 포드 3,520개
/18 주소 16,384개 노드 64개 포드 7,040개
/17 주소 32,768개 노드 128개 포드 14,080개
/16 주소 65,536개 노드 256개 포드 28,160개
/15 주소 131,072개 노드 512개 포드 56,320개
/14 주소 262,144개 노드 1,024개 포드 112,640개

서비스 주소 범위에 대한 세부정보

Kubernetes는 서비스 객체(예: 이 주소 범위의 부하 분산기)에 가상 IP 주소를 할당합니다.

서비스 주소 범위의 크기를 계산하려면 클러스터에 포함할 서비스 수를 예측해야 합니다.

다음 표에서는 실행할 서비스 수를 기준으로 서비스 CIDR 범위의 크기 권장사항을 제공합니다.

서비스 주소 범위 표

서비스 주소 범위 최대 서비스 수
/27
가능한 최소 서비스 주소 범위
서비스 32개
/26 서비스 64개
/25 서비스 128개
/24 서비스 256개
/23 서비스 512개
/22 서비스 1,024개
/21 서비스 2,048개
/20 서비스 4,096개
/19 서비스 8,192개
/18 서비스 16,384개
/17 서비스 32,768개
/16
가능한 최대 서비스 주소 범위
서비스 65,536개

Fleet 호스트 프로젝트 선택

Fleet은 클러스터를 더 큰 그룹으로 조직화하는 Google Cloud의 개념입니다. Fleet을 사용하면 여러 클라우드를 망라하여 다수의 클러스터를 관리하고 일관된 정책을 적용할 수 있습니다. GKE Multi-cloud API는 클러스터가 생성될 때 자동으로 클러스터를 Fleet에 등록합니다.

클러스터를 만들 때 클러스터가 관리될 Fleet 호스트 프로젝트를 지정합니다. AWS용 GKE는 클러스터 이름을 Fleet 멤버십 이름으로 사용하므로 클러스터 이름이 Fleet 전체에서 고유해야 합니다.

프로젝트 간 등록

클러스터가 있는 Google Cloud 프로젝트 이외의 Fleet 호스트 프로젝트를 사용하려면 멀티 클라우드 서비스 에이전트 서비스 계정에 추가 IAM 정책 바인딩을 적용해야 합니다. 그러면 서비스 계정이 Fleet 호스트 프로젝트로 Fleet을 관리할 수 있습니다.

  1. 서비스 에이전트를 프로젝트에 추가하려면 다음 명령어를 실행합니다.

    gcloud beta services identity create --service=gkemulticloud.googleapis.com \
      --project=CLUSTER_PROJECT_NUMBER
    

    CLUSTER_PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다.

  2. 다음 명령어로 이 binding을 할당합니다.

    gcloud projects add-iam-policy-binding FLEET_PROJECT_ID \
      --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com" \
      --role="roles/gkemulticloud.serviceAgent"
    

    다음을 바꿉니다.

    • FLEET_PROJECT_ID: Fleet 호스트 프로젝트의 Google Cloud 프로젝트
    • CLUSTER_PROJECT_NUMBER: Google Cloud 프로젝트 번호

멀티 클라우드 서비스 에이전트 계정 이름은 service-CLUSTER_PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com 형식입니다.

Google Cloud 콘솔 서비스 계정 페이지에서 서비스 계정을 찾을 수 있습니다. 프로젝트 번호를 찾는 방법에 대한 자세한 내용은 프로젝트 식별을 참조하세요.

클러스터 만들기

다음 명령어를 사용하여 AWS용 GKE에서 클러스터를 만듭니다. 선택적인 매개변수를 포함하여 이 명령어에 대한 자세한 내용은 gcloud container aws 참조 페이지를 확인하세요.

gcloud container aws clusters create CLUSTER_NAME \
  --aws-region AWS_REGION \
  --location GOOGLE_CLOUD_LOCATION \
  --cluster-version CLUSTER_VERSION \
  --fleet-project FLEET_PROJECT \
  --vpc-id VPC_ID \
  --subnet-ids CONTROL_PLANE_SUBNET_1,CONTROL_PLANE_SUBNET_2,CONTROL_PLANE_SUBNET_3 \
  --pod-address-cidr-blocks POD_ADDRESS_CIDR_BLOCKS \
  --service-address-cidr-blocks SERVICE_ADDRESS_CIDR_BLOCKS \
  --role-arn API_ROLE_ARN \
  --database-encryption-kms-key-arn DB_KMS_KEY_ARN \
  --admin-users ADMIN_USERS_LIST \
  --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
  --iam-instance-profile CONTROL_PLANE_PROFILE \
  --tags "Name=CLUSTER_NAME-cp"

다음을 바꿉니다.

  • CLUSTER_NAME: 선택한 클러스터 이름
  • AWS_REGION: 클러스터를 만들 AWS 리전
  • GOOGLE_CLOUD_LOCATION: Google Cloud 관리 리전에 정의된 대로 이 클러스터를 관리할 Google Cloud 위치의 이름
  • CLUSTER_VERSION: 클러스터에 설치할 Kubernetes 버전
  • FLEET_PROJECT: 클러스터를 등록할 Fleet 호스트 프로젝트. 다른 Google Cloud 프로젝트에서 이 클러스터를 관리하려면 프로젝트 간 등록을 참조하세요.
  • VPC_ID: 이 클러스터의 AWS VPC ID
  • CONTROL_PLANE_SUBNET_1, CONTROL_PLANE_SUBNET_2, CONTROL_PLANE_SUBNET_3: 클러스터의 3개 제어 영역 인스턴스에 대한 서브넷 ID
  • POD_ADDRESS_CIDR_BLOCKS: 클러스터 포드의 CIDR 주소 범위로 바꿉니다.
  • SERVICE_ADDRESS_CIDR_BLOCKS: 클러스터 서비스의 CIDR 주소 범위로 바꿉니다.
  • API_ROLE_ARN: GKE Multi-cloud API 역할의 ARN
  • CONTROL_PLANE_PROFILE: 클러스터와 연결된 IAM 인스턴스의 프로필 IAM 인스턴스 프로필 업데이트 방법에 대한 자세한 내용은 AWS IAM 인스턴스 프로필 업데이트를 참조하세요.
  • DB_KMS_KEY_ARN: 클러스터 보안 비밀을 암호화할 AWS KMS 키의 Amazon 리소스 이름(ARN)
  • CONFIG_KMS_KEY_ARN: 사용자 데이터를 암호화할 AWS KMS 키의 Amazon 리소스 이름(ARN)으로 바꿉니다.
  • ADMIN_USERS_LIST(선택사항): 관리자 권한을 부여할 사용자의 이메일 주소가 쉼표로 구분된 목록입니다. 예를 들면 다음과 같습니다. 'kai@example.com,hao@example.com,kalani@example' 기본값은 클러스터를 만드는 사용자입니다.

--tags 매개변수가 있으면 제공된 AWS 태그를 AWS용 GKE에서 관리되는 모든 기본 AWS 리소스에 적용합니다. 이 예시에서는 포함된 클러스터 이름을 사용하여 제어 영역 노드에 태그를 지정합니다.

--ssh-ec2-key-pair 플래그로 SSH 키 쌍을 지정하지 않으면 이러한 제어 영역 노드에 SSH를 통해 연결할 수 없습니다.

지정된 Google Cloud 위치에서 지원되는 모든 Kubernetes 버전을 보려면 다음 명령어를 실행합니다.

gcloud container aws get-server-config --location GCP_LOCATION

Cloud Logging/Cloud Monitoring 승인

AWS용 GKE가 시스템 로그 및 측정항목을 만들고 Google Cloud에 업로드할 수 있도록 하려면 승인되어야 합니다.

Google Cloud Logging에 로그를 기록하고 Google Cloud Monitoring에 측정항목을 기록하도록 Kubernetes 워크로드 아이덴티티 gke-system/gke-telemetry-agent를 승인하려면 다음 명령어를 실행합니다.

gcloud projects add-iam-policy-binding GOOGLE_PROJECT_ID \
  --member="serviceAccount:GOOGLE_PROJECT_ID.svc.id.goog[gke-system/gke-telemetry-agent]" \
  --role=roles/gkemulticloud.telemetryWriter

GOOGLE_PROJECT_ID를 클러스터의 Google Cloud 프로젝트 ID로 바꿉니다.

이 IAM binding은 Google Cloud 프로젝트의 모든 클러스터가 로그 및 측정항목을 업로드하도록 액세스 권한을 부여합니다. 프로젝트의 첫 번째 클러스터를 만든 후에만 이를 실행해야 합니다.

Google Cloud 프로젝트에 클러스터가 하나 이상 생성되어 있지 않으면 이 IAM 바인딩 추가가 실패합니다. 이는 참조하는 워크로드 아이덴티티 풀(GOOGLE_PROJECT_ID.svc.id.goog)이 클러스터를 만들 때까지 프로비저닝되지 않기 때문입니다.

다음 단계