GitHub를 사용하여 개발 주기 초반에 GKE 비용 예측

Last reviewed 2022-12-15 UTC

이 튜토리얼에서는 개발팀이 Google Kubernetes Engine(GKE) 비용 가시성을 원점으로 회귀하기 위한 권장 사항에 대해 설명합니다. 이러한 원점 회귀 방식은 프로세스 초기에 비용을 인지하여 예측하지 못한 Google Cloud 비용 청구를 방지하는 데 도움을 줍니다.

이 튜토리얼은 GKE 클러스터의 비용을 최적화하기를 원하며 프로덕션에서 GitHub를 사용하는 개발자, 운영자, FinOps 실무자를 대상으로 합니다. GitLab을 대신 사용하는 경우 GitLab을 사용하여 개발 주기 초반에 GKE 비용 예측을 참조하세요.

이 튜토리얼에서는 사용자가 Docker, GitHub Kubernetes, GKE, Cloud Build, Linux에 익숙하다고 가정합니다.

개요

퍼블릭 클라우드를 사용하는 많은 팀은 사용한 만큼만 지불하는 결제 방식에 익숙하지 않습니다. 이들은 GKE와 같이 자신의 앱이 실행되는 환경을 완전히 이해하지 못하는 경우가 많습니다. FinOps 운영 모델은 이러한 재무 책임 문화를 촉진시킵니다. FinOps 권장사항은 비용 문제를 가능한 한 일찍 해결할 수 있도록 지출 내역에 관한 실시간 정보를 팀에 제공하는 것입니다.

이 문서에서는 비용 결제 문제가 커지기 전 비용 예측을 통해 이를 한 단 계 더 발전시키는 방법을 보여줍니다. GitHub 웹사이트에 강조표시된 것처럼 'GitHub에서는 경량형 코드 검토 도구가 모든 pull 요청에 내장되어 있습니다.' 이를 통해 '소스 코드를 변경하기 전에 프로젝트를 발전시키고, 새로운 기능을 제안하고, 구현 세부정보를 논의하는 것이 가능'합니다. 비용 예측의 최적 시기는 개발 및 코드 검토 시기의 초기입니다. 이렇게 함으로써 실무자는 문제가 커지기 전 새로운 기능 및 버그 수정이 비용에 미치는 영향을 이해하고 그에 대한 대안을 논의할 수 있습니다. 다음 다이어그램은 이러한 방식을 요약해서 보여줍니다.

조기 비용 예측에 대한 권장사항

다이어그램에 표시된 것처럼 개발자는 자신의 로컬 환경에서 이상적으로 빌드 시기에 GKE 비용을 예측합니다. 이러한 예측을 통해 월별 프로덕션 워크로드 비용을 효과적으로 이해할 수 있습니다. 기능 또는 버그 수정 코드가 완료되면 이전 비용과 신규 비용 사이의 차이를 확인하기 위해 Cloud Build를 트리거하는 pull 요청을 제안합니다. 사전 정의된 임곗값 이상으로 값이 증가하면 새로운 코드 검토를 요청할 수 있습니다. 이렇게 하면 개발자가 워크로드 용량을 보다 효과적으로 인지하고 프로덕션에서 불안정성이 발견될 때마다 리소스를 더 추가하는 대신 애플리케이션 문제를 사전에 해결할 수 있습니다.

목표

  • Kubernetes 비용 예측 도구 이미지를 빌드하고 푸시합니다.
  • GitHub 저장소를 만듭니다.
  • Cloud Build를 GitHub 저장소에 연결합니다.
  • 예시 코드를 GitHub 저장소로 푸시합니다.
  • 실제 비용 예측을 확인하기 위해 코드를 변경하고 pull 요청을 제안합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud Console에서 프로젝트 선택기 페이지로 이동합니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트를 선택하거나 만듭니다.

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

개발 환경 준비

  1. Cloud Shell에서 gke-shift-left-cost GitHub 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/gke-shift-left-cost
    cd gke-shift-left-cost
    

    이 저장소의 코드는 다음 폴더에 구성됩니다.

    • 루트: 비용 예측 도구 이미지를 빌드하기 위해 사용되는 Dockerfile 파일과 예측 도구의 명령줄 논리를 구현하는 main.go 파일을 포함합니다.
    • api/: Kubernetes 객체를 조작하고 비용 예측을 수행하기 위한 Golang API를 포함합니다.
    • samples/: 조직에서 구현하기 전 프로세스로 실험할 수 있도록 Kubernetes 매니페스트 예시를 포함합니다.
  2. Google Cloud 프로젝트 ID, GitHub 사용자와 이메일 주소, FinOps 검토자로 작동할 또 다른 GitHub 사용자를 설정합니다.

    export GCP_PROJECT_ID=YOUR_PROJECT_ID
    export GITHUB_USER=YOUR_GITHUB_USER
    export GITHUB_EMAIL=YOUR_GITHUB_EMAIL_ADDRESS
    export GITHUB_FINOPS_REVIEWER_USER=ANOTHER_GITHUB_USER
    

    다음을 바꿉니다.

    • YOUR_PROJECT_ID: 이 튜토리얼에서 사용하는 프로젝트의 Google Cloud 프로젝트 ID입니다.
    • YOUR_GITHUB_USER: GitHub 계정에 로그인하기 위해 사용되는 사용자입니다.
    • YOUR_GITHUB_EMAIL_ADDRESS: GitHub 계정에 사용되는 이메일입니다.
    • ANOTHER_GITHUB_USER: FinOps 검토자 역할을 수행하는 또 다른 GitHub 사용자입니다. 이 튜토리얼에서는 개발자가 이 사용자를 저장소 공동작업자로 추가해야 하므로, 개발자 자신일 수 없습니다. 튜토리얼 단계 중 막힘을 방지하기 위해 초대를 만드는 즉시 사용자가 초대를 수락하도록 합니다.
  3. Google 클라우드 프로젝트를 설정하고 필요한 API를 사용 설정합니다.

    gcloud config set project $GCP_PROJECT_ID
    
    gcloud services enable cloudbilling.googleapis.com \
        artifactregistry.googleapis.com \
        cloudbuild.googleapis.com
    

Kubernetes 비용 예측 도구 이미지를 빌드하고 푸시합니다.

이 튜토리얼에 제공되는 Kubernetes 비용 예측 도구는 단순히 수행될 작업을 보여주는 예시일 뿐입니다. 이 도구는 DaemonSet, Deployment, StatefulSet, ReplicaSet, HorizontalPodAutoScaler, PersistentVolumeClaim Kubernetes 객체에 대한 비용 예측 기능을 제공합니다. 또한 자체 비용 예측 도구를 구현하거나 원하는 구현에 맞게 pull 요청을 제안할 수도 있습니다.

  1. Cloud Shell에서 application-default가 사용자 인증 정보를 사용하도록 허용합니다.

    gcloud auth application-default login
    
  2. Kubernetes 비용 예측 도구 바이너리를 빌드합니다.

    mkdir ./bin
    go test ./api
    go build -v -o ./bin/k8s-cost-estimator .
    
  3. 샘플 폴더에서 비용 예측을 수행하여 바이너리를 테스트합니다.

    ./bin/k8s-cost-estimator \
        --k8s ./samples/k8s-cost-estimator-local/app-v1  \
        --config ./samples/k8s-cost-estimator-local/example-conf.yaml --v trace
    

    ./samples/k8s-cost-estimator-local/app-v1/ 폴더에 대해 원별 예상 비용 정보를 보여주는 Markdown 테이블이 출력에 표시됩니다. 애플리케이션의 월별 프로덕션 비용을 더 잘 이해하기 위해 개발자는 원격 저장소로 푸시하기 전 이 단계를 실행할 수 있습니다.

    INFO[0000] Starting cost estimation (version v0.0.1)...
    ...
    
    |         KIND          | MIN REQUESTED (USD) | MIN REQ + HPA CPU BUFFER (USD) | MAX REQUESTED (USD) | MIN LIMITED (USD) | MAX LIMITED (USD) |
    |-----------------------|---------------------|--------------------------------|---------------------|-------------------|-------------------|
    | Deployment            |             $133.31 |                        $198.71 |             $266.54 |           $312.83 |           $579.29 |
    | StatefulSet           |              $36.33 |                         $36.33 |              $36.33 |            $72.67 |            $72.67 |
    | DaemonSet             |              $29.68 |                         $29.68 |              $29.68 |            $53.19 |            $53.19 |
    | PersistentVolumeClaim |              $28.88 |                         $28.88 |              $28.88 |            $33.68 |            $33.68 |
    | **TOTAL**             |         **$228.20** |                    **$293.60** |         **$361.43** |       **$472.38** |       **$738.83** |
    
    INFO[0002] Finished cost estimation!
    
  4. Kubernetes 비용 예측 도구 컨테이너 이미지를 빌드합니다.

    docker build . -t us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    
  5. 이미지를 저장할 Artifact Registry Docker 저장소를 만듭니다.

    gcloud artifacts repositories create docker-repo \
            --repository-format=docker \
            --location=us-central1 \
            --description="Docker repository"
    
  6. gcloud를 Docker 구성 파일에 대한 사용자 인증 정보 도우미로 등록합니다. 메시지가 표시되면 파일 업데이트를 확인합니다.

    gcloud auth configure-docker us-central1-docker.pkg.dev
    
  7. 이미지를 Artifact Registry로 푸시합니다.

    docker push us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    

새 GitHub 저장소 만들기

  1. Cloud Shell에서 디렉터리를 GitHub 예시로 변경합니다.

    cd samples/k8s-cost-estimator-github
    
  2. GitHub에서 액세스 토큰을 만듭니다.

    GitHub 개인 액세스 토큰 페이지로 이동합니다.

    1. 메모 필드에 토큰 설명을 입력합니다.
    2. 범위 선택에서 저장소, admin:public_key, delete_repo 체크박스를 선택합니다.
    3. 토큰 생성을 클릭하고 페이지 상단에서 새 개인 액세스 토큰 값을 복사합니다.
  3. Cloud Shell에서 개인 액세스 토큰을 변수에 저장합니다.

    GITHUB_TOKEN=YOUR_NEW_PERSONAL_ACCESS_TOKEN
    

    다음을 바꿉니다.

    • YOUR_NEW_PERSONAL_ACCESS_TOKEN: 바로 전에 만든 개인 액세스 토큰입니다.
  4. GitHub 저장소를 만듭니다.

    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/repos \
      -d '{"name":"k8s-cost-estimator-github"}' | jq
    

    출력은 다음과 비슷합니다.

    {
      "id": 36099474,
      "node_id": "MDEwOldfsdjA5OTQ3Njc=",
      "name": "k8s-cost-estimator-github",
      ...
    }
    
  5. FinOps 검토자를 저장소의 공동작업자로 추가합니다.

    curl -X PUT \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github/collaborators/$GITHUB_FINOPS_REVIEWER_USER  | jq -r .html_url
    

    출력은 다음과 비슷합니다.

    https://github.com/your-user/k8s-cost-estimator-github/invitations
    
  6. 사용자가 초대를 수락할 수 있도록 GITHUB_FINOPS_REVIEWER_USER 변수에 설정한 사용자와 출력 URL을 공유합니다. 다음 단계로 진행하기 전에 동일한 URL을 방문하여 초대가 수락되었는지 확인합니다.

    초대가 수락되었는지 확인합니다.

Cloud Build를 GitHub 저장소에 연결

이 섹션에서는 Cloud Build GitHub 앱을 설치하는 방법을 보여줍니다. 이렇게 설치하면 GitHub 저장소를 Google 클라우드 프로젝트에 연결하여 Cloud Build가 각 pull 요청 시 Kubernetes 예상 도구를 자동으로 실행할 수 있습니다.

  1. Cloud Build 앱의 GitHub Marketplace 페이지로 이동합니다.

    Cloud Build 열기

  2. 앱의 GitHub 계정 액세스를 설정합니다.

    1. GitHub에서 앱을 처음 구성할 때는 페이지 하단에서 Google Cloud Build로 설정을 클릭한 후 이 앱에 GitHub 계정 액세스 권한 부여를 클릭합니다.
    2. 이전에 GitHub에서 앱을 설정했으면 액세스 구성을 클릭합니다.
  3. 열린 애플리케이션 페이지에서 다음 단계를 수행합니다.

    1. Google Cloud Build 행에서 구성을 클릭합니다.
    2. 저장소만 선택 옵션을 선택합니다.
    3. k8s-cost-Estimator-github를 선택하여 바로 전에 만든 저장소에 연결합니다.
    4. 저장 또는 설치(실행 중인 작업 흐름에 따라 버튼 라벨이 달라짐)를 클릭합니다.
  4. 이제 설치를 계속할 수 있도록 Google Cloud로 리디렉션됩니다. Google Cloud 계정에 로그인합니다. 메시지가 표시되면 GitHub와 Cloud Build 통합을 승인합니다.

  5. Cloud Build 페이지에서 프로젝트를 선택합니다. 마법사가 표시됩니다.

  6. 마법사의 저장소 선택 섹션에서 GitHub 계정 및 k8s-cost-estimator-github 저장소를 선택합니다.

  7. 이용약관에 동의하면 체크박스를 선택하고 연결을 클릭합니다.

  8. 트리거 만들기 섹션에서 트리거 만들기를 클릭한 후 다음 단계를 따릅니다.

    1. 트리거 이름을 입력합니다.
    2. 이벤트 섹션에서 pull 요청(GitHub 앱만 해당)을 선택합니다.
    3. 소스 섹션에서 다음을 수행합니다.
      • 저장소 필드가 your-github-user/k8s-cost-estimator-github(GitHub 앱)으로 자동으로 채워졌는지 확인합니다.
      • 기본 분기 드롭다운에서 .*를 선택합니다.
    4. 구성 유형 섹션에서 Cloud Build 구성 파일(yaml 또는 json)을 선택합니다.
    5. 고급 섹션에서 다음 대체 변수를 추가합니다.

      • _GITHUB_TOKEN = YOUR_PERSONAL_ACCESS_TOKEN
      • _GITHUB_FINOPS_REVIEWER_USER = THE_GITHUB_FINOPS_REVIEWER_USER
      • _GITHUB_FINOPS_COST_USD_THRESHOLD = 10

      다음을 바꿉니다.

      • YOUR_PERSONAL_ACCESS_TOKEN: 만든 GitHub 개인 액세스 토큰입니다. 이 토큰은 Cloud Shell에서 GITHUB_TOKEN 변수로 제공됩니다.
      • THE_GITHUB_FINOPS_REVIEWER_USER: GitHub 저장소에서 공동작업자로 초대된 사용자입니다. 이 사용자 이름은 Cloud Shell에서 GITHUB_FINOPS_REVIEWER_USER 변수로 제공됩니다.
  9. 만들기를 클릭합니다.

이제 Cloud Build GitHub 앱이 구성되었으며 GitHub 저장소가 Google Cloud 프로젝트에 연결되었습니다. 이제 GitHub 저장소로 Pull 요청을 수행하면 Cloud Build 실행이 트리거되어, GitHub 검사를 사용하여 결과가 GitHub에 다시 보고됩니다.

예시 코드를 GitHub 저장소로 푸시

  1. 샘플 코드를 GitHub 저장소로 푸시할 수 있도록 SSH 키 쌍을 만듭니다.

    mkdir -p ssh && cd ssh
    ssh-keygen -t rsa -b 4096 -N '' -f github-key
    eval `ssh-agent` && ssh-add $(pwd)/github-key
    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/keys \
      -d "{\"title\":\"k8s-cost-estimator-key\", \"key\":\"$(cat github-key.pub)\"}" | jq
    cd ..
    

    출력은 다음과 비슷합니다.

    {
      "id": 52356205,
      "key": "ssh-rsa AAAAB3NzaC….wJICyt0yvWjGFZGCWBPUw==",
      "url": "https://api.github.com/user/keys/526205",
      "title": "k8s-cost-estimator-key",
      "verified": true,
      "created_at": "2021-04-23T16:22:58Z",
      "read_only": false
    }
    
  2. 새 GitHub 저장소로 콘텐츠를 푸시합니다.

    sed "s/GCP_PROJECT_ID/$GCP_PROJECT_ID/g; s/GITHUB_USER/$GITHUB_USER/g; s/GITHUB_EMAIL/$GITHUB_EMAIL/g;" templates/cloudbuild.yaml.tpl > cloudbuild.yaml
    
    GITHUB_SSH_URL_REPO=$(curl -X GET \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github | jq -r .ssh_url)
    [ -z "$GITHUB_SSH_URL_REPO" ] && echo "GITHUB_SSH_URL_REPO is not exported" || echo "GITHUB_SSH_URL_REPO is $GITHUB_SSH_URL_REPO"
    
    git init
    git remote add origin $GITHUB_SSH_URL_REPO
    git add -A .
    git commit -m "Initial commit"
    git checkout -b main
    git push -u origin main
    

코드 변경 및 비용 예상 테스트를 위한 pull 요청 만들기

  1. Cloud Shell에서 wordpress/wordpress_hpa.yaml 파일에 대한 GitHub URL을 가져옵니다.

    echo "https://github.com/$GITHUB_USER/k8s-cost-estimator-github/edit/main/wordpress/wordpress_hpa.yaml"
    
  2. 출력 URL을 Ctrl+클릭(Mac 사용자의 경우 Cmd+클릭)하여 GitHub로 이동하고 wordpress/wordpress_hpa.yaml 파일을 수정합니다.

  3. GitHub에서 minReplicas5로 변경합니다.

  4. 이 커밋에 대한 새 분기를 만들고 pull 요청을 시작합니다.를 선택하고 변경 제안을 클릭합니다.

  5. pull 요청 열기 화면에서 pull 요청 만들기를 클릭합니다.

    새 pull 요청을 만드는 것 외에도 이 단계는 이전에 만든 cloudbuild.yaml 파일을 기준으로 Cloud Build 실행을 트리거합니다. 이러한 Cloud Build 실행은 Kubernetes 비용 예측 도구 이미지 빌드 및 푸시에서 빌드한 컨테이너 이미지를 사용하며 FinOps 검토자가 필요한 시간을 결정합니다.

  6. 파이프라인이 완료되도록 1분 정도 기다립니다. 완료되면 pull 요청에 비용 세부정보가 포함된 주석이 추가되고, 제안된 코드의 비용이 $10 임곗값을 초과했기 때문에 FinOps 검토자도 요청됩니다.

    출력은 다음과 비슷합니다.

    pull 요청에 대한 자세한 비용 정보가 추가됩니다.

이제 개발 주기의 초기에 지출 비용에 대한 가시성을 개발자들에게 제공하는 방법을 배웠습니다. 이러한 설정은 조직에서 예상치 못한 Google Cloud 비용이 청구되는 것을 방지하는 데 도움을 줍니다.

삭제

이 튜토리얼에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 프로젝트를 삭제하면 됩니다.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

GitHub 저장소 삭제

GitHub 저장소를 유지하지 않으려면 다음 단계를 따르세요.

  1. Cloud Shell에서 GitHub 저장소를 삭제합니다.

    curl -X DELETE \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github
    

    Cloud Shell과의 연결을 해제하면 GITHUB_TOKENGITHUB_USER 변수를 재설정해야 합니다.

다음 단계