Deployment canary su GKE e GKE Enterprise utilizzando il networking basato sui servizi

Questo documento descrive come configurare e utilizzare i deployment canary per eseguire il deployment delle applicazioni in GKE o GKE Enterprise utilizzando Cloud Deploy con il networking basato sui servizi.

Un deployment canary è un'implementazione progressiva di una nuova versione dell'applicazione, in cui aumenti gradualmente la percentuale di traffico inviato alla nuova versione, monitorando al contempo le prestazioni dell'applicazione. In questo modo, puoi rilevare potenziali problemi in anticipo e ridurre al minimo l'impatto sugli utenti.

Come funzionano i deployment canary per GKE e GKE Enterprise con il networking basato sui servizi

  1. Fornisci il nome della risorsa di deployment e della risorsa di servizio.

  2. Cloud Deploy crea una risorsa di deployment aggiuntiva, con il nome del deployment attuale più -canary.

Anche i secret e i ConfigMap vengono copiati e rinominati con -canary.

  1. Cloud Deploy modifica il servizio per regolare il selettore in modo da selezionare i pod nel deployment corrente e i pod canary.

    Cloud Deploy calcola il numero di pod da utilizzare per la canary in base al calcolo descritto nella sezione Provisioning dei pod. Il calcolo varia a seconda che tu attivi o disattivi l'overprovisioning dei pod.

    Se passiamo alla fase stable Cloud Deploy aggiunge le etichette da utilizzare per la corrispondenza dei pod, in modo che siano disponibili per le esecuzioni canary successive.

    Cloud Deploy crea un deployment che include la percentuale di pod specifica per la fase, aggiornandola per ogni fase. A questo scopo, viene calcolato il numero di pod come percentuale del numero originale di pod. Ciò può comportare una suddivisione del traffico non esatta. Se hai bisogno di una suddivisione esatta del traffico, puoi ottenerla utilizzando l'API Gateway.

  2. Durante la fase stable, il deployment -canary viene ridotto a zero e il deployment originale viene sostituito con il nuovo deployment.

    Cloud Deploy non modifica il deployment originale fino alla fase stable, a meno che tu non disattivi l'overprovisioning.

Cloud Deploy esegue il provisioning dei pod per raggiungere la percentuale canary richiesta nel modo più preciso possibile. Questo valore si basa sul numero di pod, non sul traffico verso i pod. Se vuoi che il canary si basi sul traffico, devi utilizzare l'API Gateway.

Per il canary basato sulla rete GKE, puoi abilitare o disabilitare il provisioning eccessivo dei pod. Le sezioni seguenti descrivono come Cloud Deploy calcola il numero di pod da eseguire il provisioning per il deployment canary per ogni fase canary.

Provisioning dei pod con overprovisioning abilitato

L'attivazione dell'overprovisioning (disablePodOverprovisioning: false) consente a Cloud Deploy di creare pod aggiuntivi sufficienti per eseguire la percentuale di canary desiderata, in base al numero di pod che eseguono il deployment esistente. La seguente formula mostra come Cloud Deploy calcola il numero di pod da eseguire il provisioning per la distribuzione canary per ogni fase canary, quando è attivato il provisioning eccessivo dei pod:

math.Ceil( percentage * ReplicaCountOfDeploymentOnCluster / (100-percentage))

Con questa formula, il numero attuale di repliche (il numero di pod che hai già prima di questo canary) viene moltiplicato per la percentuale canary per la fase e il risultato viene diviso per (100 meno la percentuale).

Ad esempio, se hai già 4 pod e la fase canary è del 50%, il numero di pod canary è 4. (Il risultato di 100-percentage viene utilizzato come percentuale: 100-50=50, trattato come .50.)

L'overprovisioning dei pod è il comportamento predefinito.

Provisioning dei pod con overprovisioning disabilitato

Puoi disattivare l'overprovisioning (disablePodOverprovisioning: true), per assicurarti che Cloud Deploy non aumenti il numero di repliche.

La seguente formula mostra come Cloud Deploy calcola il provisioning dei pod per il deployment canary per ogni fase canary, quando l'overprovisioning dei pod è disattivato:

math.Ceil( (ReplicaCountOfDeploymentOnCluster + ReplicaCountOfCanaryDeploymentOnCluster) * percentage)

In questa formula, ReplicaCountOfCanaryDeploymentOnCluster esiste solo se era già presente una fase canary. Se questa è la prima fase canary, non è presente alcun ReplicaCountOfCanaryDeploymentOnCluster.

Se inizi con 4 pod, questo numero viene moltiplicato per la percentuale di canary (ad esempio, 50% o .5) per ottenere 2. Pertanto, il deployment originale viene ridotto a 2 e vengono creati 2 nuovi pod per il deployment canary. Se poi hai una fase canary al 75%, hai 2 (deployment originale) +2 (prima fase canary), *.75, per ottenere 3 pod canary e 1 pod che eseguono il deployment originale.

Utilizzando Cloud Deploy, puoi configurare i deployment canary in GKE e GKE Enterprise in una singola fase o in più fasi.

Le istruzioni riportate di seguito includono solo ciò che è specifico della configurazione canary. Il documento Eseguire il deployment in un cluster Google Kubernetes Engine contiene le istruzioni generali per configurare ed eseguire la pipeline di deployment.

Assicurati di disporre delle autorizzazioni necessarie

Oltre alle altre autorizzazioni Identity and Access Management necessarie per utilizzare Cloud Deploy, devi disporre delle seguenti autorizzazioni per eseguire azioni aggiuntive che potrebbero essere necessarie per un deployment canary:

  • clouddeploy.rollouts.advance
  • clouddeploy.rollouts.ignoreJob
  • clouddeploy.rollouts.cancel
  • clouddeploy.rollouts.retryJob
  • clouddeploy.jobRuns.get
  • clouddeploy.jobRuns.list
  • clouddeploy.jobRuns.terminate

Per ulteriori informazioni sui ruoli disponibili che includono queste autorizzazioni, consulta Ruoli e autorizzazioni IAM.

Prepara il tuo skaffold.yaml

Il file skaffold.yaml definisce il rendering e il deployment dei manifest Kubernetes. Per un deployment canary su GKE/GKE Enterprise, assicurati che punti correttamente ai manifest e definisca gli artefatti di build necessari. All'interno di skaffold.yaml non è richiesta alcuna configurazione specifica per la versione canary, oltre a quella necessaria per un deployment standard. Puoi utilizzare i profili Skaffold per gestire diverse varianti del manifest per le fasi canary personalizzate.

Preparare i manifest Kubernetes

I manifest Kubernetes devono includere sia una risorsa Deployment sia una risorsa Service. Service deve definire un selector che corrisponda alle etichette dei pod gestiti da Deployment. L'etichetta predefinita che Cloud Deploy cerca è app, ma può essere configurata nella pipeline.

Configurare un canary automatico

Configura un canary automatizzato direttamente all'interno della definizione della pipeline di distribuzione per una fase specifica di GKE o GKE Enterprise utilizzando il networking standard dei servizi Kubernetes.

Nella fase della pipeline, includi una proprietà strategy, come segue:

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "SERVICE_NAME"
              deployment: "DEPLOYMENT_NAME"
              podSelectorLabel: "LABEL"
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false
          predeploy:
            actions: "PREDEPLOY_ACTION"
          postdeploy:
            actions: "POSTDEPLOY_ACTION"

In questa configurazione…

  • SERVICE_NAME è il nome del servizio Kubernetes, definito nel manifest.

  • DEPLOYMENT_NAME è il nome del tuo deployment Kubernetes, definito nel manifest.

  • LABEL è un'etichetta del selettore pod. Deve corrispondere al selettore di etichette nel servizio Kubernetes definito nel manifest. Questa opzione è facoltativa. Il valore predefinito è app.

  • PERCENTAGES è un elenco separato da virgole di valori percentuali che rappresentano gli incrementi canary, ad esempio [5, 25, 50].

    Inoltre, non include 100, perché l'implementazione al 100% è presunta nel canary ed è gestita dalla fase stable.

  • Puoi attivare la verifica del deployment (verify: true). In questo caso, viene attivato un job verify in ogni fase.

  • PREDEPLOY_ACTION

    È uguale a ACTION_NAME che hai utilizzato in skaffold.yaml per definire l'azione personalizzata che vuoi eseguire prima del deployment.

  • POSTDEPLOY_ACTION

    È uguale a ACTION_NAME che hai utilizzato in skaffold.yaml per definire l'azione personalizzata che vuoi eseguire dopo il deployment.

Configurare un canary personalizzato

Puoi configurare manualmente la versione canary anziché fare affidamento completamente sull'automazione fornita da Cloud Deploy. Con la configurazione canary personalizzata, specifica quanto segue nella definizione della pipeline di distribuzione:

  • Nomi delle fasi di implementazione

    In un canary completamente automatizzato, Cloud Deploy assegna i nomi alle fasi (ad esempio canary-25, canary-75, stable). Con un canary personalizzato, tuttavia, puoi assegnare a ogni fase un nome qualsiasi, purché sia univoco tra tutte le fasi di questa fase canary e rispetti le limitazioni dell'ID risorsa. ma il nome della fase finale (100%) deve essere stable.

  • Obiettivi percentuali per ogni fase

    Specifica le percentuali separatamente, per fase.

  • Profili Skaffold da utilizzare per la fase

    Puoi utilizzare un profilo Skaffold separato per ogni fase o lo stesso profilo oppure qualsiasi combinazione. Ogni profilo può utilizzare un manifest Kubernetes diverso. Puoi anche utilizzare più di un profilo per una determinata fase. Cloud Deploy li combina.

  • Indica se esiste un job di verifica per la fase

    Ricorda che se attivi la verifica, devi configurare anche il tuo skaffold.yaml per la verifica.

  • Se sono presenti job pre-deployment o post-deployment per la fase

    Se abiliti i job pre-deploy o post-deploy, devi configurare il tuo skaffold.yaml per questi job.

Tutti i tipi di target sono supportati per il canary personalizzato.

Elementi di configurazione canary personalizzati

Il seguente codice YAML mostra la configurazione per le fasi del deployment canary completamente personalizzato:

strategy:
  canary:
    # Custom configuration for each canary phase
    customCanaryDeployment:
      phaseConfigs:
      - phaseId: "PHASE1_NAME"
        percentage: PERCENTAGE1
        profiles: [ "PROFILE_NAME" ]
        verify: true | false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"
      - 
      - phaseId: "stable"
        percentage: 100
        profiles: [ "LAST_PROFILE_NAME" ]
        verify: true|false
        predeploy:
          actions: "PREDEPLOY_ACTION"
        postdeploy:
          actions: "POSTDEPLOY_ACTION"

In questo YAML

  • PHASE1_NAME

    È il nome della fase. Ogni nome di fase deve essere univoco.

  • [ "PROFILE_NAME" ]

    È il nome del profilo da utilizzare per la fase. Puoi utilizzare lo stesso profilo per ogni fase o uno diverso per ciascuna o qualsiasi combinazione. Inoltre, puoi specificare più di un profilo. Cloud Deploy utilizza tutti i profili specificati, più il profilo o il manifest utilizzato dalla fase complessiva.

  • stable

    La fase finale deve essere denominata stable.

  • PERCENTAGE1

    È la percentuale di deployment per la prima fase. Ogni fase deve avere una percentuale univoca, che deve essere un numero intero (non 10.5, ad esempio) e le fasi devono essere in ordine crescente.

  • verify: true|false

    Indica a Cloud Deploy se includere un job di verifica per la fase. Tieni presente che per ogni fase di verifica, Skaffold utilizza lo stesso profilo per la verifica specificata per il rendering e il deployment per quella fase.

  • PREDEPLOY_ACTION

    È uguale al ACTION_NAME che hai utilizzato nel tuo skaffold.yaml per definire l'azione personalizzata che vuoi eseguire prima del deployment.

  • POSTDEPLOY_ACTION

    È uguale a ACTION_NAME che hai utilizzato in skaffold.yaml per definire l'azione personalizzata che vuoi eseguire dopo il deployment.

La percentuale per l'ultima fase deve essere 100. Le fasi vengono eseguite nell'ordine in cui le configuri in questa sezione customCanaryDeployment, ma se i valori percentuali non sono in ordine crescente, il comando per registrare la pipeline di distribuzione non va a buon fine e viene visualizzato un errore.

Tieni presente che la configurazione di un canary personalizzato non include una sezione runtimeConfig. Se includi runtimeConfig, viene considerato un canary personalizzato basato sul servizio.

Configurare un canary personalizzato automatizzato

Questa funzionalità combina la definizione di fasi personalizzate (nomi, percentuali, profili, verifica, hook) con la gestione automatica del traffico di Cloud Deploy per GKE o GKE Enterprise. Definisci le fasi, ma Cloud Deploy gestisce la manipolazione delle risorse sottostanti in base alle percentuali e al runtimeConfig scelto.

Per configurare questa impostazione, includi sia una sezione runtimeConfig con serviceNetworking sia la sezione customCanaryDeployment (che definisce phaseConfigs) all'interno del blocco strategy.canary. Cloud Deploy utilizzerà i profili Skaffold specificati per il rendering, ma regolerà automaticamente il traffico in base alle percentuali di runtimeConfig e di fase.

serialPipeline:
  stages:
  - targetId: gke-prod
    profiles: []
    strategy:
      canary:
        # Include runtimeConfig for automatic traffic management
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "my-app"
              deployment: "my-deployment"
        # Include customCanaryDeployment for phase customization
        customCanaryDeployment:
          phaseConfigs:
          - phaseId: "warmup"
            percentage: 10
            profiles: ["profile-a"] # Profile used for rendering this phase
            verify: true
          - phaseId: "scaling"
            percentage: 50
            profiles: ["profile-b"] # Different profile for this phase
            verify: true
          - phaseId: "stable"
            percentage: 100
            profiles: ["profile-b"] # Can reuse profiles
            verify: true

Esegui il canary GKE o GKE Enterprise

  1. Registra pipeline e target: applica i file di configurazione della pipeline di distribuzione e dei target GKE o GKE Enterprise.

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=gke-targets.yaml --region=REGION
    

    La pipeline di distribuzione include la configurazione canary automatica o personalizzata per il runtime scelto.

  2. Crea una release: avvia il deployment fornendo il nome dell'immagine.

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
      # e.g., --images=my-cloudrun-service=gcr.io/my-project/my-app:v1.1
      # Add --skaffold-file or --source if not using default Skaffold config discovery
    

    La pipeline di distribuzione identificata da PIPELINE_NAME contiene la configurazione canary automatica o personalizzata descritta in questo documento.

  3. Avanza alla fase canary:

    Interfaccia a riga di comando gcloud

    gcloud deploy rollouts advance ROLLOUT_NAME \
                                --release=RELEASE_NAME \
                                --delivery-pipeline=PIPELINE_NAME \
                                --region=REGION
    

    Dove:

    ROLLOUT_NAME è il nome dell'implementazione attuale che stai facendo avanzare alla fase successiva.

    RELEASE_NAME è il nome della release di cui fa parte questo rollout.

    PIPELINE_NAME è il nome della pipeline di distribuzione che utilizzi per gestire il deployment di questa release.

    REGION è il nome della regione in cui è stata creata la release, ad esempio us-central1. Campo obbligatorio.

    Per ulteriori informazioni sul comando gcloud deploy rollouts advance, consulta il riferimento per Google Cloud SDK.

    Google Cloud console

    1. Apri la pagina Pipeline di pubblicazione.

    2. Fai clic sulla pipeline visualizzata nell'elenco delle pipeline di pubblicazione.

      La pagina Dettagli pipeline di distribuzione mostra una rappresentazione grafica dell'avanzamento della pipeline di distribuzione.

    3. Nella scheda Implementazioni, in Dettagli della pipeline di pubblicazione, fai clic sul nome dell'implementazione.

      Viene visualizzata la pagina dei dettagli dell'implementazione.

      Dettagli dell'implementazione nella console Google Cloud

      Nota che in questo esempio l'implementazione ha una fase canary-50 e una fase stable. L'implementazione potrebbe avere più fasi o fasi diverse.

    4. Fai clic su Prosegui con implementazione.

      L'implementazione passa alla fase successiva.

Fasi saltate

Se esegui il deployment di una versione canary e la tua applicazione non è ancora stata sottoposta a deployment in quel runtime, Cloud Deploy salta la fase canary ed esegue la fase stabile. Consulta la sezione Saltare le fasi la prima volta per scoprire perché ciò accade.

Passaggi successivi