アプリケーションをターゲットにカナリア デプロイする

このクイックスタートでは、Cloud Deploy を使用して、カナリア デプロイのサンプル アプリケーション イメージを Google Kubernetes Engine または Cloud Run に提供する方法について説明します。 (GKE Enterprise にカナリア デプロイを実行することもできますが、このクイックスタートでは GKE と Cloud Run のみを説明します)。

カナリア デプロイでは、すでにデプロイされているアプリケーションのバージョンと新しいバージョンの間でトラフィックが分割されます。Cloud Run は、デリバリー パイプラインで構成した割合に基づいてトラフィックを割り当てます。GKE は、新しいバージョンを一部の Pod にデプロイします。このクイックスタートでは、最初に 50% までデプロイし、次に 100% までデプロイします。

このクイックスタートでは、ターゲットprod)は 1 つのみです。そのため、アプリケーションを実行する GKE クラスタまたは Cloud Run サービスを 1 つだけ作成します。

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

  1. GKE クラスタを 1 つ作成する、または Cloud Run サービスを 1 つ定義します。

    GKE Enterprise クラスタにカナリア デプロイすることもできますが、このクイックスタートでは GKE と Cloud Run のみを使用します。

  2. Skaffold 構成と Kubernetes マニフェストを作成して、デプロイする(ビルド済みの)コンテナ イメージを指定します。

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

  4. リリースを作成して、デリバリー パイプラインを呼び出します。リリースは自動的に 1 つのターゲットにデプロイされます。

    この最初のリリースでは、カナリア フェーズをスキップします。

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

  6. 2 番目のリリースを作成します。今回はカナリア ステージを実行してアプリケーションを 50% までデプロイします。

  7. 100% までデプロイするようにリリースを進めます。

始める前に

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. 外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。

  7. gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. 外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。

  13. gcloud CLI を初期化するには、次のコマンドを実行します。

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

    gcloud components update
    

  15. デフォルトの 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. 特定のランタイム向けのデベロッパー ロールを追加します。
      • GKE、および Gateway API を使用した 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"
        

    3. 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
      

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

    GKE

    1 つの GKE Autopilot クラスタを作成します。

     gcloud container clusters create-auto canary-quickstart-cluster \
                      --project=PROJECT_ID \
                      --region=us-central1
    

    GKE と Gateway API

    1. Istio での使用をサポートするための推奨設定を使用して、1 つの GKE クラスタを作成します。

      gcloud container clusters create canary-quickstart-cluster \
             --machine-type=n1-standard-1 \
             --num-nodes 4 \
             --region=us-central1 \
             --project=PROJECT_ID
      
    2. クラスタの認証情報を取得します。

      gcloud container clusters get-credentials canary-quickstart-cluster \
             --project=PROJECT_ID \
             --region=us-central1
      
    3. クラスタにまだ存在しない場合は、Kubernetes Gateway API CRD をインストールします。

      kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
      
    4. Istio をインストールして、Istio の Gateway Controller の実装を有効にします。

      curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \
      && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
      

    Cloud Run

    Cloud Run を使用している場合は、このコマンドをスキップできます。ここでは何もする必要はありません。

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

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

    このクイックスタートでは、デプロイする Kubernetes マニフェストまたは Cloud Run サービス構成を識別する skaffold.yaml ファイルを作成します。

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

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

      GKE

      mkdir deploy-canary-quickstart-gke
      cd deploy-canary-quickstart-gke
      

      GKE と Gateway API

      mkdir deploy-canary-quickstart-gke-gatewayapi
      cd deploy-canary-quickstart-gke-gatewayapi
      

      Cloud Run

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

      GKE

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - kubernetes.yaml
      deploy:
        kubectl: {}
      

      GKE と Gateway API

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - kubernetes.yaml
      deploy:
        kubectl: {}
      

      Cloud Run

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - run.yaml
      deploy:
        cloudrun: {}
      

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

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

    4. アプリケーション マニフェストを作成します。

      GKE

      deploy-canary-quickstart-gke ディレクトリに、次の内容のファイルを kubernetes.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 マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。このマニフェストには、カナリア デプロイに必要な Service リソースと Deployment リソースに加えて、Gateway API の使用に必要な HTTPRoute リソースと Gateway リソースが含まれています。

      デプロイするコンテナ イメージは、プレースホルダ my-app-image としてここに設定されます。このプレースホルダは、リリースを作成するときに特定のイメージに置き換えられます。

      GKE と Gateway API

      deploy-canary-quickstart-gke-gatewayapi ディレクトリに、次の内容のファイルを kubernetes.yaml という名前で作成します。

      kind: Gateway
      apiVersion: gateway.networking.k8s.io/v1beta1
      metadata:
        name: my-gateway
        annotations:
          networking.istio.io/service-type: "ClusterIP"
      spec:
        gatewayClassName: istio
        listeners:
        - name: default
          hostname: "*.example.com"
          port: 80
          protocol: HTTP
          allowedRoutes:
            namespaces:
              from: All
      ---
      kind: HTTPRoute
      apiVersion: gateway.networking.k8s.io/v1beta1
      metadata:
        name: my-httproute
      spec:
        parentRefs:
        - kind: Gateway
          name: my-gateway
        hostnames:
        - "test.example.com"
        rules:
        - backendRefs:
          - name: my-service
            port: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: my-service
      spec:
        selector:
          app: my-app
        ports:
        - name: tcp-port
          protocol: TCP
          port: 80
          targetPort: 8080
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-deployment
        labels:
          app: my-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-app
        template:
          metadata:
            labels:
              app: my-app
          spec:
            containers:
            - name: nginx
              image: my-app-image
      

      このファイルは Kubernetes マニフェストであり、アプリケーションをデプロイするためにクラスタに適用されます。このマニフェストには、カナリア デプロイに必要な Service リソースと Deployment リソースに加えて、Gateway API の使用に必要な HTTPRoute リソースと Gateway リソースが含まれています。

      デプロイするコンテナ イメージは、プレースホルダ my-app-image としてここに設定されます。このプレースホルダは、リリースを作成するときに特定のイメージに置き換えられます。

      Cloud Run

      deploy-canary-quickstart-run ディレクトリに、次の内容のファイルを run.yaml という名前で作成します。

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

      このファイルは基本的な Cloud Run サービス定義であり、Cloud Run でサービスを作成するためにデプロイ時に適用されます。デプロイするコンテナ イメージは、プレースホルダ my-app-image としてここに設定されます。これは、リリースを作成するときに特定のイメージに置き換えられます。

    デリバリー パイプラインとターゲットの作成

    デリバリー パイプラインとターゲットは、1 つのファイルまたは個別のファイルで定義できます。このクイックスタートでは、パイプラインと 1 つのターゲットで、1 つのファイルを作成します。

    GKE

    deploy-canary-quickstart-gke ディレクトリに、次の内容のファイルを clouddeploy.yaml という名前で作成します。

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-canary-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: prod
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              kubernetes:
                serviceNetworking:
                  service: "my-service"
                  deployment: "my-deployment"
            canaryDeployment:
              percentages: [50]
              verify: false
    ---
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod
    description: prod GKE cluster
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
    

    GKE と Gateway API

    deploy-canary-quickstart-gke-gatewayapi ディレクトリに、次の内容のファイルを clouddeploy.yaml という名前で作成します。

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-canary-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: prod
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              kubernetes:
                gatewayServiceMesh:
                  httpRoute: "my-httproute"
                  service: "my-service"
                  deployment: "my-deployment"
            canaryDeployment:
              percentages: [50]
              verify: false
    ---
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod
    description: prod GKE cluster
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster
    

    Cloud Run

    deploy-canary-quickstart-run ディレクトリに、次の内容のファイルを clouddeploy.yaml という名前で作成します。

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-canary-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: prod
        profiles: []
        strategy:
          canary:
            runtimeConfig:
              cloudRun:
                automaticTrafficControl: true
            canaryDeployment:
              percentages: [50]
              verify: false
    ---
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: prod
    description: prod Run Service
    run:
      location: projects/PROJECT_ID/locations/us-central1
    
    1. パイプラインとターゲットを Cloud Deploy サービスに登録します。

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

      これで、カナリア デプロイ戦略用に構成された 1 つのターゲットを含むパイプラインが作成されました。

    2. 次のとおりに、パイプラインとターゲットを確認します。

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

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

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

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

    リリースを作成する

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

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

    GKE

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

    GKE と Gateway API

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

    Cloud Run

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

    --images= フラグに注目してください。このフラグは、マニフェストまたはサービス定義のプレースホルダ(my-app-image)を特定の SHA 修飾イメージに置き換えるために使用します。Google は、この方法でマニフェストをテンプレート化し、リリース作成時に SHA 修飾イメージ名を使用することをおすすめします。

    リリースを作成すると、Cloud Deploy は自動的にロールアウト リソースも作成し、1 つのターゲット prod にすぐにデプロイします。

    安定フェーズにスキップする

    この最初のリリースでは、カナリア フェーズをスキップして 100%(安定したフェーズ)までデプロイします。これは、アプリケーションが以前にデプロイされていないため、ポッドの 50% を計算する方法(GKE の場合)や、サービスに対するトラフィックを分割する方法(Cloud Run の場合)がないためです。Pod(GKE)またはリビジョン(Cloud Run)はまだ存在していません。

    カナリア フェーズをスキップしたので、100% までのトラフィックを受信する、安定フェーズを開始する準備が整いました。その後、別のリリースを作成して、カナリアを実行します。

    実際の状況では、アプリケーションがすでに動作しているカナリア デプロイが実行されるため、このフェーズをスキップすることはまれです。

    Google Cloud コンソールでリリースを表示する

    これで最初のリリースを作成し、ロールアウトが作成されたため、 Google Cloud コンソールでリリースとロールアウトを表示できます。可視化されたパイプラインを表示して、リリースの現在のステータスを確認することもできます。

    1. Google Cloud コンソールで、Cloud Deploy の [デリバリー パイプライン] ページに移動し、my-canary-demo-app-1 デリバリー パイプラインを表示します。

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

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

      可視化されたパイプラインでは、アプリのデプロイ ステータスが表示されます。パイプラインには 1 つのステージしかないため、可視化されたパイプラインにはノードが 1 つだけ表示されます。

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

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

    3. リリース名 test-release-001 をクリックします。

      ロールアウトは [ロールアウト] に表示されます。ロールアウトをクリックすると、デプロイログなどの詳細を表示できます。

       Google Cloud コンソールのロールアウト

      ロールアウト ステータスが「Pending advance」になっており、可視化されたパイプラインに表示されているターゲットに「Advance to stable」へのリンクがあることに注目してください。

    ロールアウト フェーズを進める

    最初のリリースの後、カナリア フェーズはスキップされ、ロールアウトは「安定」フェーズの開始を待機しています。このフェーズにより、アプリケーションが 100% までデプロイされます。

    1. 可視化されたパイプラインで、[Advance to stable] をクリックします。

    2. プロンプトが表示されたら、[Advance] をクリックして確定します。

    数分後、ロールアウトが「安定」フェーズになり、アプリケーションが 100% までデプロイされます。

    安定フェーズのデリバリー パイプライン

    カナリア デプロイを実行する

    最初のリリースでカナリア フェーズをスキップしたため、別のリリースを作成し、今回はカナリア デプロイを実行します。

    1. 新しい release を作成するには、deploy-canary-quickstart-gkedeploy-canary-quickstart-gke-gatewayapideploy-canary-quickstart-run ディレクトリから次のコマンドを実行します。

      GKE

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

      GKE と Gateway API

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

      Cloud Run

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

      数分後、ロールアウトが作成され、今回はカナリア ステージが実行されます。

      カナリア フェーズを開始しているデリバリー パイプライン

      最初のロールアウト フェーズが完了すると、ロールアウトはカナリア フェーズになります。

       Google Cloud コンソールでの可視化されたデリバリー パイプライン(アプリケーションが 50% までデプロイされたことを示している)

      これは、アプリケーションが現在 50% までデプロイされたことを示しています。serviceNetworking ベースの GKE の場合、Pod の半分までデプロイされます。Gateway API ベースの GKE と Cloud Run の場合、トラフィックは 50% まで割り当てられます。

    2. [Advance Rollout] をクリックし、プロンプトが表示されたら [Advance] をクリックします。

      これにより、ロールアウトが「安定」フェーズに進み、アプリケーションが 100% までデプロイされます。

      100% までデプロイされた、安定フェーズのデリバリー パイプライン

    クリーンアップ

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

    1. canary-quickstart-cluster クラスタを削除します(GKE のみ)。

      gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
      
    2. my-canary-run-service サービスを削除します(Cloud Run のみ)。

      gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID
      
    3. デリバリー パイプライン、ターゲット、すべてのリリースとロールアウトのリソースを削除します。

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

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

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

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

    次のステップ