Esperimento Google Cloud Deploy e Cloud Run

Questo documento è un tutorial di prova che ti consente di iniziare a utilizzare una pipeline di distribuzione in Google Cloud Deploy che esegue il deployment dei container in Cloud Run. Alla fine di questo tutorial, avrai una pipeline di CD destinata a Cloud Run con due ambienti: dev e prod. Puoi eseguire il deployment e promuovere nuove immagini container tramite le fasi della pipeline e guardare il processo su Google Cloud Console.

Questo tutorial si basa su diversi servizi Google Cloud, in particolare Config Controller e include servizi pre-GA che sono ancora in anteprima e non sono disponibili pubblicamente (API Cloud Run Admin v2). Config Controller consente di eseguire il provisioning dichiarativo delle risorse GCP utilizzando il modello di risorse Kubernetes (KRM). Google Cloud Deploy utilizza Config Controller per creare e gestire i servizi Cloud Run come parte della sua pipeline di distribuzione.

Se hai domande, trovi bug o vuoi condividere feedback, contattaci all'indirizzo clouddeploy-feedback-external@google.com.

Tutorial di Cloud Shell

Le istruzioni contenute in questo documento sono incluse anche in un tutorial facile da seguire, basato su Cloud Shell. Puoi seguire questo tutorial mentre utilizzi questo documento per ottenere indicazioni e contesto.

Configura l'ambiente

  1. Crea un nuovo progetto e imposta il progetto predefinito per Google Cloud CLI.

    Ti consigliamo di iniziare con un nuovo progetto.

    gcloud config set project PROJECT_ID
    

    Nel comando riportato sopra, sostituisci PROJECT_ID con il tuo ID progetto effettivo. In tutto il documento, il codice (comandi e file) contiene {PROJECT_ID} come segnaposto. La sua sostituzione qui viene completata in tutte le istanze di questo documento, a meno che non aggiorni la pagina.

  2. Abilita le API richieste:

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

    Questo comando abilita le API seguenti, che devi completare per completare questo esperimento:

    • Compute Engine
    • Config Controller
    • Google Cloud Deploy
    • Cloud Build (abilitato tramite Google Cloud Deploy)
    • Cloud Storage (abilitato tramite Google Cloud Deploy)
    • Resource Manager
    • Cloud Run
    • Google Kubernetes Engine (abilitato tramite Config Controller)
  3. Assicurati di aver installato e configurato Google Cloud CLI.

    Inoltre, dovrai assicurarti che kubectl sia installato:

    which kubectl || gcloud components install kubectl
    

    Se esegui comandi da Cloud Shell, questi componenti sono già installati per te.

  4. Configura l'account di servizio predefinito di Compute Engine

    Per impostazione predefinita, Google Cloud Deploy utilizza l'account di servizio predefinito di Compute Engine. L'account di servizio potrebbe già disporre delle autorizzazioni necessarie. Questo passaggio è incluso per le organizzazioni che disattivano la concessione automatica dei ruoli per gli account di servizio predefiniti.

    Esegui questi comandi per assicurarti che l'account di servizio disponga delle autorizzazioni appropriate:

    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. Consulta la panoramica di Google Cloud Deploy.

    Questa panoramica ti aiuterà a comprendere il servizio e i concetti di Google Cloud Deploy.

Configurazione di Config Controller

Google Cloud Deploy utilizza un'istanza di Config Controller per il deployment dei servizi e delle revisioni Cloud Run.

  1. Prima di creare il controller di configurazione, assicurati che sia presente una rete predefinita:

    gcloud compute networks list
    

    L'output della console riuscito avrà il seguente aspetto:

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

    Se non hai una rete predefinita, esegui il seguente comando:

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

    Se l'output era corretto, non è necessario eseguire questo comando.

    Se riscontri altri problemi, consulta la guida alla risoluzione dei problemi di Config Controller o contatta l'amministratore della tua organizzazione.

  2. Crea la tua istanza di Config Controller.

    gcloud anthos config controller create cc-deployrun --location=us-central1
    
  1. Concedi le autorizzazioni di Config Controller all'interno dei progetti in cui vuoi eseguire il deployment. Il comando seguente fornisce le autorizzazioni minime necessarie per configurare e gestire i servizi Cloud Run nel tuo progetto.

    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"
    

Creare i file di configurazione

Google Cloud Deploy utilizza Skaffold per fornire i dettagli su cosa eseguire il deployment e su come eseguirne il deployment correttamente per i tuoi target separati. Per questo esperimento, abbiamo due target: run-dev e run-prod.

Target dell'esperimento Cloud Run, deployment e sviluppo di Google Cloud Deploy

In questa sezione creerai un file skaffold.yaml, che identifica i manifest di Cloud Run di cui verrà eseguito il deployment della tua applicazione tramite una pipeline di distribuzione di Google Cloud Deploy. Creerai anche i manifest per i tuoi servizi Cloud Run, uno per ciascun ambiente di destinazione (run-dev-service.yaml e run-prod-service.yaml, rispettivamente).

  1. Crea una nuova directory per i tuoi manifest e vai al suo interno:

    mkdir deploy-cloudrun
    cd deploy-cloudrun
    
  2. Crea il file skaffold.yaml in questa directory.

    skaffold.yaml indica a Google Cloud Deploy quali manifest devono essere sottoposti a deployment per ogni destinazione della pipeline, per una determinata release.

    apiVersion: skaffold/v2beta26
    kind: Config
    profiles:
     - name: prod
       deploy:
         kubectl:
           manifests:
             - run-prod-*.yaml
     - name: dev
       deploy:
         kubectl:
           manifests:
             - run-dev-*.yaml
    
  3. Crea il file run-dev-service.yaml in questa stessa directory.

    Questo manifest dichiarativo rappresenta la versione dell'ambiente dev del tuo servizio Cloud Run.

    Osserva le impostazioni personalizzate per questo ambiente, ad esempio limitando la scalabilità dei container a due istanze. Le etichette e il nome vengono utilizzati per distinguere questa versione del servizio nel tuo progetto. Tieni presente che il nome dell'immagine è una variabile run-container anziché un'immagine container specifica. che viene sostituito con un'immagine container specifica quando crei una release in Google Cloud Deploy.

    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. Crea il file run-prod-service.yaml in questa stessa directory

    Questo manifest rappresenta la versione prod del tuo servizio Cloud Run. Osserva il nome, le etichette e le impostazioni di scalabilità aggiornati, quindi riutilizza anche 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
    

Crea pipeline di distribuzione e target

Puoi definire la pipeline di distribuzione e le destinazioni di Google Cloud Deploy in un file o in file separati. In questo tutorial, per semplicità, creerai un singolo file.

  1. Nella directory con i manifest creati di recente (/deploy-cloudrun/), crea il file 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 definisce una sequenza di avanzamento di due fasi nella pipeline di distribuzione: run-dev e run-prod. Il file definisce anche le destinazioni in ciascuna di queste due fasi.

    Tieni presente che entrambi i target puntano allo stesso Config Controller di un cluster GKE. Questo controller di configurazione, supportato da un cluster GKE sottostante creato al momento della creazione di Config Controller, crea i servizi Cloud Run per ogni ambiente utilizzando il rispettivo manifest.

    Il tuo cluster GKE

  2. Registra la pipeline di distribuzione e i target con Google Cloud Deploy:

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

    L'output avrà il seguente aspetto:

    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.
    

Crea una release ed esegui il deployment del container

Con i file di configurazione preparati e la pipeline di distribuzione e le destinazioni registrati, ora possiamo creare la risorsa release che rappresenta l'immagine container di cui eseguire il deployment. Utilizzeremo un container di esempio di cui eseguire il deployment, echoserver:

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"

L'output avrà il seguente aspetto:

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.

Poiché questa è la prima release (di cui viene eseguito il deployment nel primo target di avanzamento), anche Google Cloud Deploy crea una risorsa rollout ed esegue il deployment dell'app nel primo target di avanzamento: run-dev. Potresti dover attendere alcuni minuti fino al completamento dell'implementazione (stato di implementazione: SUCCEEDED). Puoi seguire lo stato dell'implementazione utilizzando il seguente comando:

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

L'output avrà il seguente aspetto:

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

Ora che è stato eseguito il deployment dell'app nel primo target, possiamo verificare che il servizio Cloud Run (deploytest-dev) sia in esecuzione come previsto:

gcloud run services list --region=us-central1

L'output avrà il seguente aspetto:


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

Promuovi la release

Ora che hai eseguito il deployment dell'applicazione nel primo target, run-dev, promuovila utilizzando il seguente comando:

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

L'output avrà il seguente aspetto:

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.

Promozione della release da Google Cloud Console

Al termine, verifica nuovamente che il servizio di produzione Cloud Run sia in esecuzione:

gcloud run services list --region=us-central1

L'output avrà il seguente aspetto:


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

Servizi Cloud Run

Visualizza i risultati nella console Cloud Deploy

Per visualizzare l'avanzamento della release tramite la pipeline di distribuzione, apri la console di Google Cloud Deploy e vai alla pipeline di distribuzione di my-run-app-1.

Progressi di release nella visualizzazione delle pipeline

Rivedi la release

Puoi visualizzare i dettagli della release creata facendo clic sul nome correlato run-release-001 nella tabella Release nella visualizzazione dei dettagli della pipeline di distribuzione.

Nella visualizzazione dei dettagli della release, puoi controllare ulteriormente gli asset, ad esempio il parametro immagini (container) specificato (artefatti build) e i manifest di servizio visualizzati.

Dettagli della release

Rivedere l'implementazione

Ogni implementazione è elencata anche nella pagina Release. Fai clic sul nome di un'implementazione per aprire i dettagli dell'implementazione, che contengono informazioni dettagliate sull'implementazione e sui log di rendering e deployment.

Dettagli implementazione

Visualizza il servizio nella console Cloud Run

Puoi controllare che il servizio sia stato avviato correttamente utilizzando i log di servizio creati nella console di Cloud Run.

Log di servizio Cloud Run

Allenamenti con sfide

A questo punto hai creato correttamente una pipeline di distribuzione dei servizi Cloud Run, promuovendo un container da un ambiente di sviluppo a un ambiente di produzione. Di seguito è riportato un elenco di esercizi di verifica che puoi eseguire per esplorare ulteriormente le pipeline di distribuzione di Cloud Run in Google Cloud Deploy.

  • Aggiungi un'approvazione alla pipeline di distribuzione per l'ambiente di servizio in produzione.

  • Converti uno dei tuoi servizi Cloud Run esistenti per utilizzare una pipeline di distribuzione di Google Cloud Deploy.

  • Parametrizzare un manifest del servizio Cloud Run per dev e prod utilizzando Kustomize. Consulta anche il tutorial sulla procedura dettagliata dei profili Skaffold di Google Cloud Deploy.

Esegui la pulizia

Al termine dell'esperimento, puoi eliminare il progetto o rimuovere le risorse al suo interno per evitare che al tuo account Google Cloud vengano addebitati costi relativi a queste risorse.

  1. Elimina direttamente dal cluster i servizi Cloud Run di cui è stato eseguito il deployment tramite Config Controller.

    L'eliminazione dello spazio dei nomi dal cluster Config Controller garantisce l'eliminazione di tutti i servizi Cloud Run creati.

    kubectl -n config-control delete runservice deploytest-dev
    
    kubectl -n config-control delete runservice deploytest-prod
    
  2. Elimina Config Controller:

    gcloud anthos config controller delete cc-deployrun  --location=us-central1 --project=PROJECT_ID
    
  3. Elimina la pipeline di distribuzione:

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

    Questa operazione elimina la pipeline di distribuzione stessa, oltre a tutte le risorse di rilascio e lancio create da Google Cloud Deploy per la pipeline in questione.

  4. Elimina i bucket Cloud Storage creati da Google Cloud Deploy, utilizzando Cloud Storage Console.

    I bucket di archiviazione possono essere identificati dalle convenzioni di denominazione come [PROJECT]_clouddeploy_[region] e [region].deploy-artifacts.[project-id].appspot.com, con il seguente comando:

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

    I comandi da eseguire vengono stampati dopo aver esaminato la correttezza dell'elenco dei bucket:

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