GitHub を使用して開発サイクルの早い段階で GKE の費用を見積もる

Last reviewed 2022-12-15 UTC

このチュートリアルでは、Google Kubernetes Engine(GKE)の費用の可視性を開発チームに対してシフトレフトするためのベスト プラクティスについて説明します。このシフトレフトの手法により、プロセスの早い段階で費用を認識し、Google Cloud の請求で予期しない影響が生じることを回避できます。

このチュートリアルは、GKE クラスタの費用を最適化し、本番環境で GitHub を使用するデベロッパー、オペレーター、FinOps 担当者を対象としています。代わりに GitLab を使用する場合は、GitLab を使用して開発サイクルの早い段階で GKE の費用を見積もるをご覧ください。

このチュートリアルでは、DockerGitHubKubernetesGKECloud Build、Linux に精通していることを前提としています。

概要

パブリック クラウドを採用する多くのチームが、従量課金制について精通していません。多くの場合に、アプリが実行されている環境(このケースでは GKE)についても十分に理解していません。FinOps の運用モデルでは、この財務説明責任の文化が改善されます。FinOps のベスト プラクティスは、費用の問題が発生した場合はできる限り早期に解決できるよう、チームにリアルタイムの支出情報を提供することです。

このドキュメントでは、費用が請求書の支出項目となる前に費用を見積もり、さらに一歩取り組みを進める方法について説明します。GitHub ウェブサイトでハイライト表示されているように、GitHub では pull リクエストごとに軽量のコードレビュー ツールが組み込まれています。これにより、ソースコードを変更する前に、プロジェクトを進化させ、新機能の提案、実装の詳細についてのディスカッションを行うことができます。費用の見積もりを行う最も適切なタイミングは、開発段階からコードレビューまでの間の早期の時点です。これにより、実務担当者は新機能とバグ修正の費用に対する影響が顕在化する前に、代替手段を確認し、議論できます。次の図は、この方法の概要を示しています。

費用の早期見積もりに関するベスト プラクティス。

図に示すように、デベロッパーはローカル環境での GKE の費用を見積もることができます。これはビルド時に行うのが理想的です。この見積もりにより、本番環境での月々のワークロード費用を適切に把握できます。機能またはバグ修正のコードが完成すると、Cloud Build をトリガーして新旧費用の差を確認する pull リクエストが提案されます。事前定義のしきい値を超える増加があった場合は、新しいコードレビューをリクエストできます。この方法は、本番環境で不安定性が見つかるたびにリソースを追加する代わりに、デベロッパーがワークロード容量をより明確に認識し、アプリケーションの問題をプロアクティブに修正するのに有効です。

目標

  • Kubernetes の費用見積もりツールのイメージをビルドし、push します。
  • GitHub リポジトリを作成します。
  • Cloud Build を GitHub リポジトリに接続します。
  • サンプルコードを GitHub リポジトリに push します。
  • コードを変更し、pull リクエストを提案して費用を見積もります。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud コンソールでプロジェクトの選択ページに移動します。

    プロジェクト セレクタに移動

  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 Cloud プロジェクトを設定し、必要な API を有効にします。

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

Kubernetes の費用見積もりツールのイメージをビルドし、push する

このチュートリアルに付属する 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
    

    出力の Markdown テーブルに、./samples/k8s-cost-estimator-local/app-v1/ フォルダの毎月の推定費用が示されます。アプリケーションの毎月の本番環境費用をより深く理解するため、デベロッパーはリモート リポジトリに push する前にこのステップを実行できます。

    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. Docker の構成ファイルに、認証ヘルパーとして gcloud を登録します。プロンプトが表示されたら、ファイルの更新を確定します。

    gcloud auth configure-docker us-central1-docker.pkg.dev
    
  7. イメージを Artifact Registry に push します。

    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. [Note] フィールドに、トークンの説明を入力します。
    2. [Select scopes] で、repoadmin:public_keydelete_repo の各チェックボックスをオンにします。
    3. [Generate token] をクリックし、ページの上部にある Your new personal access token の値をコピーします。
  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 プロジェクトに接続することで、Cloud Build が各 pull リクエストで Kubernetes Estimator ツールを自動的に実行できるようになります。

  1. Cloud Build アプリの GitHub Marketplace ページにアクセスします。

    Cloud Build を開く

  2. アプリに対して GitHub アカウントへのアクセス権を設定します。

    1. GitHub でアプリを初めて構成する場合は、ページの下部にある [Setup with Google Cloud Build] をクリックして、[Grant this app access to your GitHub account] をクリックします。
    2. GitHub でアプリを構成するのが初めてではない場合は、[Configure access] をクリックします。
  3. [Applications] ページが開いたら、次の手順を行います。

    1. Google Cloud Build の行で [Configure] をクリックします。
    2. [Only select repositories] オプションを選択します。
    3. [k8s-cost-estimator-github] を選択して、先ほど作成したリポジトリに接続します。
    4. [Save] または [Install] をクリックします(ボタンのラベルは、実行しているフローによって異なります)。
  4. インストールを続行するために Google Cloud にリダイレクトされます。Google Cloud アカウントでログインします。プロンプトが表示されたら、Cloud Build と GitHub の統合を承認します。

  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 Checks を使用して結果が GitHub に報告されます。

サンプルコードを GitHub リポジトリに push する

  1. サンプルコードを GitHub リポジトリに push できるように 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 リポジトリに push します。

    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. [Create a new branch for this commit and start a pull request] を選択し、[Propose Changes] をクリックします。

  5. [Open a pull request] 画面で、[Create pull request] をクリックします。

    このステップによって新しい pull リクエストが作成されるだけでなく、先ほど作成した cloudbuild.yaml ファイルに基づいて Cloud Build の実行がトリガーされます。この Cloud Build の実行では、Kubernetes コスト見積もりツールのイメージのビルドと push でビルドしたコンテナ イメージが使用され、FinOps レビュー担当者が必要になるタイミングが決定されます。

  6. パイプラインが完了するまで 1 分ほど待ちます。終了すると、pull リクエストに費用の詳細を含むコメントが追加されます。また、提案するコードの費用が $10 しきい値を超えたため、FinOps 審査担当者もリクエストされます。

    出力は次のようになります。

    費用の詳細な内訳が pull リクエストに追加されます。

これで、開発サイクルの早い段階でデベロッパーが費用を可視化できるようにする方法を把握できました。これにより、ユーザーと組織が Google Cloud の請求で予期しない費用の発生を防ぐことができます。

クリーンアップ

このチュートリアルで使用したリソースに対する Google Cloud アカウントへの課金を回避するには、プロジェクトを削除します。

プロジェクトの削除

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

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_TOKEN 変数と GITHUB_USER 変数をリセットする必要があります。

次のステップ