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. Configura una pipeline con tre ambienti di destinazione con Cloud Deploy ed esegui i passaggi per promuovere la release negli ambienti. Infine, dovrai approvare la release da eseguire 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 la pipeline Cloud Deploy
  • Creare un'immagine container per l'applicazione .NET con Cloud Build senza utilizzare Dockerfile
  • Esegui il deployment dell'applicazione in Cloud Run con Cloud Deploy
  • Promuovere le release di Cloud Deploy

Prerequisiti

  • Questo lab presuppone familiarità con la console Cloud e gli 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 del progetto è il nome visualizzato per i partecipanti al progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarlo in qualsiasi momento.
  • L'ID progetto è univoco per tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca; in genere non è importante quale sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti piace, puoi generarne un altro casuale. In alternativa, puoi provare il tuo e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà invariato per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un Numero 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 le API/risorse Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non del tutto. Per arrestare le risorse in modo da non generare costi oltre questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono partecipare 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 il seguente 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 un repository Artifact Registry per archiviare le immagini container dell'applicazione:

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

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

Esamina la configurazione della pipeline 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 una 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 la pipeline Cloud Deploy

Sostituisci il valore _PROJECT_ID in clouddeploy.yaml:

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

Crea la pipeline Cloud Deploy:

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

Esamina la pipeline creata in Cloud Deploy.

5. Crea l'immagine del contenitore e una release

Aggiungi le autorizzazioni di 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}

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

6. Promuovere la release negli ambienti QA e PROD

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

Promuovi la release con Cloud Shell, esegui il comando gcloud per promuovere la release.

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

Attendi il completamento del deployment nell'ambiente 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 in Cloud Console e approva la release per il deployment in produzione.

4c838b60770e9691.png

Controlla lo stato della pipeline Cloud Deploy e le metriche DORA disponibili ("deployment count", "deployment frequency", "deployment failure rate").

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 esegue il deployment nella destinazione finale della tua 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 nella destinazione 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:

  • Come creare la pipeline di Cloud Deploy
  • Come creare un'immagine container per l'applicazione .NET con Cloud Build
  • Come 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 è eliminare il progetto che hai creato per il tutorial.

8. Passaggi successivi