Skip to main content

Google Kubernetes Engineへのデプロイ

継続的デプロイメント(CD)ワークフローの一部として、Google Kubernetes Engineへのデプロイを行えます。

注: GitHub ホステッド ランナーは、現在 GitHub Enterprise Server でサポートされていません。 GitHub public roadmap で、今後の計画的なサポートの詳細を確認できます。

はじめに

このガイドは、main ブランチへのプッシュがある場合、GitHub Actions を使ってコンテナー化されたアプリケーションをビルドし、それを Google Container Registry (GCR) にプッシュし、Google Kubernetes Engine (GKE) にデプロイする方法を説明します。

GKEはGoogle CloudによるマネージドなKubernetesクラスタサービスで、コンテナ化されたワークロードをクラウドもしくはユーザ自身のデータセンターでホストできます。 詳細については、「Google Kubernetes Engine」を参照してください。

: GitHub Actions ワークフローが OpenID Connect (OIDC) をサポートするクラウド プロバイダーのリソースにアクセスする必要がある場合、そのクラウド プロバイダーで直接認証されるようにワークフローを構成できます。 これにより、有効期間の長いシークレットとしてこれらの資格情報の格納を停止し、その他のセキュリティ上の利点を提供できます。 詳細については、「OpenID Connect を使用したセキュリティ強化について」を参照してください。

前提条件

ワークフローの作成に進む前に、Kubernetesプロジェクトについて以下のステップを完了しておく必要があります。 このガイドは、プロジェクトのルートに Dockerfile と Kubernetes Deployment 構成ファイルが既にあることを前提としています。 例については、google-github-actions を参照してください。

GKEクラスタの作成

GKE クラスターを作成するには、まず gcloud CLI を使用して認証する必要があります。 このステップに関する詳しい情報については、以下の記事を参照してください。

次に例を示します。

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

APIの有効化

Kubernetes Engine及びContainer Registry APIを有効化してください。 次に例を示します。

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

サービスアカウントの設定と資格情報の保存

この手順は、GKEインテグレーション用のサービスアカウントの作成方法を示します。 アカウントを作成し、ロールを追加し、そのキーを取得し、GKE_SA_KEY という名前の、base64 でエンコードされた暗号化されたリポジトリ シークレットとして格納する方法について説明します。

  1. 新しいサービス アカウントを作成します。

    $ gcloud iam service-accounts create $SA_NAME
    
  2. 作成したサービス アカウントのメール アドレスを取得します。

    $ gcloud iam service-accounts list
    
  3. サービスアカウントにロールを追加してください。 ノート: 要件に合わせて、より制約の強いロールを適用してください。

    $ 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)
    

    シークレットを格納する方法の詳細については、「暗号化されたシークレット」を参照してください。

プロジェクト名の保存

プロジェクトの名前を GKE_PROJECT という名前のシークレットとして保存します。 シークレットを保存する方法の詳細については、「暗号化されたシークレット」を参照してください。

(オプション)kustomizeの設定

Kustomizeは、YAML仕様を管理するために使われるオプションのツールです。 kustomization ファイルを作成した後、次のワークフローを使用して、イメージのフィールドを動的に設定し、結果を kubectl にパイプできます。 詳細については、「kustomize の使用」を参照してください。

(省略可能) デプロイ環境を構成する

環境は、一般的なデプロイ ターゲットを記述するために使用されます (例: productionstaging、または development)。 GitHub Actions ワークフローが環境にデプロイされると、その環境がリポジトリのメイン ページに表示されます。 環境を使用して、ジョブの続行に対する承認の要求、ワークフローをトリガーできるブランチの制限、シークレットへのアクセスの制限を実行できます。 環境の作成の詳細については、「デプロイに環境を使用する」を参照してください。

ワークフローの作成

必要な環境を整えたら、ワークフローの作成に進むことができます。

以下のワークフロー例は、コンテナイメージを作成して GCR にプッシュする方法を示しています。 次に、Kubernetes ツール (kubectlkustomize など) を使用して、イメージがクラスター デプロイにプルされます。

env キーの下で、GKE_CLUSTER の値をクラスターの名前に、GKE_ZONE をクラスター ゾーンに、DEPLOYMENT_NAME をデプロイの名前に、IMAGE をイメージの名前に変更します。

デプロイ環境を構成した場合は、environment の値を環境の名前に変更します。 環境を構成しなかった場合 を使わない場合は、environment キーを削除します。

YAML
# <a name="this-workflow-uses-actions-that-are-not-certified-by-github"></a>このワークフローはGitHubによって認定されていないアクションを使用します。
# <a name="they-are-provided-by-a-third-party-and-are-governed-by"></a>それらはサードパーティによって提供され、
# <a name="separate-terms-of-service-privacy-policy-and-support"></a>別個の利用規約、プライバシーポリシー、
# <a name="documentation"></a>ドキュメントを参照してください。

# <a name="github-recommends-pinning-actions-to-a-commit-sha"></a>GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# <a name="to-get-a-newer-version-you-will-need-to-update-the-sha"></a>新しいバージョンを取得するには、SHA を更新する必要があります。
# <a name="you-can-also-reference-a-tag-or-branch-but-the-action-may-change-without-warning"></a>タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。

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@v3

    # Setup gcloud CLI
    - uses: google-github-actions/setup-gcloud@94337306dda8180d967a56932ceb4ddcf01edae7
      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@fb08709ba27618c31c09e014e1d8364b02e5042e
      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

その他のリソース

これらの例で使用されているツールの詳細については、次のドキュメントを参照してください。