Aggiornamento di un deployment

Dopo aver creato un deployment, puoi aggiornarlo man mano che l'applicazione o il servizio cambiano. Puoi utilizzare Deployment Manager per aggiornare un deployment:

  • Aggiunta o rimozione di risorse da un deployment.
  • Aggiornamento delle proprietà delle risorse esistenti in un deployment.

Un singolo aggiornamento può contenere qualsiasi combinazione di queste modifiche. Ad esempio, puoi apportare modifiche alle proprietà delle risorse esistenti e aggiungere nuove risorse nella stessa richiesta. Per aggiornare il deployment:

  1. Modifica o crea un file di configurazione con le modifiche che vuoi apportare.
  2. Se vuoi, scegli i criteri da utilizzare per gli aggiornamenti o utilizza quelli predefiniti.
  3. Invia la richiesta di aggiornamento a Deployment Manager.

Prima di iniziare

Preparare l'aggiornamento

Prima di aggiornare il deployment, utilizza queste linee guida per preparare l'aggiornamento:

  • Se stai aggiornando il deployment per aggiungere nuove risorse al tuo progetto, controlla se le risorse esistono già.

    Per impostazione predefinita, se una risorsa che vuoi aggiungere esiste già nel tuo progetto, viene acquisita dal deployment senza creare una nuova risorsa. Se non vuoi acquisire una risorsa esistente, devi modificare il criterio da utilizzare per l'aggiornamento.

    Per informazioni sui criteri che puoi utilizzare durante l'aggiornamento delle implementazioni, consulta Criteri per l'aggiunta di risorse.

  • Se stai aggiornando il deployment per sostituire una risorsa, controlla le relative dipendenze

    Se vuoi sostituire una risorsa del deployment, devi prima assicurarti che la sua eliminazione non causi un ciclo di deployment. Un ciclo di deployment si verifica quando una risorsa dipende da se stessa, direttamente o indirettamente. Ad esempio, considera il seguente deployment:

    resources:
    - name: vm-a
      properties:
        zone: us-central1-f
        ...
        metadata:
          dependsOn:
          - vm-depends-on
    
    # The second VM
    - name: vm-depends-on
      properties:
        zone: $(ref.vm-a.zone)
        ...
    

    In questo deployment, per vm-a, l'istruzione dependsOn richiede che vm-depends-on venga creato prima di vm-a. Tuttavia, vm-depends-on utilizza un riferimento alla zona per vm-a, il che richiede che vm-a venga creato prima di vm-depends-on. In questo scenario, le dipendenze sono in un ciclo e il deployment non va a buon fine.

    Se hai una risorsa che dipende da altre risorse e da cui dipendono altre risorse, la sostituzione di questa risorsa potrebbe causare un ciclo di deployment.

    Ad esempio, considera un deployment con un disco permanente denominato disk-a, una VM denominata vm-a e un gruppo di istanze denominato ig-a. La configurazione per vm-a include un riferimento a disk-a e la configurazione per ig-a include un riferimento a vm-a. In una configurazione aggiornata, vuoi rimuovere vm-a e sostituirlo con vm-b. In questo scenario, la risoluzione delle dipendenze per vm-a e vm-b può causare un ciclo di deployment e il deployment non va a buon fine.

    Per evitare cicli di deployment quando vuoi sostituire una risorsa in una catena di dipendenze, esegui una delle seguenti operazioni:

    • Rimuovi le dipendenze per la risorsa che vuoi sostituire rimuovendo la clausola dependsOn oppure rimuovendo o modificando i riferimenti ad altre risorse. Dopo aver aggiornato il deployment con queste modifiche, esegui un altro aggiornamento per sostituire la risorsa.

    • Elimina la catena di risorse dipendenti e aggiorna il deployment. Poi, nel prossimo aggiornamento, ricrea le risorse che vuoi utilizzare.

  • Assicurati che esista un'API sottostante che supporti l'aggiornamento.

    Deployment Manager utilizza le API di ogni servizio per creare e modificare i tuoi deployment. Per verificare che la tua richiesta possa essere completata da Deployment Manager, consulta la documentazione dell'API del serviziopiattaforma Cloudm per le risorse che vuoi aggiornare.

    Ad esempio, se vuoi aggiornare un set di dati BigQuery nella tua implementazione, consulta i metodi disponibili nella documentazione di riferimento dell'API Datasets. I metodi includono un metodo update, che indica che puoi aggiornare il set di dati utilizzando Deployment Manager.

    Alcune API hanno metodi personalizzati per aggiornare le risorse. Ad esempio, Compute Engine offre un metodo personalizzato per aggiornare i metadati di un'istanza chiamato setMetadata. In questi casi, Deployment Manager tenta di utilizzare i metodi personalizzati.

  • Assicurati che le risorse che stai aggiornando siano modificabili.

    Alcune risorse sono immutabili dopo la creazione e non possono essere aggiornate. Per determinare se una risorsa è immutabile, consulta il riferimento API per la risorsa. In genere, una risorsa immutabile non dispone di un metodo API update o di un metodo personalizzato per aggiornare le proprietà della risorsa.

Limitazioni

  • Per ogni deployment, puoi applicare un aggiornamento alla volta. Se è già in corso un aggiornamento, devi interrompere l'aggiornamento corrente prima di avviarne uno nuovo.

  • Se hai modificato una risorsa in un deployment senza utilizzare Deployment Manager, ad esempio nella console Google Cloud o in gcloud, potresti visualizzare errori o problemi imprevisti quando provi a modificare la risorsa in un aggiornamento.

Apportare modifiche alla configurazione

Se hai salvato una configurazione esistente, apportale le modifiche e utilizzala nella richiesta di aggiornamento.

Se non hai salvato una configurazione esistente, creane una nuova. Per i passaggi per creare un file di configurazione, leggi Configurazioni.

Deployment Manager confronta la configurazione fornita nella richiesta di aggiornamento con il manifest precedente e utilizza le differenze per aggiornare il deployment.

Ad esempio, la tabella seguente mostra due configurazioni: una descrive un deployment esistente e l'altra descrive lo stato aggiornato desiderato del deployment. Fornisci la configurazione aggiornata e Deployment Manager valuta le differenze e apporta gli aggiornamenti appropriati.

Questo esempio aggiorna una risorsa di istanza esistente per includere alcuni metadati personalizzati e aggiunge anche una nuova risorsa di macchina virtuale al deployment. Le parti in grassetto sono le differenze tra i modelli.

Modello attuale Modello aggiornato
resources:
- name: vm-created-by-cloud-config
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        diskName: disk-created-by-cloud-config
        sourceImage: image-url
    networkInterfaces:
    - network: network-url
resources:
- name: vm-created-by-cloud-config
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      initializeParams:
        diskName: disk-created-by-cloud-config
        sourceImage: image-url
    networkInterfaces:
    - network: network-url
    metadata:
      items:
      - key: 'foo'
        value: 'bar'
      - key: 'dev'
        value: 'vm'

- name: a-new-vm
  type: compute.v1.instance
  properties:
    zone: us-central1-a
    machineType: machine-type-url
      - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: false
      initializeParams:
        diskName: a-new-vm-disk
        sourceImage: image-url
    networkInterfaces:
    - network: network-url

(Facoltativo) Determina i criteri da utilizzare per l'aggiornamento

Quindi, determina quali criteri vuoi utilizzare per l'aggiornamento. Il criterio determina come vengono aggiornate le risorse quando aggiorni il deployment.

Deployment Manager utilizza i seguenti criteri predefiniti:

  • Il criterio predefinito per l'aggiunta di risorse è CREATE_OR_ACQUIRE.
  • Il criterio predefinito per la rimozione delle risorse è DELETE.
  • Il criterio predefinito per l'aggiornamento delle risorse è UPDATE.

Per informazioni su ciascuna norma, consulta le sezioni seguenti.

Norme per l'aggiunta di risorse

Quando aggiungi risorse, puoi scegliere di crearne una nuova e aggiungerla a un deployment oppure acquisire una risorsa esistente:

  • CREATE_OR_ACQUIRE - [Predefinito] Deployment Manager acquisisce le risorse esistenti nel progetto o le crea se non esistono. Per acquisire una risorsa, Deployment Manager controlla la configurazione per le proprietà della risorsa che stai tentando di creare. Se esiste una risorsa con le stesse proprietà, Deployment Manager la acquisisce nell'ambito del deployment.

    Le proprietà che Deployment Manager controlla dipendono dal tipo di risorsa che stai creando e potrebbero includere:

    • Il name della risorsa
    • Il type della risorsa
    • Il zone o il region della risorsa, se applicabile

    Le proprietà fanno parte dell'URL della richiesta API GET per la risorsa. Per vedere quali proprietà utilizza Deployment Manager per acquisire una risorsa, consulta la documentazione dell'API per il metodo GET della risorsa. Ad esempio, per le istanze Compute Engine, l'URL della richiesta per il metodo instances.get include resourceId (name nella configurazione), zone e project.

  • CREATE - Deployment Manager crea risorse che non esistono. Se una delle risorse nella configurazione esiste già nel progetto, il deployment non va a buon fine.

  • ACQUIRE - Deployment Manager acquisisce le risorse già esistenti utilizzando gli stessi criteri di CREATE_OR_ACQUIRE.

    Utilizza il criterio ACQUIRE se hai già diverse risorse nel tuo progetto e vuoi gestirle insieme, come un unico deployment.

    Nel modello o nella configurazione, devi fornire le proprietà richieste per queste risorse come se le stessi creando. Se una delle risorse nella configurazione non esiste nel progetto, il deployment non va a buon fine.

Norme per la rimozione delle risorse

Fornisci una delle seguenti norme per la rimozione delle risorse:

  • DELETE - [Predefinito] Rimuove tutti i riferimenti alla risorsa dalla distribuzione ed elimina la risorsa sottostante. L'operazione è definitiva e non può essere annullata, ma puoi ricreare una nuova risorsa con le stesse proprietà.

  • ABANDON: rimuove tutti i riferimenti alla risorsa dal deployment, ma non elimina la risorsa sottostante. Ad esempio, l'abbandono di un'istanza significa che viene rimossa da un deployment, ma l'istanza esiste ancora e puoi utilizzarla.

    Le norme ABANDON si applicano solo quando elimini intere risorse, non quando elimini le proprietà di una risorsa o aggiorni una risorsa con nuove proprietà. Se vuoi conservare le proprietà di una risorsa, devi includere la risorsa con tutte le sue proprietà originali nella configurazione aggiornata. Se utilizzi un nuovo file di configurazione per l'aggiornamento, ti consigliamo di copiare la definizione della risorsa dalla configurazione originale.

Norme per l'aggiornamento di una risorsa esistente

Se esiste un metodo UPDATE per aggiornare le risorse esistenti, Deployment Manager lo utilizza.

In caso contrario, se esiste un metodo personalizzato, Deployment Manager lo utilizza. Deployment Manager supporta metodi personalizzati che utilizzano il verbo set. Ad esempio, setMetadata() è un metodo personalizzato valido, mentre addAccessConfigs() non lo è.

(Facoltativo) Visualizza l'anteprima di una configurazione aggiornata

Puoi visualizzare in anteprima l'aggiornamento che vuoi apportare prima di eseguire il commit di qualsiasi modifica, con Google Cloud CLI o l'API. Il servizio Deployment Manager visualizza l'anteprima della configurazione espandendo la configurazione completa e creando risorse "shell".

Deployment Manager non crea istanze di risorse effettive quando visualizzi l'anteprima di una configurazione, dandoti l'opportunità di vedere il deployment prima di eseguirne il commit.

gcloud

Con Google Cloud CLI, effettua una richiesta update con il parametro --preview:

gcloud deployment-manager deployments update example-deployment \
    --config configuration-file.yaml \
    --preview

API

Nell'API, crea una richiesta PUT() con un deployment esistente e fornisci il parametro di query preview=true. Il corpo della richiesta deve contenere i campi intent, target e name. Fornisci il nome del deployment sia nell'URL sia nel corpo della richiesta.

Ad esempio, la seguente richiesta API mostra l'anteprima di un semplice aggiornamento:

PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?preview=true

{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment"
}

Dopo aver visualizzato l'anteprima di un deployment, puoi eseguire il deployment completo della configurazione effettuando la stessa richiesta PUT(), omettendo sia la configurazione sia il parametro di query preview. Deployment Manager utilizza l'ultima anteprima per eseguire l'aggiornamento. Ad esempio:

gcloud deployment-manager deployments update example-deployment

Per i passaggi per effettuare una richiesta di aggiornamento, consulta Effettuare la richiesta di aggiornamento.

Se decidi di non procedere con l'aggiornamento, annulla l'anteprima corrente prima di effettuare un'altra richiesta di aggiornamento o anteprima.

Annullare un'anteprima

Dopo aver visualizzato l'anteprima di un aggiornamento, devi decidere se vuoi continuare con l'aggiornamento. Se non vuoi continuare o se vuoi utilizzare un file di configurazione diverso per aggiornare il deployment, annulla l'anteprima corrente.

gcloud

Con Google Cloud CLI, invia una richiesta deployments cancel-preview:

gcloud deployment-manager deployments cancel-preview my-first-deployment

API

Nell'API, invia una richiesta PUT() al metodo cancelPreview e fornisci l'ultima impronta di distribuzione. Un'impronta è un valore generato in modo casuale che cambia a ogni richiesta di aggiornamento. Per evitare errori durante l'aggiornamento, fornisci l'ultima impronta con la tua richiesta.

Per ottenere l'impronta più recente di un deployment, utilizza il metodo get() per ottenere un deployment e cerca il valore dell'impronta. Il valore dell'impronta ha questo aspetto:

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

La tua richiesta cancelPreview() è simile a questa:

POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/cancelPreview

{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }

Effettuare la richiesta di aggiornamento

Per eseguire l'aggiornamento:

gcloud

Con Google Cloud CLI, utilizza il comando secondario deployments update, fornendo una nuova configurazione e, facoltativamente, i criteri di aggiornamento.

gcloud deployment-manager deployments update my-first-deployment \
    --create-policy POLICY \
    --delete-policy POLICY

Se in precedenza hai visualizzato l'anteprima di una configurazione, ometti la configurazione e Deployment Manager utilizza l'ultima configurazione di cui è stata visualizzata l'anteprima per eseguire l'aggiornamento.

gcloud deployment-manager deployments update my-first-deployment

API

Nell'API, invia una richiesta update e fornisci l'ultima impronta di distribuzione. Un'impronta è un valore generato in modo casuale che cambia a ogni richiesta di aggiornamento. Per evitare errori durante l'aggiornamento, fornisci l'ultima impronta con la tua richiesta.

Per ottenere l'impronta più recente di un deployment, utilizza il metodo get() per ottenere un deployment e cerca il valore dell'impronta. Il valore dell'impronta ha questo aspetto:

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

Dopodiché, fornisci l'impronta nella richiesta, insieme alla nuova configurazione e ai criteri di aggiornamento. Se in precedenza hai visualizzato l'anteprima della configurazione, ometti la configurazione e aggiorna i criteri. Deployment Manager utilizza l'ultima configurazione visualizzata in anteprima per eseguire l'aggiornamento.

Fornisci il nome del deployment sia nell'URL sia nel corpo della richiesta.

PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?createPolicy=ACQUIRE&deletePolicy=ABANDON

{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment",
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
}

Interrompere un aggiornamento

Puoi interrompere un aggiornamento in corso utilizzando stop(). metodo. In questo modo, viene annullato qualsiasi ulteriore avanzamento di un determinato aggiornamento, ma non viene annullata alcuna modifica già apportata.

Se stai tentando di annullare un'anteprima, consulta la sezione Annullare un'anteprima.

gcloud

Con Google Cloud CLI, invia una richiesta deployments stop:

gcloud deployment-manager deployments stop my-first-deployment

API

Nell'API, invia una richiesta POST() al metodo stop e fornisci la proprietà fingerprint più recente. Un'impronta è un valore generato in modo casuale che cambia a ogni richiesta di aggiornamento. Per evitare modifiche in conflitto, devi fornire l'ultima impronta con la tua richiesta, per eseguire il blocco ottimistico in modo che possa essere apportato un solo aggiornamento alla volta.

Per ottenere l'impronta più recente di un deployment, utilizza il metodo get() per ottenere un deployment e cerca il valore dell'impronta. Il valore dell'impronta ha questo aspetto:

"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="

La tua richiesta è simile alla seguente:

POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/stop

{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }

Passaggi successivi