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 startup scripts (non entrambe). Queste istruzioni di avvio sono specificate
VirtualMachine
file manifest YAML ed eseguito automaticamente ogni volta che la tua VM
.
Prerequisiti
Per configurare una VM con istruzioni di avvio, devi soddisfare i seguenti requisiti prerequisiti:
Utilizza un sistema operativo guest Linux verificato e imposta Da
osType
aLinux
nel manifest della VM. I sistemi operativi guest di Windows non sono supportati per questa funzionalità, poiché non supportano cloud-init.Assicurati che nel sistema operativo guest sia installato cloud-init. Sistemi operativi Linux più recenti includi cloud-init.
Le sezioni seguenti descrivono come specificare le routine di avvio nella VM con l'API cloud-init oppure script di avvio.
Utilizza l'API cloud-init per inizializzare le VM
Cloud-init è
comunemente utilizzata per l'inizializzazione delle istanze cloud e per la personalizzazione delle VM durante
avvio automatico. 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. Puoi incorporare il file YAML della configurazione cloud-init nella
VirtualMachine
risorsa personalizzata con il campo spec.cloudInit
. Quando la tua 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.Utilizziamo Origine dati
NoCloud
,spec.cloudInit.noCloud
, nelle nostre specifiche VM.Specifica i dati utente e i dati di rete in due 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 cloud-init nei dati seguenti formati:
- Cancella testo
- 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 in
sintassi di cloud-config,
quindi inizia i tuoi dati utente con #cloud-config
. Puoi formattare i dati utente come
un testo in chiaro, una stringa con codifica base64 o un secret Kubernetes.
Per ulteriori informazioni sulla sintassi dei dati utente e sul riferimento ai moduli, consulta la documentazione di cloud-init.
Dati utente Cloud-init come testo in chiaro
Il seguente esempio di file manifest 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 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 di cloud-init come secret Kubernetes
L'esempio seguente mostra un manifest YAML sia per un VirtualMachine
che 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 di Secret
corrispondente specifica i dati utente
come coppia chiave-valore. Il valore con codifica Base64 in questo caso è cloud-init
dei dati utente 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 oppure la chiave 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 cloud-init finché se la VM è configurata correttamente. Di conseguenza, l'agente ospite attiva o disattiva gli aggiornamenti non hanno 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 Kubernetes correlato, utilizza kubectl get event
o kubectl describe gvm
.
Dati di rete di Cloud-init
Analogamente ai dati utente, puoi formattare i dati di rete come testo in chiaro, una stringa con codifica base64, o un secret di Kubernetes. A differenza dei dati utente, i dati di rete non utilizza la sintassi cloud-config.
Se utilizzi un testo in chiaro o una stringa con codifica base64, vengono indicate le dimensioni massime consentite è 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 relativi dettagli, consulta Configurazione di rete versione 2 nella documentazione di cloud-init.
Dati di rete Cloud-init come testo in chiaro
Il seguente esempio di file manifest 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 con nomi
iniziano con la "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. specificato nell'esempio di testo in chiaro:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataBase64: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
Dati di rete Cloud-init come secret di Kubernetes
L'esempio seguente mostra un manifest YAML sia per un VirtualMachine
che per un
Secret
. La sezione spec.cloudInit.noCloud.networkDataSecretRef
nella configurazione VirtualMachine
indica che i dati di rete di cloud-init si trovano in un secret Kubernetes denominato my-sec
. La configurazione Secret
corrispondente specifica i dati di rete come coppia chiave-valore. Il valore con codifica Base64 in questo caso è cloud-init
dati di rete.
Nel secret a cui viene fatto riferimento, utilizza la chiave dati networkData
(mostrata) oppure
networkdata
per specificare i dati di rete cloud-init.
In questo esempio, i dati di rete sono costituiti dalla stessa configurazione DHCP. specificato 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 chiaro di alcuni casi d'uso comuni per l'inizializzazione della VM con cloud-init:
- Configura chiavi SSH autorizzate
- Aggiungere un nuovo utente
- Eseguire comandi alla prima esecuzione
- Scrivi file
Configura chiavi SSH autorizzate
L'esempio di dati utente seguente 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 fornisce l'accesso completo a test
sudo. 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 alla prima esecuzione
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, / ]
Scrivi file
Il seguente esempio di dati utente scrive uno script Bash nel file test
del
directory /var/lib/google
della tua 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 tutti gli eventi con un livello diDEBUG
o superiore a questo log./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.
Utilizza gli script di avvio per inizializzare le VM
Gli script di avvio eseguono attività durante il processo di avvio di una macchina virtuale
(VM). Puoi specificare uno o più script nel spec.startupScripts
della specifica VirtualMachine
. Gli script di avvio possono essere utilizzati per inizializzare
della VM. L'inizializzazione delle VM in genere comporta attività come l'installazione di pacchetti,
la configurazione di un repository, la creazione di chiavi SSH, la scrittura dei dati nei file e
ad altri aspetti della VM.
Tieni presenti i seguenti dettagli per gli script di avvio:
Puoi specificare gli script di avvio nel manifest YAML
VirtualMachine
quando per creare o aggiornare 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 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 Conchiglia bash.Non puoi specificare entrambe le istruzioni API cloud-init (
spec.cloudInit
) e gli script di avvio (spec.startupScripts
) nella stessaVirtualMachine
.
Formati di script
Puoi specificare gli script di avvio nei seguenti formati di dati:
- Cancella testo
- 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 è stato trovato un secret a cui viene fatto riferimento o la chiave dati
script
non esiste in il secret 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 conkubectl get event
okubectl describe gvm
.
Il seguente esempio di manifest YAML VirtualMachine
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 o i log dello script, esegui il seguente 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 del
script di avvio.