AWS용 GKE에 애플리케이션 배포

이 페이지에서는 클러스터와 노드 풀을 만든 다음 AWS용 GKE를 사용하여 샘플 애플리케이션을 배포하는 빠른 시작 안내를 제공합니다.

Terraform을 사용한 클러스터 빠른 시작

Terraform을 사용하여 클러스터 및 노드 풀을 만들 수 있습니다. 클러스터를 만들기 전에 Terraform 스크립트도 AWS VPC를 준비합니다.

AWS 환경의 Terraform에 대한 자세한 내용은 Terraform 클러스터 참조Terraform 노드 풀 참조를 확인하세요.

Terraform으로 VPC 및 클러스터를 만든 후 클러스터에 애플리케이션 배포로 건너뛰어 샘플 애플리케이션을 배포합니다.

Terraform을 사용하지 않고 클러스터를 빠르게 시작

Terraform을 사용하지 않고 AWS VPC를 준비하고 클러스터와 노드 풀을 만들려면 다음 안내를 따르세요.

시작하기 전에

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

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

사용자가 모든 AWS용 GKE의 클러스터 간에 공유될 수 있는 이러한 리소스를 만들고 관리해야 합니다. 다른 모든 기본 클러스터 범위의 AWS 리소스는 AWS용 GKE에서 관리됩니다.

gcloud CLI의 기본 설정 구성

gcloud CLI를 사용하여 기본 프로젝트와 Google Cloud 리전의 기본 설정을 구성합니다.

프로젝트에는 고유 식별자인 프로젝트 ID가 있습니다. 프로젝트를 만들 때 자동 생성되는 프로젝트 ID를 사용하거나 사용자 고유의 ID를 만들 수 있습니다.

Google Cloud 리전은 클러스터를 관리하는 위치입니다. us-west1). 자세한 내용은 관리 리전을 참조하세요.

이러한 기본 설정을 구성하면 Google Cloud CLI를 실행할 때 이를 포함할 필요가 없습니다. --project--location 플래그를 Google Cloud CLI에 전달하여 설정을 지정하거나 기본 설정을 재정의할 수 있습니다.

기본 프로젝트 및 위치를 구성한 후 AWS용 GKE 리소스를 만들면 리소스가 해당 프로젝트와 위치에 자동으로 생성됩니다.

기본값을 설정하려면 다음 단계를 따르세요.

  1. 기본 프로젝트를 설정합니다.

    gcloud config set project PROJECT_ID
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  2. 기본 관리 위치를 설정합니다.

    gcloud config set container_aws/location GOOGLE_CLOUD_LOCATION
    

    GOOGLE_CLOUD_LOCATION을 사용자 위치(예: us-west1)로 바꿉니다.

클러스터의 CIDR 범위 선택

Kubernetes에서는 클러스터에 2개의 CIDR 범위를 제공해야 합니다. 이러한 CIDR 범위는 VPC 서브넷에 사용되는 CIDR 범위와 겹치지 않도록 선택해야 합니다. 클러스터의 예상 최대 크기에 맞게 충분히 커야 합니다.

  • 포드 주소 CIDR 범위: 새 Pod가 생성되면 이 범위의 IP 주소가 할당됩니다. 범위 예시: 192.168.208.0/20

  • 서비스 주소 CIDR 범위: 새 Service가 생성되면 이 범위의 IP 주소가 할당됩니다. 범위 예시: 192.168.224.0/20

클러스터 만들기

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

gcloud container aws clusters create aws-cluster-0 \
    --cluster-version 1.29.4-gke.200 \
    --aws-region AWS_REGION \
    --fleet-project FLEET_PROJECT_ID \
    --vpc-id VPC_ID \
    --subnet-ids CONTROL_PLANE_SUBNET_1,CONTROL_PLANE_SUBNET_2,CONTROL_PLANE_SUBNET_3 \
    --pod-address-cidr-blocks POD_CIDR_BLOCK \
    --service-address-cidr-blocks SERVICE_CIDR_BLOCK \
    --role-arn API_ROLE_ARN \
    --iam-instance-profile CONTROL_PLANE_PROFILE \
    --database-encryption-kms-key-arn DB_KMS_KEY_ARN \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "google:gkemulticloud:cluster=aws-cluster-0"

다음을 바꿉니다.

  • AWS_REGION: 클러스터를 만들 AWS 리전으로 바꿉니다.
  • FLEET_PROJECT_ID: 클러스터를 등록할 Fleet 호스트 프로젝트로 바꿉니다.
  • VPC_ID: VPC 만들기 선행 조건 단계에서 설정한 이 클러스터의 AWS VPC ID로 바꿉니다.
  • CONTROL_PLANE_SUBNET_1, CONTROL_PLANE_SUBNET_2, CONTROL_PLANE_SUBNET_3: 비공개 서브넷 만들기 선행 조건 단계에서 만든 클러스터의 제어 영역 인스턴스 3개의 서브넷 ID로 바꿉니다.
  • POD_CIDR_BLOCK: 클러스터 포드의 CIDR 주소 범위로 바꿉니다.
  • SERVICE_CIDR_BLOCK: 클러스터 서비스의 CIDR 주소 범위로 바꿉니다.
  • API_ROLE_ARN: GKE Multi-cloud API 역할 만들기 선행 조건 단계에서 만든 GKE Multi-cloud 서비스에 대한 IAM 역할의 ARN으로 바꿉니다.
  • CONTROL_PLANE_PROFILE: 제어 영역 역할 만들기 선행 조건 단계에서 선택한 클러스터와 연결된 IAM 인스턴스의 프로필 이름으로 바꿉니다.
  • DB_KMS_KEY_ARN: AWS KMS 키 만들기 선행 조건 단계에서 만든 AWS KMS 키 중 하나의 Amazon 리소스 이름(ARN)으로 바꿉니다.
  • CONFIG_KMS_KEY_ARN: AWS KMS 키 만들기 선행 조건 단계에서 만든 다른 AWS KMS 키의 Amazon 리소스 이름(ARN)으로 바꿉니다.

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

노드 풀 만들기

다음 명령어를 사용하여 노드 풀을 만듭니다.

gcloud container aws node-pools create pool-0 \
    --cluster aws-cluster-0 \
    --node-version 1.29.4-gke.200 \
    --min-nodes 1 \
    --max-nodes 5 \
    --max-pods-per-node 110 \
    --root-volume-size 50 \
    --subnet-id NODEPOOL_SUBNET_ID \
    --iam-instance-profile NODEPOOL_PROFILE \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --ssh-ec2-key-pair EC2_KEY_PAIR \
    --tags "google:gkemulticloud:cluster=aws-cluster-0"

다음을 바꿉니다.

  • NODEPOOL_SUBNET_ID: 비공개 서브넷 만들기 선행 조건 단계에서 만든 비공개 서브넷 중 하나의 ID로 바꿉니다.
  • NODEPOOL_PROFILE: 노드 풀 IAM 역할 만들기 선행 조건 단계에서 선택한 노드 풀의 EC2 인스턴스에 대한 IAM 인스턴스 프로필로 바꿉니다.
  • CONFIG_KMS_KEY_ARN: 사용자 데이터를 암호화할 AWS KMS 키의 Amazon 리소스 이름(ARN)으로 바꿉니다.
  • EC2_KEY_PAIR(선택사항): SSH 키 쌍 만들기 선행 조건 단계에서 만든 SSH 액세스(선택사항)용으로 생성된 EC2 키 쌍의 이름으로 바꿉니다.

클러스터 상태 보기

클러스터와 노드 풀을 만든 후에는 Google Cloud CLI 또는 Google Cloud Console을 사용하여 클러스터 상태를 볼 수 있습니다. 클러스터 상태를 보려면 Google Cloud CLI 또는 Google Cloud 콘솔을 사용 중인지 선택하고 다음 단계를 따르세요.

gcloud

gcloud container aws clusters describe 명령어를 사용하여 클러스터에 대한 세부정보를 가져옵니다.

gcloud container aws clusters describe CLUSTER_NAME \
    --location GOOGLE_CLOUD_LOCATION

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름
  • GOOGLE_CLOUD_LOCATION: 클러스터를 관리하는 Google Cloud 위치의 이름

Google Cloud 콘솔

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 클러스터 개요 페이지로 이동합니다.

    GKE 클러스터로 이동

  2. 클러스터가 이름 및 위치로 나열됩니다.

  3. 클러스터 이름을 클릭합니다. 상태 및 사용 설정된 기능을 포함하여 클러스터에 대한 정보가 있는 패널이 표시됩니다.

클러스터의 사용자 인증 정보 얻기

클러스터를 만든 후 클러스터와 상호작용하려면 사용자 인증 정보를 가져와야 합니다.

gcloud container aws clusters get-credentials aws-cluster-0

이 명령어는 Connect 게이트웨이를 사용해 만든 클러스터에 액세스하도록 kubectl을 구성합니다. Connect 게이트웨이가 클러스터에 배포로 실행되는 Connect 에이전트에 기반하므로 Connect 게이트웨이를 사용하려면 하나 이상의 노드 풀이 필요합니다.

클러스터에 애플리케이션 배포

클러스터가 생성되었으므로 이제 컨테이너화된 애플리케이션을 배포할 수 있습니다. 이 빠른 시작에서는 예시 웹 애플리케이션(hello-app)을 배포 할 수 있습니다.

Kubernetes 객체를 사용하여 클러스터의 리소스를 만들고 관리합니다. 웹 서버와 같은 스테이트리스(Stateless) 애플리케이션을 배포하기 위해 배포 객체를 사용합니다. 서비스 객체는 인터넷에서 애플리케이션에 액세스하기 위한 규칙과 부하 분산기를 정의합니다.

배포 만들기

클러스터에서 hello-app을 실행하려면 다음 명령어를 실행하여 애플리케이션을 배포해야 합니다.

kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

이 Kubernetes 명령어 kubectl create deploymenthello-server라는 배포를 만듭니다. 배포의 포드hello-app 컨테이너 이미지를 실행합니다.

이 명령어에서

  • --image는 배포할 컨테이너 이미지를 지정합니다. 여기에서 이 명령어는 Artifact Registry 저장소 us-docker.pkg.dev/google-samples/containers/gke/hello-app에서 예시 이미지를 가져옵니다. :1.0은 가져올 특정 이미지 버전을 나타냅니다. 버전을 지정하지 않으면 latest 태그가 지정된 이미지가 사용됩니다.

배포 노출

애플리케이션을 배포한 후에는 사용자가 액세스할 수 있도록 이를 인터넷에 노출해야 합니다. 애플리케이션을 외부 트래픽에 노출하는 Kubernetes 리소스인 서비스를 만들어 애플리케이션을 노출할 수 있습니다.

애플리케이션을 노출하려면 다음 kubectl expose 명령어를 실행합니다.

kubectl expose deployment hello-server --type LoadBalancer --port 80 --target-port 8080

--type LoadBalancer 플래그를 전달하면 컨테이너의 AWS 부하 분산기가 생성됩니다. --port 플래그는 인터넷에 공개 포트 80을 초기화하고 --target-port 플래그는 트래픽을 애플리케이션의 포트 8080으로 라우팅합니다.

부하 분산기는 AWS 부하 분산기 가격 책정에 따라 요금이 청구됩니다.

애플리케이션 검사 및 보기

  1. kubectl get pods를 사용하여 실행 중인 포드를 검사합니다.

    kubectl get pods
    

    클러스터에서 하나의 hello-server 포드가 실행 중임을 볼 수 있을 것입니다.

  2. kubectl get service를 사용하여 hello-server 서비스를 검사합니다.

    kubectl get service hello-server
    

    이 명령어의 출력에서 EXTERNAL-IP 열에 있는 서비스의 외부 IP 주소를 복사합니다.

  3. 외부 IP와 노출된 포트를 사용하여 웹브라우저에서 애플리케이션을 확인합니다.

    http://EXTERNAL-IP
    

AWS용 GKE에 컨테이너화된 웹 애플리케이션을 배포했습니다.

삭제

  1. 애플리케이션의 서비스 및 배포를 삭제합니다.

    kubectl delete service hello-server
    kubectl delete deployment hello-server
    
  2. gcloud container aws node-pools delete를 실행하여 노드 풀을 삭제합니다.

    gcloud container aws node-pools delete pool-0 --cluster aws-cluster-0
    
  3. gcloud container aws clusters delete를 실행하여 클러스터를 삭제합니다.

    gcloud container aws clusters delete aws-cluster-0
    

다음 단계