Configura le routine di avvio della VM

Quando utilizzi Google Distributed Cloud versione 1.13.0 e successive, puoi specificare le routine di avvio per personalizzare l'inizializzazione della VM all'avvio. Puoi configurare la 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 vengono configurate con l'API cloud-init o con l'API degli script di avvio (non entrambe). Queste direttive di avvio sono specificate nel VirtualMachine file manifest YAML e vengono eseguite automaticamente ogni volta che la VM si avvia.

Prerequisiti

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

  • Attiva il runtime VM su GDC.

  • Utilizza un sistema operativo guest Linux verificato e imposta osType su Linux nel manifest della VM. I sistemi operativi guest Windows non sono supportati per questa funzionalità, in quanto non supportano cloud-init.

  • Assicurati che nell'OS guest sia installato cloud-init. I sistemi operativi Linux più recenti includono cloud-init.

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

Utilizzare l'API cloud-init per inizializzare le VM

Cloud-init viene spesso utilizzato per l'inizializzazione delle istanze cloud e per personalizzare le VM durante l'avvio. L'inizializzazione della VM in genere prevede attività come installazioni di pacchetti, configurazione del repository, creazione di chiavi SSH, scrittura di dati in file e configurazione di altri aspetti della VM. Incorpora il file YAML di configurazione cloud-init nella risorsa personalizzata VirtualMachine con il campo spec.cloudInit. Quando l'istanza VM viene avviata, cloud-init legge i dati forniti e inizializza la VM di conseguenza.

Tieni presente i seguenti dettagli della nostra implementazione di cloud-init:

  • Specifica i dati cloud-init nel manifest YAML VirtualMachine quando crei o aggiorni una VM. Per istruzioni su come creare una VM applicando un manifest, consulta Tutorial: crea e gestisci una VM Linux nel runtime VM su GDC.

  • Nella specifica della VM utilizziamo l'origine dati NoCloud,spec.cloudInit.noCloud.

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

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

    • Testo normale
    • Stringa con codifica Base64
    • Secret Kubernetes

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

Dati utente di Cloud-init

Il runtime VM su GDC 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 normale, stringa con codifica base64 o segreto Kubernetes.

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

Dati utente Cloud-init in testo normale

Il seguente manifest di esempio mostra come specificare i dati utente in testo normale. 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 in formato codificato Base64. In questo esempio, i dati utente sono costituiti dallo stesso comando echo hello dell'esempio in testo non cifrato:

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

Dati utente cloud-init come secret Kubernetes

L'esempio seguente mostra un manifest YAML sia per un VirtualMachine sia per un Secret. La sezione spec.cloudInit.noCloud.secretRef nella configurazione VirtualMachine indica che i dati utente cloud-init si trovano in un segreto 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 segreto a cui fai riferimento, utilizza la chiave di dati userData (mostrata) o userdata per specificare i dati utente di cloud-init.

In questo esempio, i dati utente sono costituiti dallo stesso comando echo hello dell'esempio in testo non cifrato:

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 di dati userData o userdata non esiste nel secret, tieni presente il seguente comportamento di avvio della VM:

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

  • In altri casi, la VM continua a utilizzare i vecchi dati utente di cloud-init finché non viene configurata correttamente. Di conseguenza, gli aggiornamenti di attivazione o disattivazione dell'agente ospite non vengono applicati finché la VM non è 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 Kubernetes correlato, utilizza kubectl get event o kubectl describe gvm.

Dati di rete di Cloud-init

Come per i dati utente, puoi formattare i dati di rete come testo normale, come stringa codificata Base64 o come secret Kubernetes. A differenza dei dati utente, i dati di rete non utilizzano la sintassi cloud-config.

Quando utilizzi testo normale o una stringa con codifica base64, la dimensione massima consentita è di 2048 byte. Se le dimensioni dei dati utente sono pari o superiori a 2048 byte, specifica li come secret Kubernetes.

Per ulteriori informazioni sulla sintassi dei dati di rete e sui dettagli correlati, consulta la sezione Networking Config Version 2 nella documentazione di cloud-init.

Dati di rete Cloud-init come testo in chiaro

Il seguente manifest di esempio mostra come specificare i dati di rete in testo normale. In questo caso, cloud-init attiva il 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 consistono nella stessa configurazione DHCP specificata nell'esempio in testo normale:

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

Dati di rete di cloud-init come secret Kubernetes

L'esempio seguente mostra un manifest YAML sia per un VirtualMachine sia per un 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 di cloud-init.

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

In questo esempio, i dati di rete consistono nella stessa configurazione DHCP specificata nell'esempio in testo normale:

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 chiaro di alcuni casi d'uso comuni per l'inizializzazione della VM con cloud-init:

Configurare le chiavi SSH autorizzate

Il seguente esempio di dati utente assegna la chiave SSH autorizzatassh-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 assegna a test accesso sudo completo. In questo esempio all'utente viene assegnata una password senza scadenza pwd.

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

Eseguire i comandi al primo avvio

Il seguente esempio di dati utente esegue un comando echo e un comando ls. Puoi usare 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, / ]

Scrivere file

Il seguente esempio di dati utente scrive uno script bash nel file test nella directory /var/lib/google della VM. Le direttive cloud-init impostano le autorizzazioni di lettura, scrittura ed esecuzione (0744) 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 riscontri problemi con l'inizializzazione della VM e utilizzi cloud-init, controlla i seguenti log di cloud-init nella VM:

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

  • /var/log/cloud-init-output.log: per impostazione predefinita, cloud-init indirizza sia stdout che stderr da tutti gli stadi di cloud-init a questo log.

Utilizzare gli script di avvio per inizializzare le VM

Gli script di avvio eseguono attività durante la procedura di avvio di un'istanza di una macchina virtuale (VM). Puoi specificare uno o più script nella sezione spec.startupScripts della specifica VirtualMachine. Gli script di avvio possono essere utilizzati per inizializzare la VM. L'inizializzazione della VM in genere prevede attività come installazioni di pacchetti, configurazione del repository, creazione di chiavi SSH, scrittura di dati in file e configurazione di altri aspetti della VM.

Tieni presenti i seguenti dettagli per gli script di avvio:

  • Specifica gli script di avvio nel manifest YAML VirtualMachine quando crei o aggiorni una VM. Per istruzioni su come creare una VM applicando un manifest, consulta Tutorial: crea e gestisci una VM Linux nel runtime VM su GDC.

  • Gli script specificati vengono eseguiti ogni volta che viene avviata la 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 Bash.

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

Formati di script

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

  • Testo normale
  • Stringa con codifica Base64
  • Secret Kubernetes

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

  • Quando utilizzi testo normale o una stringa codificata in base64, la dimensione massima consentita per i contenuti dello script è di 2048 byte. Se le dimensioni dei contenuti dello script sono pari o superiori a 2048 byte, specifica gli script come secret Kubernetes.

  • Quando utilizzi un secret Kubernetes, utilizza la chiave di dati script nel secret a cui fai riferimento per specificare i contenuti dello script.

  • Se non viene trovato un segreto a cui viene fatto riferimento o se la chiave di dati script non esiste nel segreto a cui viene fatto 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 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 di testo normale.

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 o i log dello script, esegui il seguente comando:

journalctl -u cloud-final

Le voci del 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.