Configura routine di avvio delle VM

Quando utilizzi GKE su Bare Metal versione 1.13.0 e successive, puoi specificare routine di avvio per personalizzare l'inizializzazione della VM all'avvio. Puoi configurare la tua VM per creare chiavi SSH, aggiungere utenti e password, installare pacchetti, scrivere file, configurare le impostazioni di rete e altro ancora.

Queste attività di avvio sono configurate con l'API cloud-init o con l'API di script di avvio (non entrambe). Queste istruzioni di avvio sono specificate nel file manifest YAML VirtualMachine ed vengono eseguite automaticamente a ogni avvio della VM.

Prerequisiti

Per configurare una VM con istruzioni di avvio, devi soddisfare i seguenti prerequisiti:

Le seguenti sezioni descrivono come specificare le routine di avvio nel file manifest della VM con l'API cloud-init o gli script di avvio.

Usa l'API cloud-init per inizializzare le VM

Cloud-init è comunemente utilizzato per l'inizializzazione delle istanze cloud e per la personalizzazione delle VM durante l'avvio. L'inizializzazione delle VM comporta in genere attività come l'installazione di pacchetti, la configurazione dei repository, la creazione di chiavi SSH, la scrittura di dati nei file e la configurazione di altri aspetti della VM. Incorpori il codice YAML di configurazione cloud-init nella risorsa personalizzata VirtualMachine con il campo spec.cloudInit. All'avvio dell'istanza VM, cloud-init legge i dati forniti e inizializza la VM di conseguenza.

Di seguito sono riportati i dettagli dell'implementazione cloud-init:

  • I dati cloud-init vengono specificati nel manifest YAML VirtualMachine quando crei o aggiorni una VM. Per istruzioni su come creare una VM mediante l'applicazione di un manifest, consulta Tutorial: creazione e gestione di una VM Linux in VM Runtime on Google Distributed Cloud.

  • Utilizziamo l'origine dati NoCloud, spec.cloudInit.noCloud, nella nostra specifica delle VM.

  • Specifica i dati utente e i dati di rete in sezioni separate nel manifest VirtualMachine. La struttura e la denominazione delle sezioni dipendono dal formato dei dati che decidi di usare.

  • Puoi specificare le informazioni di configurazione di cloud-init nei seguenti formati di dati:

    • Cancella testo
    • Stringa con codifica Base64
    • Secret Kubernetes

Per aiutarti a iniziare, abbiamo fornito alcuni esempi di configurazione per le attività di inizializzazione più comuni delle VM.

Dati utente Cloud-init

Il runtime VM su Google Distributed Cloud supporta i dati utente cloud-init nella sintassi cloud-config, quindi inizia i dati utente con #cloud-config. Puoi formattare i dati utente come testo non crittografato, stringa con codifica Base64 o secret di Kubernetes.

Per ulteriori informazioni sulla sintassi dei dati utente e sul riferimento ai moduli, consulta la documentazione di cloud-init.

Esegui l'inizializzazione dei dati utente nel cloud come testo in chiaro

Il file manifest di esempio seguente mostra come specificare i dati utente come testo in chiaro. In questo caso, cloud-init esegue un comando all'avvio della VM:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      userData: |
        #cloud-config
        runcmd:
          - echo hello

Dati utente Cloud-init come stringa con codifica Base64

L'esempio seguente mostra come specificare i dati utente nel formato con codifica Base64. In questo esempio, i dati utente sono costituiti dallo stesso comando echo hello dell'esempio di testo chiaro:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==

Cloud-init dei dati utente come secret di Kubernetes

L'esempio seguente mostra un manifest YAML sia per un elemento VirtualMachine che per un elemento Secret. La sezione spec.cloudInit.noCloud.secretRef nella configurazione VirtualMachine indica che i dati utente cloud-init si trovano in un secret di Kubernetes denominato my-sec. La configurazione Secret corrispondente specifica i dati utente come coppia chiave-valore. In questo caso, il valore con codifica Base64 è costituito dai dati utente cloud-init nella sintassi cloud-config.

Nel secret a cui viene fatto riferimento, utilizza la chiave dati userData (mostrata) o userdata per specificare i dati utente cloud-init.

In questo esempio, i dati utente sono costituiti dallo stesso comando echo hello dell'esempio di testo chiaro:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      secretRef:
        name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-sec
data:
  userData: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==

Se il secret a cui viene fatto riferimento non viene trovato o la chiave dati userData o userdata non esiste nel secret, prendi nota del seguente comportamento di avvio della VM:

  • Per la creazione della VM, la VM viene impostata in stato ErrorConfiguration con un motivo e un messaggio dettagliati.

  • In altri casi, la VM continua a utilizzare i vecchi dati utente cloud-init fino a quando non viene configurata correttamente. Di conseguenza, l'abilitazione o la disabilitazione degli aggiornamenti da parte dell'agente guest non ha effetto finché la VM non viene configurata correttamente.

Per recuperare le informazioni sulla VM, inclusi i dati utente cloud-init utilizzati, utilizza il seguente comando:

kubectl get vm VM_NAME -o yaml --kubeconfig KUBECONFIG_PATH

Sostituisci quanto segue:

  • VM_NAME: il nome della VM.

  • KUBECONFIG_PATH: il percorso del file kubeconfig per il cluster contenente la VM.

Per recuperare l'evento di avviso di Kubernetes correlato, utilizza kubectl get event o kubectl describe gvm.

Cloud-init dei dati di rete

Analogamente ai dati utente, puoi formattare i dati di rete come testo in chiaro, stringa con codifica Base64 o secret di Kubernetes. A differenza dei dati utente, i dati di rete non usano la sintassi cloud-config.

Quando utilizzi testo in chiaro o una stringa con codifica Base64, la dimensione massima consentita è 2048 byte. Se la dimensione dei dati utente è vicina o superiore a 2048 byte, specificala come secret di Kubernetes.

Per ulteriori informazioni sulla sintassi dei dati di rete e sui relativi dettagli, consulta la pagina relativa alla versione 2 della configurazione di rete nella documentazione di cloud-init.

Esegui l'inizializzazione dei dati di rete come testo in chiaro

Il seguente file manifest di esempio mostra come specificare i dati di rete come testo in chiaro. In questo caso, cloud-init attiva il protocollo DHCP per tutti i dispositivi Ethernet i cui nomi iniziano con una "e" (e*):

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      userData: |
        #cloud-config
        runcmd:
          - echo hello
      networkData: |
        version: 2
        ethernets:
          alleths:
            match:
              name: e*
            dhcp4: true

Dati di rete Cloud-init come stringa con codifica Base64

L'esempio seguente mostra come specificare i dati di rete in formato con codifica Base64. In questo esempio, i dati di rete sono costituiti dalla stessa configurazione DHCP specificata nell'esempio di testo in chiaro:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      networkDataBase64: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK

Cloud-init dei dati di rete come secret di Kubernetes

L'esempio seguente mostra un manifest YAML sia per un elemento VirtualMachine che per un elemento Secret. La sezione spec.cloudInit.noCloud.networkDataSecretRef nella configurazione VirtualMachine indica che i dati di rete cloud-init si trovano in un secret Kubernetes denominato my-sec. La configurazione Secret corrispondente specifica i dati di rete come coppia chiave-valore. In questo caso, il valore con codifica Base64 è costituito dai dati di rete cloud-init.

Nel secret a cui viene fatto riferimento, utilizza la chiave dati networkData (mostrata) o networkdata per specificare i dati di rete cloud-init.

In questo esempio, i dati di rete sono costituiti dalla stessa configurazione DHCP specificata nell'esempio di testo in chiaro:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      networkDataSecretRef:
        name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-sec
data:
  networkData: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK

Esempi di Cloud-init

Le seguenti sezioni contengono esempi di testo chiari di alcuni casi d'uso comuni per l'inizializzazione delle VM con cloud-init:

Configura chiavi SSH autorizzate

Il seguente esempio di dati utente assegna la chiave SSH autorizzata ssh-rsa AAAAB3NzaK8L93bWxnyp all'utente predefinito.

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      userData: |
        #cloud-config
        ssh_authorized_keys:
          - ssh-rsa AAAAB3NzaK8L93bWxnyp

Aggiungere un nuovo utente

Il seguente esempio di dati utente crea un utente test e concede a test l'accesso completo sudo. In questo esempio viene assegnata all'utente una password pwd in scadenza.

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      userData: |
        #cloud-config
        users:
        - default
        - name: test
          sudo: ALL=(ALL) NOPASSWD:ALL
        chpasswd:
          list: |
            test:pwd
          expire: False

Esegui comandi al primo avvio

Il seguente esempio di dati utente esegue un comando echo e un comando ls. Puoi utilizzare i comandi per installare pacchetti e altro ancora all'avvio della VM.

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      userData: |
        #cloud-config
        runcmd:
          - [ echo, hello ]
          - [ ls, -l, / ]

Scrittura di file

Il seguente esempio di dati utente scrive uno script bash nel file test nella directory /var/lib/google della tua VM. Le istruzioni cloud-init impostano le autorizzazioni di lettura, scrittura ed esecuzione (0744) dei file per il proprietario del file.

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  cloudInit:
    noCloud:
      userData: |
        #cloud-config
        write_files:
        - path: /var/lib/google/test
          permissions: 0744
          content: |
            #!/bin/bash
            echo hello

Risoluzione dei problemi di cloud-init

Se si verificano problemi con l'inizializzazione della VM e utilizzi cloud-init, controlla i seguenti log di cloud-init nella tua VM:

  • /var/log/cloud-init.log: per impostazione predefinita, cloud-init scrive in questo log tutti gli eventi con un livello di DEBUG o superiore.

  • /var/log/cloud-init-output.log: per impostazione predefinita, cloud-init indirizza sia stdout e stderr da tutte le fasi di cloud-init a questo log.

Utilizza gli script di avvio per inizializzare le VM

Gli script di avvio eseguono attività durante il processo di avvio di un'istanza di una macchina virtuale (VM). Puoi specificare uno o più script nella sezione spec.startupScripts della specifica VirtualMachine. Puoi utilizzare gli script di avvio per inizializzare la VM. L'inizializzazione delle VM comporta in genere attività come l'installazione di pacchetti, la configurazione dei repository, la creazione di chiavi SSH, la scrittura di dati nei file e la configurazione di altri aspetti della VM.

Tieni presenti i seguenti dettagli per gli script di avvio:

  • Gli script di avvio vengono specificati nel manifest YAML VirtualMachine quando crei o aggiorni una VM. Per istruzioni su come creare una VM mediante l'applicazione di un manifest, consulta Tutorial: creazione e gestione di una VM Linux in VM Runtime on Google Distributed Cloud.

  • Gli script specificati vengono eseguiti a ogni avvio della VM.

  • Includi #!/bin/... nella parte superiore dello script per indicare l'interprete dello script. Ad esempio, includi #!/bin/bash per eseguire lo script con la shell di Bash.

  • Non puoi specificare sia le istruzioni dell'API cloud-init (spec.cloudInit) sia gli script di avvio (spec.startupScripts) nello stesso manifest VirtualMachine.

Formati script

Puoi specificare gli script di avvio nei seguenti formati di dati:

  • Cancella testo
  • Stringa con codifica Base64
  • Secret Kubernetes

Tieni presenti le seguenti regole per lavorare con diversi formati di script:

  • Se utilizzi testo in chiaro o una stringa con codifica Base64, la dimensione massima consentita per i contenuti degli script è di 2048 byte. Se la dimensione dei contenuti del tuo script è vicina o superiore a 2048 byte, specifica gli script come secret di Kubernetes.

  • Quando utilizzi un secret di Kubernetes, utilizza la chiave dati script nel secret di riferimento per specificare il contenuto dello script.

  • Se non viene trovato un secret a cui viene fatto riferimento o se la chiave dati script non esiste nel secret di riferimento, la VM continua a eseguire lo script. Tuttavia, la VM non scrive né aggiorna i contenuti dello script. In questo caso, puoi trovare l'evento di avviso di Kubernetes con kubectl get event o kubectl describe gvm.

Il seguente manifest YAML VirtualMachine di esempio contiene tre script, uno in ciascuno dei formati supportati. In questo caso, ogni script esegue il comando echo hello mostrato in myscript1, l'esempio in chiaro.

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  ...
  startupScripts:
  - name: myscript1
    script: |
      #!/bin/bash
      echo hello
  - name: myscript2
    scriptBase64: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=
  - name: myscript3
    scriptSecretRef:
      name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-sec
data:
  script: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=

Risoluzione dei problemi relativi agli script

Per controllare i risultati dello script o i log, esegui questo comando:

journalctl -u cloud-final

Le voci di log dello script di avvio iniziano con il seguente testo:

started to run the command /var/lib/google/startup-scripts/SCRIPT_NAME ...

La voce di log include SCRIPT_NAME, il nome dello script di avvio.