Deployment di un'applicazione Cloud Run con Cloud Deploy

1. Panoramica

In questo lab eseguirai il deployment di un'applicazione .Net in Cloud Run utilizzando Cloud Deploy. Creerai un'immagine container con Cloud Build senza utilizzare Dockerfile. Configurerai una pipeline con tre ambienti di destinazione con Cloud Deploy e seguirai i passaggi per promuovere il rilascio attraverso gli ambienti. Infine, approverai il deployment della release nell'ambiente di produzione.

916a54f51af5ee54.png

Che cos'è Cloud Build?

Con Cloud Build puoi creare software rapidamente in tutti i linguaggi di programmazione.

Che cos'è Cloud Deploy?

Cloud Deploy è un servizio di distribuzione continua completamente gestito. Con Cloud Deploy puoi creare pipeline di deployment per GKE, Anthos e Cloud Run.

Che cos'è Cloud Run?

Con Cloud Run puoi eseguire il deployment di applicazioni containerizzate scalabili scritte in qualsiasi linguaggio (tra cui Go, Python, Java, Node.js, .NET e Ruby) su una piattaforma completamente gestita.

Che cos'è Skaffold?

Skaffold è uno strumento a riga di comando che consente lo sviluppo continuo per le applicazioni native di Kubernetes. Cloud Deploy utilizza Skaffold per le operazioni di rendering e deployment.

Cosa imparerai a fare

In questo lab imparerai a:

  • Crea pipeline Cloud Deploy
  • Crea l'immagine container per l'applicazione .Net con Cloud Build senza utilizzare Dockerfile
  • Esegui il deployment dell'applicazione in Cloud Run con Cloud Deploy
  • Promuovi le release di Cloud Deploy

Prerequisiti

  • Questo lab presuppone la conoscenza della console Cloud e degli ambienti shell.

2. Configurazione e requisiti

Configurazione del progetto Cloud

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarla in qualsiasi momento.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca; di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, puoi generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. Eseguire questo codelab non dovrebbe costare molto. Per arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial, puoi eliminare le risorse che hai creato o eliminare l'intero progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Configurazione dell'ambiente

Attiva Cloud Shell facendo clic sull'icona a destra della barra di ricerca.

eb0157a992f16fa3.png

Da Cloud Shell, esegui questo comando per impostare le variabili di ambiente del progetto:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
export REGION=us-central1

Abilita le API:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  clouddeploy.googleapis.com \
  artifactregistry.googleapis.com

Crea il repository Artifact Registry per archiviare le immagini container delle applicazioni:

gcloud artifacts repositories create containers-repo \
  --repository-format=docker \
  --location=${REGION} \
  --description="Containers repository"

3. Rivedi i file di configurazione

29c2533441779de0.png

Clona il codice sorgente dell'applicazione:

git clone https://github.com/gitrey/deploy-cloudrun-app-with-clouddeploy.git
cd deploy-cloudrun-app-with-clouddeploy

Rivedi la configurazione della pipeline di Cloud Deploy:

clouddeploy.yaml

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: cloud-run-pipeline
description: application deployment pipeline
serialPipeline:
 stages:
 - targetId: dev-env
   profiles: [dev]
 - targetId: qa-env
   profiles: [qa]
 - targetId: prod-env
   profiles: [prod]
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev-env
description: Cloud Run development service
run:
 location: projects/_PROJECT_ID/locations/us-west1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: qa-env
description: Cloud Run QA service
run:
 location: projects/_PROJECT_ID/locations/us-central1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: prod-env
description: Cloud Run PROD service
run:
 location: projects/_PROJECT_ID/locations/us-south1

Esamina il file skaffold.yaml che definisce tre ambienti e utilizza Cloud Run come servizio di destinazione.

skaffold.yaml

apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-app
profiles:
- name: dev
  manifests:
    rawYaml:
    - deploy-dev.yaml
- name: qa
  manifests:
    rawYaml:
    - deploy-qa.yaml
- name: prod
  manifests:
    rawYaml:
    - deploy-prod.yaml
deploy:
  cloudrun: {}

Esamina i file di configurazione del servizio.

deploy-dev.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi

deploy-qa.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app

deploy-prod.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: app-prod
spec:
  template:
    spec:
      containers:
      - image: app

Esamina il file cloudbuild.yaml con i passaggi per creare un'immagine container e la release Cloud Deploy:

cloudbuild.yaml

steps:
- name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: 'pack'
  args: ['build',
         '--builder=gcr.io/buildpacks/builder',
         '--publish', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID']
  id: Build and package .net app
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  args: 
      [
        "deploy", "releases", "create", "release-$_RELEASE_TIMESTAMP",
        "--delivery-pipeline", "cloud-run-pipeline",
        "--region", "${_REGION}",
        "--images", "app=${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID"
      ]
  entrypoint: gcloud

4. Crea pipeline Cloud Deploy

Sostituisci il valore di _PROJECT_ID in clouddeploy.yaml:

sed -i "s/_PROJECT_ID/$PROJECT_ID/g" clouddeploy.yaml

Crea una pipeline di Cloud Deploy:

gcloud deploy apply \
  --file=clouddeploy.yaml \
  --region=${REGION} \
  --project=${PROJECT_ID}

Esamina la pipeline creata in Cloud Deploy.

5. Crea l'immagine container e crea una release

Aggiungi le autorizzazioni dell'operatore Cloud Deploy all'account di servizio Cloud Build:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/clouddeploy.operator

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

Crea l'immagine container e la release Cloud Deploy:

export RELEASE_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud builds submit \
  --config cloudbuild-plus.yaml \
  --substitutions=_REGION=${REGION},_RELEASE_TIMESTAMP=${RELEASE_TIMESTAMP}

Esamina la release creata in Cloud Deploy. Attendi il completamento del deployment nell'ambiente di sviluppo.

6. Promuovi il rilascio negli ambienti QA e PROD

Utilizzando la console Cloud o Cloud Shell, promuovi la release al target successivo(qa-env).

Promuovi la release con Cloud Shell ed esegui il comando gcloud per promuoverla.

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Attendi il completamento del deployment nell'ambiente di QA. Promuovi la release al target successivo(prod-env).

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Apri Cloud Deploy nella console Cloud e approva la release per il deployment in produzione.

4c838b60770e9691.png

Esamina lo stato della pipeline di Cloud Deploy e le metriche DORA disponibili ("conteggio dei deployment", "frequenza di deployment", "tasso di errore del deployment").

Metrica

Descrizione

Numero di deployment

Il numero totale di deployment riusciti e non riusciti nella destinazione finale della pipeline di distribuzione.

Frequenza di deployment

La frequenza con cui la pipeline di distribuzione viene distribuita nel target finale della pipeline di distribuzione.Una delle quattro metriche chiave definite dal programma DORA (DevOps Research and Assessment).

Percentuale di errori di deployment

La percentuale di implementazioni non riuscite nel target finale della pipeline di distribuzione.

Esamina le applicazioni di cui è stato eseguito il deployment in Cloud Run:

d6372b5350f10875.png

7. Complimenti!

Complimenti, hai completato il codelab.

Argomenti trattati:

  • Creare una pipeline di Cloud Deploy
  • Come creare un'immagine container per un'applicazione .Net con Cloud Build
  • Eseguire il deployment dell'applicazione in Cloud Run con Cloud Deploy
  • Come promuovere la release di Cloud Deploy

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è quello di eliminare il progetto che hai creato per il tutorial.

8. Passaggi successivi