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 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 script di avvio (non entrambe). Queste istruzioni di avvio sono specificate nel file manifest YAML VirtualMachine
e vengono eseguite automaticamente a ogni avvio della VM.
Prerequisiti
Per configurare una VM con istruzioni di avvio, devi soddisfare i seguenti prerequisiti:
Utilizza un sistema operativo guest Linux verificato e imposta
osType
suLinux
nel manifest della VM. I sistemi operativi guest Windows non sono supportati per questa funzionalità, poiché non supportano cloud-init.Assicurati che sul sistema operativo guest sia installato cloud-init. I sistemi operativi Linux più recenti includono cloud-init.
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.
Utilizzare 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 prevede 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. Incorporare 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.
Prendi nota dei seguenti dettagli della nostra implementazione di cloud-init:
Puoi specificare i dati cloud-init 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 nel runtime VM su GDC.Utilizziamo l'origine dati
NoCloud
,spec.cloudInit.noCloud
, nelle nostre specifiche delle VM.Puoi specificare 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 attività comuni di inizializzazione delle VM.
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 in chiaro, stringa codificata in base64 o secret di Kubernetes.
Per ulteriori informazioni sulla sintassi dei dati utente e sul riferimento ai moduli, consulta la documentazione di cloud-init.
Cloud-init i dati utente come testo in chiaro
Il file manifest di esempio riportato di seguito 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 codificata in 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 in chiaro:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Dati utente 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.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 sono i 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 in 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 di una VM, viene messa in stato
ErrorConfiguration
con un motivo e un messaggio dettagliati.In altri casi, la VM continua a utilizzare i vecchi dati utente di cloud-init fino a quando non viene configurata correttamente. Di conseguenza, l'abilitazione o la disabilitazione degli aggiornamenti 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
.
Dati di rete 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 usano la sintassi di 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 sezione Networking Config versione 2 nella documentazione di cloud-init.
Cloud-init dati di rete come testo in chiaro
Il file manifest di esempio riportato di seguito mostra come specificare i dati di rete come testo in chiaro.
In questo caso, cloud-init abilita 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 codificata in Base64
L'esempio seguente mostra come specificare i dati di rete nel 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
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 cloud-init si trovano in un secret di 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 sono i 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 in chiaro di alcuni casi d'uso comuni per l'inizializzazione delle VM con cloud-init:
- Configurare le chiavi SSH autorizzate
- Aggiungere un nuovo utente
- Eseguire comandi al primo avvio
- Scrivi file
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 sudo completo. In questo esempio, all'utente viene assegnata una password di pwd
non 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 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
dei file 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 in questo log./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 le 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
. Gli script di avvio possono essere utilizzati per inizializzare la VM. L'inizializzazione delle VM prevede 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 presente i seguenti dettagli per gli script di avvio:
Puoi specificare gli script di avvio 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 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 la shell Bash.Non puoi specificare sia le istruzioni dell'API cloud-init (
spec.cloudInit
) sia gli script di avvio (spec.startupScripts
) nello stesso manifestVirtualMachine
.
Formati script
Puoi specificare gli script di avvio nei seguenti formati di dati:
- Cancella testo
- Stringa con codifica Base64
- Secret Kubernetes
Per lavorare con formati di script diversi, tieni presente le seguenti regole:
Quando utilizzi testo in chiaro o una stringa con codifica Base64, la dimensione massima consentita per i contenuti dello script è 2048 byte. Se le dimensioni dei contenuti dello script sono vicine o superiori 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 un secret a cui viene fatto riferimento non viene trovato o se la chiave dati
script
non esiste nel Secret indicato, la VM continua a eseguire lo script. La VM non scrive né aggiorna il contenuto dello script. In questo caso, puoi trovare l'evento di avviso di Kubernetes conkubectl get event
okubectl 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 o i log dello script, 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.