デプロイ ポリシーを使用してロールアウトを制限する
このクイックスタートでは、指定した期間にターゲットへの Cloud Deploy ロールアウトを防止する方法と、その制限をオーバーライドする方法について説明します。
このクイックスタートでは、以下の内容を行います。
Skaffold 構成と Kubernetes マニフェストまたは Cloud Run サービス定義を作成して、デプロイする(ビルド済みの)コンテナ イメージを指定します。
Cloud Deploy デリバリー パイプラインと 1 つのデプロイ ターゲットを定義し、1 つの GKE クラスタまたは Cloud Run サービスを指します。
このパイプラインには、1 つのターゲットに対して 1 つのステージのみが含まれます。
ターゲットに対するデプロイ ポリシーを構成します。
このポリシーでは、そのターゲットへのロールアウトを禁止する日付の範囲を定義します。
リリースを作成します。
通常、リリースを作成すると、Cloud Deploy はデリバリー パイプラインの進行で最初のターゲットに対するロールアウトを作成します。この場合、ターゲットへのデプロイを禁止するポリシーがあるため、そのターゲットに対するロールアウトは作成されません。
Google Cloud コンソールで結果を表示します。
ポリシーにより、リリースに対するロールアウトは表示されず、デリバリー パイプラインの可視化に保留中のアクションがありません。
デプロイ ポリシーをオーバーライドします。
このオーバーライドにより、Cloud Deploy ではターゲットに対するロールアウトが作成されます。
Google Cloud コンソールで結果を表示します。
これでポリシーがオーバーライドされたので、ロールアウトが進行中であること(または、十分な時間が経過している場合は完了済みであること)を確認できます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- デフォルトの Compute Engine サービス アカウントに十分な権限があることを確認します。
このサービス アカウントにはすでに必要な権限が付与されている場合があります。これらの手順は、デフォルトのサービス アカウントの自動的なロール付与を無効にするプロジェクトに含まれています。
- 最初に、
clouddeploy.jobRunner
ロールを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.jobRunner"
clouddeploy.policyAdmin
ロールを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.policyAdmin"
- 特定のランタイム向けのデベロッパー ロールを追加します。
- GKE の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/container.developer"
- Cloud Run の場合:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/run.developer"
-
iam.serviceAccountUser
ロールを追加します。これには、ランタイムにデプロイするactAs
権限が含まれます。gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
Google Cloud CLI がすでにインストールされている場合は、最新バージョンを実行していることを確認します。
gcloud components update
ランタイム環境を作成する
Cloud Run にデプロイする場合は、以下のコマンドをスキップできます。
GKE の場合は、1 つのクラスタ(quickstart-cluster-qsprod
)を作成します。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。GKE クラスタには、デフォルトで外部からアクセス可能です。
gcloud container clusters create-auto quickstart-cluster-qsprod \
--project=PROJECT_ID \
--region=us-central1
Skaffold 構成とアプリケーション マニフェストを準備する
Cloud Deploy では、Skaffold を使用して、デプロイする対象と、それをターゲットにデプロイする方法の詳細を提供します。
このクイックスタートでは、skaffold.yaml
ファイルを作成して、サンプルアプリのデプロイに使用する Kubernetes マニフェストを識別します。
ターミナル ウィンドウを開きます。
新しいディレクトリを作成し、そのディレクトリに移動します。
mkdir deploy-policy-quickstart cd deploy-policy-quickstart
次の内容のファイルを
skaffold.yaml
という名前で作成します。GKE
apiVersion: skaffold/v4beta1 kind: Config manifests: rawYaml: - k8s-pod.yaml deploy: kubectl: {}
Cloud Run
apiVersion: skaffold/v4beta1 kind: Config manifests: rawYaml: - service.yaml deploy: cloudrun: {}
このファイルは最小限の Skaffold 構成ファイルです。このクイックスタートでは、このファイルを作成します。ただし、Cloud Deploy で作成することで、基本的な非本番環境アプリケーション用に作成することもできます。
この構成ファイルの詳細については、
skaffold.yaml
リファレンスをご覧ください。アプリケーションのマニフェスト(Cloud Run のサービス定義または GKE の Kubernetes マニフェスト)を作成します。
GKE
次の内容のファイルを
k8s-pod.yaml
という名前で作成します。apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - name: nginx image: my-app-image
このファイルは、基本的な Kubernetes マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。デプロイするコンテナ イメージは、ここでプレースホルダ
my-app-image
として設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。Cloud Run
次の内容のファイルを
service.yaml
という名前で作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-deploy-policy-run-service spec: template: spec: containers: - image: my-app-image
このファイルは、アプリケーションのデプロイに使用される基本的な Cloud Run サービス定義です。デプロイするコンテナ イメージは、ここでプレースホルダ
my-app-image
として設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。
デリバリー パイプラインとターゲットを作成する
デリバリー パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。このクイックスタートでは、両方を含む 1 つのファイルを作成します。
デリバリー パイプラインとターゲット定義を作成:
GKE
deploy-policy-quickstart
ディレクトリに、次の内容を含む新しいclouddeploy.yaml
ファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-policy-pipeline serialPipeline: stages: - targetId: prod-target --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod-target description: production cluster gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/quickstart-cluster-qsprod
Cloud Run
deploy-policy-quickstart
ディレクトリに、次の内容を含む新しいclouddeploy.yaml
ファイルを作成します。apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-policy-pipeline serialPipeline: stages: - targetId: prod-target --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prod-target description: production Run service run: location: projects/PROJECT_ID/locations/us-central1
パイプラインとターゲット リソースを Cloud Deploy サービスに登録します。
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
これで、1 つのデリバリー パイプラインと 1つのターゲットが作成されました。
次のとおりに、パイプラインとターゲットを確認します。
Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。
作成したデリバリー パイプラインが表示され、[ターゲット] 列に 1 つのターゲットが表示されます。
デプロイ ポリシーを作成する
デプロイ ポリシーは、デリバリー パイプラインとターゲットと同じファイルで定義することも、別のファイルで定義することもできます。このクイックスタートでは、別に定義します。
デリバリー パイプラインとターゲットを作成したディレクトリに、次の内容の新しいファイル
deploypolicy.yaml
を作成します。apiVersion: deploy.cloud.google.com/v1 description: Restrict all rollouts in the deploy-policy-pipeline resource for the next ten years kind: DeployPolicy metadata: name: quickstart-deploy-policy selectors: - deliveryPipeline: id: 'deploy-policy-pipeline' rules: - rolloutRestriction: id: no-rollouts timeWindows: timeZone: America/New_York oneTimeWindows: - start: 2024-01-01 00:00 end: 2034-01-01 24:00
このポリシーにより、2024 年 1 月 1 日から 10 年間ロールアウトがブロックされます。これは現実的なポリシーではありません。リリースの作成時にポリシーが確実に適用されるように、このクイックスタートでのみこのようにしています。
デプロイ ポリシー リソースを Cloud Deploy サービスに登録します。
gcloud deploy apply --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
デプロイ ポリシーを確認します。
Google Cloud コンソールで、Cloud Deploy の [ポリシーをデプロイする] ページに移動し、使用可能なポリシーのリストを表示します。
作成したデプロイ ポリシーが表示されます。
リリースを作成する
リリースは Cloud Deploy リソースの中心で、デプロイの変更を表します。デリバリー パイプラインは、そのリリースのライフサイクルを定義します。このライフサイクルの詳細については、Cloud Deploy のサービス アーキテクチャをご覧ください。
GKE
deploy-policy-quickstart
ディレクトリから次のコマンドを実行して、リリースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
--images=
フラグに注目してください。これは、マニフェストまたはサービス定義のプレースホルダ(my-app-image
)を特定の SHA 修飾イメージに置き換えるために使用します。このようにマニフェストをテンプレート化し、リリースの作成時に SHA 修飾付きのイメージ名を使用することをおすすめします。
Cloud Run
deploy-policy-quickstart
ディレクトリから次のコマンドを実行して、リリースを作成します。
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
--images=
フラグに注目してください。これは、マニフェストまたはサービス定義のプレースホルダ(my-app-image
)を特定の SHA 修飾イメージに置き換えるために使用します。このようにマニフェストをテンプレート化し、リリースの作成時に SHA 修飾付きのイメージ名を使用することをおすすめします。
通常、このコマンドを使用してリリースを作成するときに、Cloud Deploy は最初のターゲットへのロールアウトを作成します。この場合、ロールアウトはデプロイ ポリシーに従って制限されているため、ロールアウトは作成されません。コマンドラインにはエラー メッセージが表示されます。
ERROR: (gcloud.deploy.releases.create) A create-rollout attempt was blocked by the "quickstart-deploy-policy"
policy. Target: "prod-target", Delivery pipeline: "deploy-policy-pipeline", policy rule: "no-rollouts"
ポリシーによる制限をオーバーライドする
デプロイ ポリシーによってブロックされているサンプル アプリケーションをデプロイするには、そのポリシーをオーバーライドする必要があります。これを行うには、このリリースに対して新しいロールアウトを作成し、今回は --override-deploy-policies
オプションを含めます。
GKE
deploy-policy-quickstart
ディレクトリから次のコマンドを実行して、リリースを作成します。
gcloud deploy releases promote --release=test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--to-target=prod-target \
--override-deploy-policies=quickstart-deploy-policy
Cloud Run
deploy-policy-quickstart
ディレクトリから次のコマンドを実行して、リリースを作成します。
gcloud deploy releases promote --release=test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-policy-pipeline \
--to-target=prod-target \
--override-deploy-policies=quickstart-deploy-policy
--override-deploy-policies=quickstart-deploy-policy
を含めており、roles/clouddeploy.policyAdmin
ロールが付与されているため、Cloud Deploy は作成したデプロイ ポリシーを無視し、prod-target
へのロールアウトを作成します。
Google Cloud コンソールで結果を表示する
Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動して、デリバリー パイプライン(
deploy-policy-pipeline
)を表示します。デリバリー パイプラインの名前(
deploy-policy-pipeline
)をクリックします。可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。この場合、ポリシーがオーバーライドされたため、ロールアウトが作成され、成功しました。
リリースが [デリバリー パイプラインの詳細] の下の [リリース] タブに表示されます。
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
GKE クラスタまたは Cloud Run サービスを削除します。
GKE
gcloud container clusters delete quickstart-cluster-qsprod --region=us-central1 --project=PROJECT_ID
Cloud Run
gcloud run services delete my-deploy-policy-run-service --region=us-central1 --project=PROJECT_ID
デプロイ ポリシーを削除します。
gcloud deploy delete --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
次のように、デリバリー パイプライン、ターゲット、リリース、ロールアウトを削除します。
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
Cloud Deploy によって作成された Cloud Storage バケットを両方とも削除します。
これでクイックスタートの演習はすべて終了です。