Google Cloud Deploy- und Cloud Run-Test

Dieses Dokument enthält eine Testanleitung, in der die Einrichtung einer Bereitstellungspipeline in Google Cloud Deploy beschrieben wird, die Container in Cloud Run bereitstellt. Am Ende dieser Anleitung haben Sie eine CD-Pipeline, die auf Cloud Run mit zwei Umgebungen ausgerichtet ist: dev und prod. Sie können über die Pipelinephasen neue Container-Images bereitstellen und hochstufen und den Prozess in der Google Cloud Console beobachten.

In dieser Anleitung werden mehrere Google Cloud-Dienste verwendet, insbesondere der Config Controller, sowie Pre-GA-Dienste, die sich noch in der Vorschau befinden und noch nicht allgemein verfügbar sind (Cloud Run Admin API Version 2). Mit Config Controller können Sie GCP-Ressourcen mit dem Kubernetes-Ressourcenmodell (KRM) deklarativ bereitstellen. Google Cloud Deploy verwendet Config Config, um Cloud Run-Dienste als Teil der Bereitstellungspipeline zu erstellen und zu verwalten.

Wenn Sie Fragen haben, Programmfehler finden oder uns Feedback geben möchten, kontaktieren Sie uns unter clouddeploy-feedback-external@google.com.

Cloud Shell-Anleitung

Die Anleitungen in diesem Dokument sind auch in einer leicht verständlichen, Cloud Shell-basierten Anleitung enthalten. Weitere Informationen finden Sie in dieser Anleitung.

Umgebung einrichten

  1. Erstellen Sie ein neues Projekt und legen Sie das Standardprojekt für die Google Cloud CLI fest.

    Wir empfehlen, mit einem neuen Projekt zu beginnen.

    gcloud config set project PROJECT_ID
    

    Ersetzen Sie im obigen Befehl PROJECT_ID durch Ihre tatsächliche Projekt-ID. In diesem Dokument enthält Code (Befehle und Dateien) {PROJECT_ID} als Platzhalter. Wenn Sie sie hier ersetzen, werden alle Instanzen in diesem Dokument ausgefüllt, sofern Sie die Seite nicht aktualisieren.

  2. Aktivieren Sie die erforderlichen APIs:

    gcloud services enable \
        krmapihosting.googleapis.com \
        clouddeploy.googleapis.com \
        compute.googleapis.com \
        run.googleapis.com
    

    Mit diesem Befehl werden die folgenden APIs aktiviert, die Sie für diesen Test benötigen:

    • Compute Engine
    • Config Controller
    • Google Cloud Deploy
    • Cloud Build (über Google Cloud Deploy aktiviert)
    • Cloud Storage (über Google Cloud Deploy aktiviert)
    • Resource Manager
    • Cloud Run
    • Google Kubernetes Engine (über Config Controller aktiviert)
  3. Prüfen Sie, ob die Google Cloud CLI installiert und konfiguriert wurde.

    Außerdem müssen Sie kubectl installieren:

    which kubectl || gcloud components install kubectl
    

    Wenn Sie Befehle über Cloud Shell ausführen, sind diese Komponenten bereits für Sie installiert.

  4. Compute Engine-Standarddienstkonto konfigurieren

    Google Cloud Deploy verwendet standardmäßig das Compute Engine-Standarddienstkonto. Das Dienstkonto hat möglicherweise bereits die erforderlichen Berechtigungen. Dieser Schritt ist für Organisationen enthalten, die automatische Rollenzuweisungen für Standarddienstkonten deaktivieren.

    Führen Sie die folgenden Befehle aus, damit das Dienstkonto die erforderlichen Berechtigungen hat:

    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"
    
    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"
    
  5. Übersicht über Google Cloud Deploy

    Diese Übersicht hilft Ihnen, den Dienst und die Konzepte von Google Cloud Deploy zu verstehen.

Config Controller einrichten

Google Cloud Deploy verwendet eine Config Controller-Instanz, um Ihre Cloud Run-Dienste und -Überarbeitungen bereitzustellen.

  1. Prüfen Sie vor dem Erstellen des Config Controllers, ob ein Standardnetzwerk vorhanden ist:

    gcloud compute networks list
    

    Eine erfolgreiche Konsolenausgabe sieht so aus:

    NAME: default
    SUBNET_MODE: AUTO
    BGP_ROUTING_MODE: REGIONAL
    IPV4_RANGE:
    GATEWAY_IPV4:
    

    Wenn Sie kein Standardnetzwerk haben, führen Sie den folgenden Befehl aus:

    gcloud compute networks create default --subnet-mode=auto
    

    Wenn die Ausgabe korrekt war, müssen Sie diesen Befehl nicht ausführen.

    Wenn weitere Probleme auftreten, lesen Sie die Anleitung zur Fehlerbehebung im Config Controller oder wenden Sie sich an den Administrator Ihrer Organisation.

  2. Erstellen Sie Ihre Config Controller-Instanz.

    gcloud anthos config controller create cc-deployrun --location=us-central1
    
  1. Gewähren Sie dem Config Controller Berechtigungen in den Projekten, in denen Sie die Bereitstellung vornehmen möchten. Mit dem folgenden Befehl erhalten Sie die minimalen Berechtigungen, die Config Controller zum Erstellen und Verwalten von Cloud Run-Diensten in Ihrem Projekt benötigt.

    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    
    gcloud projects add-iam-policy-binding "PROJECT_ID" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/run.admin" \
        --project "PROJECT_ID"
    
    gcloud projects add-iam-policy-binding "PROJECT_ID" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/iam.serviceAccountUser" \
        --project "PROJECT_ID"
    

Konfigurationsdateien erstellen

Google Cloud Deploy verwendet Skaffold, um die Details für die Bereitstellung und die korrekte Bereitstellung für Ihre separaten Ziele bereitzustellen. Für diesen Test haben wir zwei Ziele: run-dev und run-prod.

Google Cloud Deploy-Cloud Run-Testziele, run-dev und run-prod

In diesem Abschnitt erstellen Sie eine skaffold.yaml-Datei, die die Cloud Run-Manifeste angibt, die Ihre Anwendung über eine Google Cloud Deploy-Bereitstellungspipeline bereitstellen. Außerdem erstellen Sie die Manifeste für Ihre Cloud Run-Dienste, jeweils eines für jede Zielumgebung (run-dev-service.yaml bzw. run-prod-service.yaml).

  1. Erstellen Sie ein neues Verzeichnis für Ihre Manifeste und rufen Sie dieses Verzeichnis auf:

    mkdir deploy-cloudrun
    cd deploy-cloudrun
    
  2. Erstellen Sie die Datei skaffold.yaml in diesem Verzeichnis.

    skaffold.yaml teilt Google Cloud Deploy mit, welche Manifeste für jedes Ziel in der Pipeline und für einen bestimmten Release bereitgestellt werden sollen.

    apiVersion: skaffold/v2beta26
    kind: Config
    profiles:
     - name: prod
       deploy:
         kubectl:
           manifests:
             - run-prod-*.yaml
     - name: dev
       deploy:
         kubectl:
           manifests:
             - run-dev-*.yaml
    
  3. Erstellen Sie die Datei run-dev-service.yaml im selben Verzeichnis.

    Dieses deklarative Manifest stellt die dev-Umgebungsversion Ihres Cloud Run-Dienstes dar.

    Notieren Sie sich die Einstellungen, die für diese Umgebung angepasst wurden. Sie können beispielsweise die Containerskalierung auf zwei Instanzen beschränken. Labels und ein Name werden zur Unterscheidung dieser Version des Dienstes in Ihrem Projekt verwendet. Der Image-Name ist eine Variable: run-container anstelle eines bestimmten Container-Images. Dieser wird durch ein bestimmtes Container-Image ersetzt, wenn Sie einen Release in Google Cloud Deploy erstellen.

    apiVersion: run.cnrm.cloud.google.com/v1beta1
    kind: RunService
    metadata:
      labels:
        cloud-deploy-target: run-dev
      name: deploytest-dev
      namespace: config-control
    spec:
      ingress: INGRESS_TRAFFIC_ALL
      location: us-central1
      projectRef:
        external: projects/PROJECT_ID
      template:
        containers:
          - env:
              - name: environment
                value: dev
            image: run-container
        scaling:
          maxInstanceCount: 2
      traffic:
        - percent: 100
          type: TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST
    
  4. Erstellen Sie die Datei run-prod-service.yaml im selben Verzeichnis.

    Dieses Manifest stellt die prod-Version Ihres Cloud Run-Dienstes dar. Beachten Sie die aktualisierten Namen, Labels und Skalierungseinstellungen sowie die Wiederverwendung von run-container.

    apiVersion: run.cnrm.cloud.google.com/v1beta1
    kind: RunService
    metadata:
      labels:
        cloud-deploy-target: run-prod
      name: deploytest-prod
      namespace: config-control
    spec:
      ingress: INGRESS_TRAFFIC_ALL
      location: us-central1
      projectRef:
        external: projects/PROJECT_ID
      template:
        containers:
          - env:
              - name: environment
                value: prod
            image: run-container
        scaling:
          maxInstanceCount: 10
      traffic:
        - percent: 100
          type: TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST
    

Lieferpipeline und Ziele erstellen

Sie können Ihre Bereitstellungspipeline und Ziele für Google Cloud Deploy in einer Datei oder in separaten Dateien definieren. Der Einfachheit halber erstellen Sie aus dieser Anleitung eine einzelne Datei.

  1. Erstellen Sie im Verzeichnis mit den kürzlich erstellten Manifesten (/deploy-cloudrun/) die Datei clouddeploy.yaml:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
     name: my-run-app-1
    description: main application pipeline
    serialPipeline:
     stages:
     - targetId: run-dev
       profiles:
       - dev
     - targetId: run-prod
       profiles:
       - prod
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
     name: run-dev
    description: Cloud Run development environment
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/krmapihost-cc-deployrun
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
     name: run-prod
    description: Cloud Run production environment
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/krmapihost-cc-deployrun
    

    cloudeploy.yaml definiert eine Ablaufsequenz zwei Phasen in der Bereitstellungspipeline: run-dev und run-prod. Die Datei definiert auch Ziele für jede dieser beiden Phasen.

    Beachten Sie, dass beide Ziele auf denselben Config Controller verweisen wie ein GKE-Cluster. Dieser Config Controller, der von einem zugrunde liegenden GKE-Cluster unterstützt wird, der beim Erstellen von Config Controller erstellt wird, erstellt die Cloud Run-Dienste für jede Umgebung mit dem entsprechenden Manifest.

    Ihr GKE-Cluster

  2. Registrieren Sie die Bereitstellungspipeline und Ziele bei Google Cloud Deploy:

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

    Die Ausgabe sieht so aus:

    Waiting for the operation on resource projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1.
    Waiting for the operation on resource projects/sample-project/locations/us-central1/targets/run-dev...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/targets/run-dev.
    Waiting for the operation on resource projects/sample-project/locations/us-central1/targets/run-prod...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/targets/run-prod.
    

Release erstellen und Container bereitstellen

Nachdem die Konfigurationsdateien vorbereitet und die Bereitstellungspipeline und -ziele registriert wurden, können wir jetzt die Release-Ressource erstellen, die das bereitzustellende Container-Image darstellt. Wir verwenden einen Beispielcontainer, echoserver, zur Bereitstellung:

gcloud deploy releases create run-release-001 --project=PROJECT_ID --region=us-central1 --delivery-pipeline=my-run-app-1 --labels="use-case=my-cloud-run-experiment" --images=run-container="us-docker.pkg.dev/cloudrun/container/hello"

Die Ausgabe sieht so aus:

Creating temporary tarball archive of 4 file(s) totalling 2.0 KiB before compression.
Uploading tarball of [.] to [gs://sample-project_clouddeploy_us-central1/source/1643560782.447815-aed1fdf4973b4d25b9b7d09ff9fbbaa9.tgz]
Waiting for operation [operation-1643560782826-5d6cf50a08a8d-e40f7a45-ac4aa0ae]...done.
Created Cloud Deploy release run-release-001.
Creating rollout projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-dev-0001 in target run-dev...done.

Da dies der erste Release ist (Bereitstellung im ersten Ziel im Fortschritt), erstellt Google Cloud Deploy automatisch auch eine Rollout-Ressource und stellt die Anwendung im ersten Ziel im Fortschritt (run-dev) bereit. Möglicherweise müssen Sie einige Minuten warten, bis der Roll-out abgeschlossen ist (Rollout-Status: SUCCEEDED). Mit dem folgenden Befehl können Sie den Rollout-Status verfolgen:

gcloud deploy rollouts list --delivery-pipeline=my-run-app-1 --region=us-central1 --release run-release-001

Die Ausgabe sieht so aus:

approvalState: DOES_NOT_NEED_APPROVAL
createTime: '2022-02-10T21:25:11.228171Z'
deployEndTime: '2022-02-10T21:26:37.984888Z'
deployStartTime: '2022-02-10T21:26:09.778897390Z'
deployingBuild: projects/435050644073/locations/us-central1/builds/59f588d1-0cbc-4c46-9574-7e3f3b763ae6
enqueueTime: '2022-02-10T21:26:09.108240Z'
etag: 5f57d54f8b11d20e
name: projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-dev-0001
state: SUCCEEDED
targetId: run-dev
uid: 9cab18e1dfea4054b7d182b707c21f75

Nachdem die Anwendung für das erste Ziel bereitgestellt wurde, können wir prüfen, ob der Cloud Run-Dienst (deploytest-dev) wie erwartet ausgeführt wird:

gcloud run services list --region=us-central1

Die Ausgabe sieht so aus:


SERVICE: deploytest-dev
REGION: us-central1
URL: https://deploytest-dev-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T04:25:13.081829Z

Release hochstufen

Nachdem die Anwendung im ersten Ziel (run-dev) bereitgestellt wurde, können Sie sie mit dem folgenden Befehl hochstufen:

gcloud deploy releases promote --release=run-release-001 --delivery-pipeline=my-run-app-1 --region=us-central1 --project=PROJECT_ID

Die Ausgabe sieht so aus:

Promoting release run-release-001 to target run-prod.

Do you want to continue (Y/n)? Y

Creating rollout projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-prod-0001 in target run-prod...done.

Release über die Google Cloud Console hochstufen

Prüfen Sie anschließend noch einmal, ob der Cloud Run Prod-Dienst ausgeführt wird:

gcloud run services list --region=us-central1

Die Ausgabe sieht so aus:


SERVICE: deploytest-dev
REGION: us-central1
URL: https://deploytest-dev-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T04:25:13.081829Z


SERVICE: deploytest-prod
REGION: us-central1
URL: https://deploytest-prod-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T16:04:43.468907Z

Cloud Run-Dienste

Ergebnisse in der Cloud Deploy-Konsole ansehen

Wenn Sie sich den Release-Fortschritt in der Bereitstellungspipeline ansehen möchten, öffnen Sie die Google Cloud Deploy-Konsole und rufen Sie die Bereitstellungspipeline my-run-app-1 auf.

Releasefortschritt in der Pipelinevisualisierung

Release überprüfen

Sie können die Details des erstellten Release aufrufen, indem Sie in der Detailansicht der Bereitstellungspipeline in der Tabelle mit den Bereitstellungspipelines auf den entsprechenden Namen run-release-001 klicken.

In der Ansicht der Release-Details können Sie Assets wie den angegebenen Parameter (Container) (Build-Artefakte) und die gerenderten Dienstmanifeste weiter prüfen.

Releasedetails

Roll-out prüfen

Jeder Roll-out ist auch auf der Seite „Release“ aufgeführt. Wenn Sie auf einen Roll-out-Namen klicken, werden die Roll-out-Details mit detaillierten Informationen zum Roll-out und den Rendering- und Bereitstellungslogs geöffnet.

Details zur Einführung

Dienst in der Cloud Run Console ansehen

Mit den erstellten Dienstlogs in der Cloud Run-Konsole können Sie prüfen, ob der Dienst korrekt gestartet wurde.

Cloud Run-Dienstlogs

Wettkampfübungen

Sie haben jetzt eine Bereitstellungspipeline für den Cloud Run-Dienst erstellt und einen Container aus einer Entwicklungsumgebung in eine Produktionsumgebung hochgestuft. Im Folgenden finden Sie eine Liste von Challenges, mit denen Sie die Bereitstellungspipelines von Cloud Run in Google Cloud Deploy weiter untersuchen können.

  • Fügen Sie der Bereitstellungspipeline eine Genehmigung für die Produktionsumgebung hinzu.

  • Konvertieren Sie einen Ihrer vorhandenen Cloud Run-Dienste in eine Bereitstellungspipeline von Google Cloud Deploy.

  • Parametrisieren Sie ein Cloud Run-Dienstmanifest für dev und prod mit Kustomize. Weitere Informationen finden Sie in der Schritt-für-Schritt-Anleitung zu Google Cloud Deploy-Profilen.

Bereinigen

Wenn Sie diesen Test abgeschlossen haben, können Sie entweder Ihr Projekt löschen oder die Ressourcen im Projekt entfernen, um zu vermeiden, dass Ihrem Google Cloud-Konto für diese Ressourcen Gebühren in Rechnung gestellt werden.

  1. Löschen Sie die über Config Controller bereitgestellten Cloud Run-Dienste direkt aus dem Cluster.

    Wenn Sie den Namespace aus dem Config Controller-Cluster löschen, werden alle erstellten Cloud Run-Dienste gelöscht.

    kubectl -n config-control delete runservice deploytest-dev
    
    kubectl -n config-control delete runservice deploytest-prod
    
  2. Löschen Sie den Config Controller:

    gcloud anthos config controller delete cc-deployrun  --location=us-central1 --project=PROJECT_ID
    
  3. Löschen Sie die Lieferpipeline:

    gcloud deploy delivery-pipelines delete my-run-app-1 --force --region=us-central1 --project=PROJECT_ID
    

    Dadurch werden die Bereitstellungspipeline selbst sowie alle für diese Pipeline erstellten Release- und Rollout-Ressourcen gelöscht.

  4. Löschen Sie die von Google Cloud Deploy erstellten Cloud Storage-Buckets mithilfe der Cloud Storage Console.

    Storage-Buckets können durch Namenskonventionen wie [PROJECT]_clouddeploy_[region] und [region].deploy-artifacts.[project-id].appspot.com sowie mit dem folgenden Befehl identifiziert werden:

    gsutil ls | egrep "_clouddeploy_|deploy-artifacts.PROJECT_ID.appspot.com" | xargs --max-lines=1 echo gsutil gsutil -m rm -r
    

    Dadurch werden die auszuführenden Befehle ausgegeben, nachdem Sie die Liste der Buckets auf ihre Richtigkeit überprüft haben:

    gsutil rb gs://PROJECT_ID_clouddeploy_us-central1/
    gsutil rb gs://us-central1.deploy-artifacts.PROJECT_ID.appspot.com/