Google Kubernetes Engine에 배포하기

Google Kubernetes Engine에 배포하기

지속적 배포(CD) 워크플로의 일부로 프로젝트를 Google Kubernetes Engine(GKE)에 배포하는 방법을 알아봐요. 컨테이너 이미지를 빌드해 GCR로 푸시하고, kubectlkustomize 같은 Kubernetes 도구로 이미지를 클러스터 배포로 가져오는 과정을 살펴봐요.

출처: 문서

본문

사전 요구 사항

워크플로를 만들기 전에 Kubernetes 프로젝트에 대해 다음 단계를 완료해야 해요. 이 가이드는 프로젝트 루트에 이미 Dockerfile과 Kubernetes Deployment 구성 파일이 있다고 가정해요.

GKE 클러스터 만들기

GKE 클러스터를 만들려면 먼저 gcloud CLI를 사용해 인증해야 해요. 이 단계에 대한 자세한 내용은 다음 문서를 참고하세요:

예를 들어:

$ gcloud container clusters create $GKE_CLUSTER \
	--project=$GKE_PROJECT \
	--zone=$GKE_ZONE

API 활성화하기

Kubernetes Engine 및 Container Registry API를 활성화해요. 예를 들어:

$ gcloud services enable \
	containerregistry.googleapis.com \
	container.googleapis.com

서비스 계정 구성 및 자격 증명 저장하기

이 절차는 GKE 통합을 위한 서비스 계정을 만드는 방법을 보여줘요. 계정을 만들고, 역할을 추가하고, 키를 검색하고, base64로 인코딩된 암호화된 저장소 시크릿인 GKE_SA_KEY로 저장하는 방법을 설명해요.

  1. 새 서비스 계정을 만들어요:

    gcloud iam service-accounts create $SA_NAME
    
  2. 방금 만든 서비스 계정의 이메일 주소를 검색해요:

    gcloud iam service-accounts list
    
  3. 서비스 계정에 역할을 추가해요.

    Note

    요구 사항에 맞게 더 제한적인 역할을 적용해요.

    gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/container.admin
    gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/storage.admin
    gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/container.clusterViewer
    
  4. 서비스 계정의 JSON 키 파일을 다운로드해요:

    gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
    
  5. 서비스 계정 키를 GKE_SA_KEY라는 시크릿으로 저장해요:

    export GKE_SA_KEY=$(cat key.json | base64)
    

    시크릿을 저장하는 방법에 대한 자세한 내용은 GitHub Actions에서 시크릿 사용하기를 참고하세요.

프로젝트 이름 저장하기

프로젝트 이름을 GKE_PROJECT라는 시크릿으로 저장해요. 시크릿을 저장하는 방법에 대한 자세한 내용은 GitHub Actions에서 시크릿 사용하기를 참고하세요.

(선택) kustomize 구성하기

Kustomize는 YAML 스펙을 관리하는 데 사용되는 선택적 도구예요. kustomization 파일을 만든 후 아래 워크플로를 사용해 이미지의 필드를 동적으로 설정하고 결과를 kubectl로 파이프할 수 있어요. 자세한 내용은 kustomize 사용법을 참고하세요.

(선택) 배포 환경 구성하기

환경은 production, staging, development 같은 일반적인 배포 대상을 설명하는 데 사용돼요. GitHub Actions 워크플로가 환경으로 배포하면 환경이 저장소 메인 페이지에 표시돼요. 환경을 사용해 작업 진행에 승인을 요구하거나, 어떤 브랜치가 워크플로를 트리거할 수 있는지 제한하거나, 커스텀 배포 보호 규칙으로 배포를 게이팅하거나, 시크릿 접근을 제한할 수 있어요. 환경을 만드는 방법에 대한 자세한 내용은 배포용 환경 관리하기를 참고하세요.

워크플로 만들기

사전 요구 사항을 완료했다면 워크플로를 만들 수 있어요.

다음 예제 워크플로는 컨테이너 이미지를 빌드해 GCR로 푸시하는 방법을 보여줘요. 그런 다음 kubectlkustomize 같은 Kubernetes 도구를 사용해 이미지를 클러스터 배포로 가져와요.

env 키 아래에서 GKE_CLUSTER 값을 클러스터 이름으로, GKE_ZONE을 클러스터 존으로, DEPLOYMENT_NAME을 배포 이름으로, IMAGE를 이미지 이름으로 변경해요.

배포 환경을 구성했다면 environment 값을 환경 이름으로 변경해요. 환경을 구성하지 않았거나 워크플로가 비공개 저장소에 있고 GitHub Enterprise Cloud를 사용하지 않는다면 environment 키를 삭제해요.

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.

name: Build and Deploy to GKE

on:
  push:
    branches:
      - main

env:
  PROJECT_ID: ${{ secrets.GKE_PROJECT }}
  GKE_CLUSTER: cluster-1    # Add your cluster name here.
  GKE_ZONE: us-central1-c   # Add your cluster zone here.
  DEPLOYMENT_NAME: gke-test # Add your deployment name here.
  IMAGE: static-site

jobs:
  setup-build-publish-deploy:
    name: Setup, Build, Publish, and Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v6

    # Setup gcloud CLI
    - uses: google-github-actions/setup-gcloud@1bee7de035d65ec5da40a31f8589e240eba8fde5
      with:
        service_account_key: ${{ secrets.GKE_SA_KEY }}
        project_id: ${{ secrets.GKE_PROJECT }}

    # Configure Docker to use the gcloud command-line tool as a credential
    # helper for authentication
    - run: |-
        gcloud --quiet auth configure-docker

    # Get the GKE credentials so we can deploy to the cluster
    - uses: google-github-actions/get-gke-credentials@db150f2cc60d1716e61922b832eae71d2a45938f
      with:
        cluster_name: ${{ env.GKE_CLUSTER }}
        location: ${{ env.GKE_ZONE }}
        credentials: ${{ secrets.GKE_SA_KEY }}

    # Build the Docker image
    - name: Build
      run: |-
        docker build \
          --tag "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA" \
          --build-arg GITHUB_SHA="$GITHUB_SHA" \
          --build-arg GITHUB_REF="$GITHUB_REF" \
          .

    # Push the Docker image to Google Container Registry
    - name: Publish
      run: |-
        docker push "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA"

    # Set up kustomize
    - name: Set up Kustomize
      run: |-
        curl -sfLo kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/v3.1.0/kustomize_3.1.0_linux_amd64
        chmod u+x ./kustomize

    # Deploy the Docker image to the GKE cluster
    - name: Deploy
      run: |-
        ./kustomize edit set image gcr.io/PROJECT_ID/IMAGE:TAG=gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA
        ./kustomize build . | kubectl apply -f -
        kubectl rollout status deployment/$DEPLOYMENT_NAME
        kubectl get services -o wide

더 알아보기 (Learn more)

이 예제들에서 사용된 도구에 대한 자세한 내용은 다음 문서를 확인하세요: