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
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.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)
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.
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"
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.
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.
Crea la tua istanza di Config Controller.
gcloud anthos config controller create cc-deployrun --location=us-central1
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
.
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).
Crea una nuova directory per i tuoi manifest e vai al suo interno:
mkdir deploy-cloudrun cd deploy-cloudrun
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
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
Crea il file
run-prod-service.yaml
in questa stessa directoryQuesto manifest rappresenta la versione
prod
del tuo servizio Cloud Run. Osserva il nome, le etichette e le impostazioni di scalabilità aggiornati, quindi riutilizza ancherun-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.
Nella directory con i manifest creati di recente (
/deploy-cloudrun/
), crea il fileclouddeploy.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
erun-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.
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.
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
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
.
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.
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.
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.
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
eprod
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.
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
Elimina Config Controller:
gcloud anthos config controller delete cc-deployrun --location=us-central1 --project=PROJECT_ID
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.
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/