このチュートリアルでは、 GitHub Actions ワークフローを使用して、 .NET Framework を使用する ASP.NET Model-View-Controller(MVC)ウェブ アプリケーションを Google Kubernetes Engine(GKE)にデプロイする方法について説明します。
このチュートリアルは、Microsoft .NET、GitHub Actions、GKE に関する基本的な知識があるデベロッパーと DevOps エンジニアを対象としています。このチュートリアルを実行するには、GitHub アカウントも必要です。
目標
.NET Framework 4 を使用し、 Windows で動作する ASP.NET MVC ウェブ アプリケーションを Google Kubernetes Engine にデプロイします。
次の図は、ASP.NET MVC ウェブ アプリケーションを Google Kubernetes Engine(GKE)にデプロイする GitHub Actions ワークフローを示しています。

このチュートリアルでは、目的を達成するために次のタスクを行う方法について説明します。
- GitHub リポジトリの作成
- 認証を構成する
- GKE クラスタと Artifact Registry リポジトリをデプロイする
- GitHub Actions ワークフローを作成する
費用
このドキュメントでは、課金対象である次のコンポーネントを使用します。 Google Cloud
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、 クリーンアップをご覧ください。
始める前に
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry and Google Kubernetes Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry and Google Kubernetes Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
GitHub リポジトリの作成
GitHub アカウントに dotnet-docs-samples リポジトリのフォークを作成します。この手順は、GitHub Actions でビルドするため必要です。
dotnet-docs-samplesGitHub リポジトリに移動します。- [Fork] をクリックします。
[Create a new fork] ページで、次のように設定します。
- オーナー - GitHub アカウント
- リポジトリ名 -
dotnet-docs-samples
[フォークの作成] をクリックします。
認証を構成する
GitHub Actions が Google Cloud プロジェクトのリソースを認証して アクセスできるように、 Google Cloud プロジェクトを準備します。
Workload Identity 連携のプールとプロバイダを作成する
GitHub Actions が を認証して GKE にデプロイできるようにするには、Workload Identity 連携を使用します。 Google Cloud Workload Identity 連携を使用すると、GitHub Actions ワークロードの サービス アカウント キーを保存して管理する必要がなくなります。
Workload Identity 連携を使用するには、Workload Identity プールとプロバイダが必要です。 Workload Identity のプールとプロバイダの管理に専用のプロジェクトを使用することをおすすめします。 このチュートリアルでは、わかりやすくするため、GKE クラスタと同じプロジェクトにプールとプロバイダを作成します。
コンソールを開きます。 Google Cloud
-
コンソールで Cloud Shell をアクティブにします。 Google Cloud
コンソールの下部にある Google Cloud Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です 。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています 。セッションが初期化されるまで数秒かかることがあります。
Workload Identity プールを新規作成します。
gcloud iam workload-identity-pools create github-actions \ --location="global" \ --description="GitHub Actions tutorial" \ --display-name="GitHub Actions"GitHub Actions を Workload Identity プール プロバイダとして追加します。
gcloud iam workload-identity-pools providers create-oidc github-actions-oidc \ --location="global" \ --workload-identity-pool=github-actions \ --issuer-uri="https://token.actions.githubusercontent.com/" \ --attribute-mapping="google.subject=assertion.sub" \ --attribute-condition="assertion.repository_owner=='ORGANIZATION'"ORGANIZATIONは、GitHub 組織の名前に置き換えます。
サービス アカウントを作成する
Cloud Shell で、GitHub Actions が Docker イメージの公開と GKE へのデプロイに使用できるサービス アカウントを作成します。
SERVICE_ACCOUNT=$(gcloud iam service-accounts create github-actions-workflow \ --display-name "GitHub Actions workflow" \ --format "value(email)")
Artifact Registry ライターロール(`roles/artifactregistry.writer`)をサービス アカウントに付与して、GitHub Actions が Artifact Registry に push できるようにします。
roles/artifactregistry.writergcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/artifactregistry.writer
Google Kubernetes Engine デベロッパー ロール (
roles/container.developer)をサービス アカウントに付与して、GitHub Actions が Artifact Registry に push できるようにします。gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/container.developer
GitHub Actions ワークフローでサービス アカウントを使用できるようにする
GitHub Actions ワークフローでサービス アカウントの権限を借用して使用できるようにします。
GitHub Actions ワークフローで使用される サブジェクト を含む環境変数を初期化します。サブジェクトは、GitHub リポジトリとブランチを一意に識別するユーザー名に似ています。
SUBJECT=repo:
OWNER/dotnet-docs-samples:ref:refs/heads/mainOWNERは GitHub ユーザー名で置き換えます。サービス アカウントの権限を借用する権限をサブジェクトに付与します。
PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value core/project) --format='value(projectNumber)') gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT \ --role=roles/iam.workloadIdentityUser \ --member="principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/github-actions/subject/$SUBJECT"
GKE クラスタと Artifact Registry リポジトリをデプロイする
Docker イメージのリポジトリを作成します。
gcloud artifacts repositories create clouddemo \ --repository-format=docker \ --location=us-central1
Compute Engine のデフォルト サービス アカウントにリポジトリへのアクセスを許可します。
gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.reader
クラスタを作成します。
gcloud container clusters create clouddemo-windows \ --enable-ip-alias \ --zone us-central1-a gcloud container node-pools create clouddemo-windows-pool \ --cluster=clouddemo-windows \ --image-type=WINDOWS_LTSC_CONTAINERD \ --no-enable-autoupgrade \ --machine-type=n1-standard-2 \ --zone us-central1-a
この手順は完了するまでに数分かかることがあります。
クラスタのプロジェクト名とプロジェクト番号を取得します。
echo "Project ID: $(gcloud config get-value core/project)" echo "Project Number: $(gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\))"
これらの値は後で必要になります。
GitHub Actions ワークフローを作成する
この段階で GitHub Actions を使用して継続的インテグレーションを設定できます。commit によって Git リポジトリへの push を行うたびに、GitHub Actions ワークフローによってコードがビルドされ、そのビルドのアーティファクトが Docker コンテナにパッケージ化されます。そのコンテナは Artifact Registry に公開されます。
リポジトリには、すでに次の Dockerfile が含まれています。
リポジトリには、Kubernetes マニフェストも含まれています。
次の処理を行う GitHub Actions ワークフローを作成します。
- Workload Identity 連携と、先ほど作成したサービス アカウントを使用して Google Cloud を認証します。
- Docker イメージをビルドして、Artifact Registry にデプロイします。
- Docker イメージを GKE にデプロイします。
GitHub Actions ワークフローを作成する手順は次のとおりです。
- GitHub で、
dotnet-docs-samplesリポジトリのフォークに移動します。 - [Add file] > [Create new file] をクリックします。
[Name your file] テキスト フィールドに次の名前を入力します。
.github/workflows/deploy-gke.yaml
次のコードをファイルにコピーします。
name: Build and Deploy to GKE on: push: branches: - main env: PROJECT_ID:PROJECT_IDPROJECT_NUMBER:PROJECT_NUMBERCLUSTER: clouddemo-windows CLUSTER_ZONE: us-central1-a REPOSITORY: clouddemo REPOSITORY_REGION: us-central1 IMAGE: clouddemo jobs: build: runs-on: windows-2019 # Matches WINDOWS_LTSC in GKE permissions: id-token: write contents: read steps: - name: Checkout uses: actions/checkout@v3 # # Authenticate to Google Cloud using workload identity federation # - id: 'auth' name: 'Obtain access token by using workload identity federation' uses: 'google-github-actions/auth@v0' with: create_credentials_file: true token_format: access_token workload_identity_provider: projects/${{ env.PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions-oidc service_account: github-actions-workflow@${{ env.PROJECT_ID }}.iam.gserviceaccount.com - name: Connect to Artifact Registry run: |- echo ${{ steps.auth.outputs.access_token }} | docker login -u oauth2accesstoken --password-stdin https://${{ env.REPOSITORY_REGION }}-docker.pkg.dev - name: Connect to GKE uses: google-github-actions/get-gke-credentials@v0 with: cluster_name: ${{ env.CLUSTER }} location: ${{ env.CLUSTER_ZONE }} # # Build the .NET code # - name: Setup MSBuild uses: microsoft/setup-msbuild@v1 - name: Setup NuGet uses: NuGet/setup-nuget@v1 - name: Restore NuGet packages run: nuget restore applications/clouddemo/net4/CloudDemo.Mvc.sln - name: Build solution run: msbuild /t:Rebuild /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=FolderProfile /nologo applications/clouddemo/net4/CloudDemo.Mvc.sln # # Build the Docker image and push it to Artifact Registry # - name: Create image tag run: echo "IMAGE_TAG=${{ env.REPOSITORY_REGION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE }}:$env:GITHUB_SHA" >> $env:GITHUB_ENV - name: Lock image version in deployment.yaml shell: pwsh run: (Get-Content applications\clouddemo\net4\deployment.yaml) -replace "CLOUDDEMO_IMAGE","${{ env.IMAGE_TAG }}" | Out-File -Encoding ASCII applications\clouddemo\net4\deployment.yaml - name: Build Docker image run: docker build --tag "${{ env.IMAGE_TAG }}" applications/clouddemo/net4 - name: Publish Docker image to Google Artifact Registry run: docker push "${{ env.IMAGE_TAG }" # # Deploy to GKE # - name: Deploy to GKE run: kubectl apply -f applications/clouddemo/net4/deployment.yaml次の値を置き換えます。
PROJECT_ID: GKE クラスタを含むプロジェクトのプロジェクト ID 。PROJECT_NUMBER: GKE クラスタを含むプロジェクトのプロジェクト番号 。
[Commit new file] セクションに commit メッセージ(例:
Add workflow)を入力し、[Commit new file] をクリックします。メニューで [Actions] をクリックし、ワークフローの完了を待ちます。
ワークフローの完了には数分かかることがあります。
コンソールで、[Services & Ingress] ページを更新します。 Google Cloud
[Ingress] タブに移動します。
clouddemo クラスタの Ingress サービスを確認して、そのステータスが [OK] に切り替わるのを待ちます。これには数分かかることがあります。
同じ行の [フロントエンド] 列にあるリンクを開きます。ロードバランサが利用可能になるまで数分かかるため、最初は CloudDemo アプリが読み込まれない場合があります。ロードバランサの準備が整うと、カスタム タイトルが付いた CloudDemo アプリが表示されます。今回は本番環境クラスタで実行されます。
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。以下のセクションで、リソースを削除または無効にする方法を説明します。
GitHub リポジトリの削除
GitHub リポジトリを削除するには、リポジトリを削除するをご覧ください。 リポジトリを削除すると、ソースコードの変更もすべて失われます。
プロジェクトの削除
課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除します。 Google Cloud
gcloud projects delete PROJECT_ID
次のステップ
- Kubernetes 上でコンテナ化されたアプリケーションをデプロイ、管理、スケーリングする。
- Google Cloud Well-Architected Framework のベスト プラクティスを確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。