アプリを複数のターゲットに同時にデプロイする

このページでは、Cloud Deploy を使用して、サンプル アプリケーションを 2 つのターゲットに同時にデプロイする方法(並行的なデプロイ)について説明します。

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

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

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

  2. Skaffold 構成および、Kubernetes マニフェストまたは Cloud Run サービス定義のいずれかを作成します。

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

    このパイプラインにはターゲットが 1 つしかありませんが、そのターゲットは、複数のデプロイ ターゲットを表すマルチ ターゲットとなります。このマルチターゲットは、2 つの実際のターゲットで構成され、2 つのクラスタまたはサービスにアプリを提供します。

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

  5. Google Cloud コンソールで「コントローラのロールアウト」と子のロールアウトを表示します。

始める前に

  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. Make sure 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. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    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. 特定のランタイム向けのデベロッパー ロールを追加します。
      • 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
      

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

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

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

gcloud container clusters create-auto quickstart-cluster-qsprod1 \
                 --project=PROJECT_ID \
                 --region=us-central1 \
                 && gcloud container clusters create-auto quickstart-cluster-qsprod2 \
                 --project=PROJECT_ID \
                 --region=us-west1

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

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

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

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

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

    GKE

    mkdir deploy-gke-parallel-quickstart
    cd deploy-gke-parallel-quickstart
    

    Cloud Run

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

    GKE

    apiVersion: skaffold/v4beta1
    kind: Config
    manifests:
      rawYaml:
      - k8s-deployment.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta1
    kind: Config
    manifests:
      rawYaml:
      - service.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 # from-param: ${replicaCount}
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        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-parallel-run-service
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/minScale: 1 # from-param: ${minInstances}
        spec:
          containers:
          - image: my-app-image
    

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

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

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

  1. デリバリー パイプラインとターゲット定義を作成:

    GKE

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

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-parallel-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: qsprod-multi
        profiles: []
        deployParameters:
        - values:
            replicaCount: "1"
          matchTargetLabels:
            label1: label1
        - values:
            replicaCount: "2"
          matchTargetLabels:
            label2: label2
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-multi
    description: production clusters
    multiTarget:
      targetIds: [qsprod-a, qsprod-b]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-a
      labels:
        label1: label1
    description: production cluster 2
    gke:
      cluster: projects/PROJECT_ID/locations/us-central1/clusters/quickstart-cluster-qsprod1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-b
      labels:
        label2: label2
    description: production cluster 3
    gke:
      cluster: projects/PROJECT_ID/locations/us-west1/clusters/quickstart-cluster-qsprod2
    

    Cloud Run

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

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
      name: my-parallel-demo-app-1
    description: main application pipeline
    serialPipeline:
      stages:
      - targetId: qsprod-multi
        profiles: []
        deployParameters:
        - values:
            minInstances: "2"
          matchTargetLabels:
            label1: label1
        - values:
            minInstances: "3"
          matchTargetLabels:
            label2: label2
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-multi
    description: production
    multiTarget:
      targetIds: [qsprod-a, qsprod-b]
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-a
      labels:
        label1: label1
    description: production us-central1
    run:
      location: projects/PROJECT_ID/locations/us-central1
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
      name: qsprod-b
      labels:
        label2: label2
    description: production us-west1
    run:
      location: projects/PROJECT_ID/locations/us-west1
    

    このファイルには、3 つのターゲット(1 つのマルチターゲットと 2 つの子ターゲット)が含まれています。デリバリー パイプラインではなく、別のファイルでターゲットを構成することもできます。

    また、デリバリー パイプラインにはラベルを含む deployParameters が含まれ、子ターゲットにはこれらのパラメータに一致するラベルが含まれることに注意してください。これにより、必要に応じて個別の値を個別の子ターゲットに渡すことができます。詳細

  2. パイプラインとターゲットを Cloud Deploy サービスに登録します。

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

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

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

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

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

    作成したデリバリー パイプラインが表示されます。clouddeploy.yaml ファイルで 3 つのターゲット(1 つのマルチ ターゲットと 2 つの子ターゲット)を構成している場合でも、[ターゲット] 列に 1 つのターゲットが表示されます。

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

    リストにあるターゲットはマルチターゲット qsprod-multi のみです。子ターゲットは表示されません。

リリースを作成する

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

GKE

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

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

Cloud Run

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

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-parallel-demo-app-1 \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4 \
   --to-target=qsprod-multi

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

通常どおり、リリースを作成すると、パイプラインの最初のターゲット(この場合は --to-target= を使用して指定された特定のターゲット)のロールアウトが自動的に作成されます。このクイックスタートでは、このターゲットはマルチターゲットです。そのため、rollout は 2 つの子ターゲットの「コントローラ ロールアウト」であり、デリバリー パイプラインには後続のターゲットはありません。つまり、ロールアウトが作成されるたびにアプリケーションがデプロイされます。

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

リリースの作成が完了し、コントローラのロールアウトと子ロールアウトが作成されたので、それらの子ロールアウトはそれぞれの GKE クラスタまたは Cloud Run サービスにデプロイされ(またはすでにデプロイ処理中)ます。

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

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

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

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

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

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

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

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

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

クリーンアップ

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

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

    GKE

    gcloud container clusters delete quickstart-cluster-qsprod1 --region=us-central1 --project=PROJECT_ID \
    && gcloud container clusters delete quickstart-cluster-qsprod2 --region=us-west1 --project=PROJECT_ID
    

    Cloud Run

    gcloud run services delete my-parallel-run-service --region=us-central1 --project=PROJECT_ID \
    && gcloud run services delete my-parallel-run-service --region=us-west1 --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 ブラウザページを開く

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

次のステップ