Cloud Deploy でのリリース プロモーションとロールアウト進行の自動化

このページでは、Cloud Deploy を使用して自動的にリリースをターゲットに昇格し、次のフェーズにロールアウトを進める方法について説明します。

このクイックスタートでは、以下の内容を行います。

  1. 2 つの GKE クラスタまたは 2 つの Cloud Run サービスを作成します。

  2. Skaffold 構成を作成し、Kubernetes マニフェストまたは Cloud Run サービス定義を作成します。

  3. Cloud Deploy デリバリー パイプラインとデプロイ ターゲットを定義します。

    このパイプラインは、devstaging の 2 つのターゲットにデプロイされます。また、staging ターゲットはカナリア デプロイ戦略を使用します。

  4. 次の 2 つの自動化ルールを定義します。

    • dev へのロールアウトが成功すると、staging ターゲットにリリースを昇格させる自動化。

    • canary-25 フェーズが正常に完了すると stable フェーズにロールアウトを進める自動化。

  5. リリースを作成してデリバリー パイプラインをインスタンス化します。リリースは自動的に dev ターゲットにデプロイされます。

  6. Google Cloud コンソールでデリバリー パイプラインとリリースを表示します。

    自動プロモーションにより、このリリースは自動的に staging に昇格します。

    staging ターゲットはカナリア デプロイ戦略を使用し、さらにこのランタイムに対する初回のデプロイとなるため、canary-25 フェーズはスキップされます。カナリア フェーズが初回にスキップされる理由について詳しくは、フェーズがスキップされることがある理由をご覧ください。

    フェーズの自動進行により、ロールアウトは stable フェーズに進みます。

準備

  1. 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.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init
  12. CLI がすでにインストールされている場合は、最新バージョンを実行していることを確認してください。

    gcloud components update
    
  13. デフォルトの Compute Engine サービス アカウントに十分な権限があることを確認します。

    このサービス アカウントにはすでに必要な権限が付与されている場合があります。これらの手順は、デフォルトのサービス アカウントの自動的なロール付与を無効にするプロジェクトに含まれています。

    1. 最初に、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"
      
    2. clouddeploy.releaser ロールを追加します。
      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.releaser"
      
    3. 特定のランタイム向けのデベロッパー ロールを追加します。
      • 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"
        
    4. 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
      
    5. actAs 権限を含む iam.serviceAccountUser ロールをご自身に追加してデフォルト サービス アカウントを使用します。
      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=user:YOUR_EMAIL_ADDRESS \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

      この場合、YOUR_EMAIL_ADDRESS は Google Cloud へのアクセスに使用するメールアドレスです。

ランタイム環境を作成する

Cloud Run にデプロイする場合は、以下のコマンドをスキップできます

GKE の場合、デフォルト設定で automation-quickstart-cluster-devautomation-quickstart-cluster-staging の 2 つのクラスタを作成します。クラスタの Kubernetes API エンドポイントは、公共のインターネットからネットワークに到達可能である必要があります。 GKE クラスタには、デフォルトで外部からアクセス可能です。

gcloud container clusters create-auto automation-quickstart-cluster-dev \
                 --project=PROJECT_ID \
                 --region=us-central1 \
                 && gcloud container clusters create-auto automation-quickstart-cluster-staging \
                 --project=PROJECT_ID \
                 --region=us-central1

プロジェクト番号を取得する

デフォルトのサービス アカウントを識別するには、プロジェクト番号が必要です。これは、自動化リソースを構成するために必要です。

  1. 次のコマンドを実行して、プロジェクト番号を取得します。

    gcloud projects describe PROJECT_ID
    
  2. コマンドライン出力からプロジェクト番号をコピーし、こちらに貼り付けます。

    これはコマンドとして実行する必要はありません。こちらに貼り付けると、このクイックスタートの後半にある自動化構成ファイルにサービス アカウントのリファレンスが追加されます。

    PROJECT_NUMBER
    

Skaffold 構成とアプリケーション マニフェストを準備する

Cloud Deploy では、Skaffold を使用して、デプロイする対象と、個々のターゲットに適切にデプロイする方法の詳細を提供します。

このクイックスタートでは、skaffold.yaml ファイルを作成して、サンプルアプリのデプロイに使用する アプリケーション マニフェストを識別します。

  1. ターミナル ウィンドウを開きます。

  2. 新しいディレクトリを作成し、そのディレクトリに移動します。

    GKE

    mkdir deploy-automation-gke-quickstart
    cd deploy-automation-gke-quickstart
    

    Cloud Run

    mkdir deploy-automation-run-quickstart
    cd deploy-automation-run-quickstart
    
  3. 次の内容のファイルを skaffold.yaml という名前で作成します。

    GKE

    apiVersion: skaffold/v4beta7
    kind: Config
    metadata:
      name: gke-automation
    manifests:
      rawYaml:
      - k8s-deployment.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta7
    kind: Config
    metadata:
      name: run-automation
    profiles:
    - name: dev
      manifests:
        rawYaml:
        - run-dev.yaml
    - name: staging
      manifests:
        rawYaml:
        - run-staging.yaml
    deploy:
      cloudrun: {}
    

    このファイルは最小の Skaffold 構成ファイルです。このクイックスタートでは、このファイルを作成します。ただし、Cloud Deploy で作成することで、単純な非本番環境アプリケーション用に作成することもできます。

    このファイルの詳細については skaffold.yaml リファレンスをご覧ください。

  4. Cloud Run サービス定義のペアか、GKE Kubernetes マニフェストでアプリケーションの定義を作成します。

    GKE

    次の内容のファイルを k8s-deployment.yaml という名前で作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      namespace: default
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
    

    このファイルは、単純な Kubernetes マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。

    Cloud Run

    1. 次の内容のファイルを run-dev.yaml という名前で作成します。

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: my-automation-run-service-dev
      spec:
        template:
          spec:
            containers:
            - image: my-app-image
      
    2. 次の内容のファイルを run-staging.yaml という名前で作成します。

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: my-automation-run-service-staging
      spec:
        template:
          spec:
            containers:
            - image: my-app-image
      

    このファイルは単純な Cloud Run サービス定義であり、デプロイ時に Cloud Run サービスを作成するために使用されます。

デリバリー パイプライン、ターゲット、自動化を作成する

デリバリー パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。個別のファイルで自動化アクションを定義することもできます。このクイックスタートでは、パイプライン、ターゲット、自動化に 1 つのファイルを使用します。

  1. デリバリー パイプライン、ターゲット定義、自動化のアクションを作成します。

    GKE

    deploy-automation-gke-quickstart ディレクトリに、次の内容を含む新しい clouddeploy.yaml ファイルを作成します。

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-automation-demo-app-1
    description: Automation demonstration pipeline
    serialPipeline:
      stages:
      - targetId: automation-quickstart-dev
      - targetId: automation-quickstart-staging
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              kubernetes:
                serviceNetworking:
                  service: "my-service"
                  deployment: "my-deployment"
            canaryDeployment:
              percentages: [25]
              verify: false
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-dev
    description: Dev cluster to demonstrate deploy automation
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-staging
    description: Staging cluster to demonstrate deploy automation
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/promote
    description: promotes a release
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
    - targets:
        id: automation-quickstart-dev
    rules:
    - promoteReleaseRule:
        name: "promote-release"
        wait: 1m
        toTargetId: "@next"
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/advance
    description: advances a rollout
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
    - targets:
        id: automation-quickstart-staging
    rules:
    - advanceRolloutRule:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    

    Cloud Run

    deploy-automation-run-quickstart ディレクトリに、次の内容を含む新しい clouddeploy.yaml ファイルを作成します。

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-automation-demo-app-1
    description: Automation demonstration pipeline
    serialPipeline:
      stages:
      - targetId: automation-quickstart-dev
        profiles: [dev]
      - targetId: automation-quickstart-staging
        profiles: [staging]
        strategy:
          canary:
            runtimeConfig:
              cloudRun:
                automaticTrafficControl: true
            canaryDeployment:
              percentages: [25]
              verify: false
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-dev
    description: Dev cluster to demonstrate deploy automation
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: automation-quickstart-staging
    description: Staging cluster to demonstrate deploy automation
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/promote
    description: Promotes a release to the next target
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
    - targets:
        id: automation-quickstart-dev
    rules:
    - promoteReleaseRule:
        name: "promote-release"
        wait: 1m
        toTargetId: "@next"
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Automation
    metadata:
      name: my-automation-demo-app-1/advance
    description: advances a rollout
    suspended: false
    serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
    selector:
    - targets:
        id: automation-quickstart-staging
    rules:
    - advanceRolloutRule:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    
  2. パイプラインとターゲットを Cloud Deploy サービスに登録します。

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    これで、2 つの GKE ターゲットまたは Cloud Run ターゲットから成るマルチターゲットを有するパイプラインが作成されました。これで、アプリケーションをデプロイする準備が整いました。

  3. パイプラインとターゲットを確認します。

    Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、使用可能なデリバリー パイプラインのリストを表示します。

    [デリバリー パイプライン] ページを開く

    作成したデリバリー パイプラインが表示され、2 つのターゲットが [ターゲット] 列に表示されます。

    Google Cloud コンソールでのデリバリー パイプラインの可視化

  4. パイプライン名をクリックして、デリバリー パイプラインの可視化と詳細を開きます。

  5. [デリバリー パイプラインの詳細] で [自動化] タブを選択します。

    作成した 2 つの自動化が表示されます。

    Google Cloud コンソールでのデリバリー パイプラインの可視化

リリースを作成する

リリースは Cloud Deploy リソースの中心で、デプロイの変更を表します。デリバリー パイプラインは、そのリリースのライフサイクルを定義します。このライフサイクルの詳細については、Cloud Deploy のサービス アーキテクチャをご覧ください。

GKE

deploy-automation-gke-quickstart ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release リソースを作成します。

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-automation-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

Cloud Run

deploy-automation-run-quickstart ディレクトリから次のコマンドを実行して、デプロイするコンテナ イメージを表す release リソースを作成します。

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-automation-demo-app-1 \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:6063adf8f687702b4065151acddba6781c47bc602167eb9f3bec8aebc9ce95cc

デフォルトでは、リリースを作成すると、パイプラインの最初のターゲットに対してロールアウトが自動作成されます。

このクイックスタートには 2 つの自動化が含まれているため、次の 2 つの処理が自動的に行われます。

  • 最初のターゲットでデプロイが成功すると、リリースは 2 番目のターゲットに自動的に昇格します。

    昇格の自動化には 1 分間の待機時間があります。

  • 25% のカナリアが構成されている 2 番目のターゲットでは、2 番目の自動化によって canary-25 から stable へのロールアウトが進められます。

    この最初のリリースでは、カナリア対応の既存バージョンのアプリが存在しないため、canary-25 フェーズはスキップされます。これにより、ロールアウトが自動的に stable に進みます。

    自動化の進行には 1 分の遅延があります。

すべてが完了すると、一切の操作を必要とせずにアプリケーションは両方のターゲットに正常にデプロイされます。

カナリア デプロイ戦略の実行に関する詳細は、カナリアのクイックスタートをお試しください。

Google Cloud コンソールで結果を表示する

自動化の実行などの結果は Google Cloud コンソールで確認できます。

  1. Cloud Deploy の [デリバリー パイプライン] ページに移動して、デリバリー パイプラインを表示します。

    [デリバリー パイプライン] ページを開く

  2. デリバリー パイプラインの名前 [my-automation-demo-app-1] をクリックします。

    可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。十分な時間が経過している場合は、両方のターゲットが緑色で表示されます。

    Google Cloud コンソールでのデリバリー パイプラインの可視化

    リリースが [デリバリー パイプラインの詳細] の下の [リリース] タブに表示されます。

  3. [自動化の実行] タブをクリックします。

    作成した 2 つの自動化に 1 つずつ、2 つのエントリが存在します。いずれかをクリックすると、その自動化実行の詳細が表示されます。

    Google Cloud コンソールに表示される自動化実行の詳細

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. GKE クラスタまたは Cloud Run サービスを削除します。

    GKE

    gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \
    && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_ID
    

    Cloud Run

    gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \
    && gcloud run services delete my-automation-run-service-staging --region=us-central1 --project=PROJECT_ID
    
  2. デリバリー パイプライン、ターゲット、自動化、リリース、ロールアウトを削除します。

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  3. Cloud Deploy によって作成された Cloud Storage バケットを削除します。

    1 つは _clouddeploy で終わり、もう 1 つは [region].deploy-artifacts.[project].appspot.com で終わります。

    Cloud Storage ブラウザページを開く

これでクイックスタートの演習はすべて終了です。

次のステップ