Wenn Sie Google Distributed Cloud Version 1.13.0 und höher verwenden, können Sie Startroutinen angeben, um die Initialisierung Ihrer VM beim Start anzupassen. Sie können Ihre VM so konfigurieren, dass unter anderem SSH-Schlüssel erstellt, Nutzer und Passwörter hinzugefügt, Pakete installiert, Dateien geschrieben und Netzwerkeinstellungen konfiguriert werden.
Diese Startaufgaben werden entweder mit der cloud-init API oder mit der Startskripts API konfiguriert (nicht mit beiden). Diese Startanweisungen sind in der YAML-Manifestdatei VirtualMachine
angegeben und werden bei jedem Start Ihrer VM automatisch ausgeführt.
Vorbereitung
Zum Konfigurieren einer VM mit Startanweisungen müssen Sie die folgenden Voraussetzungen erfüllen:
Verwenden Sie ein verifiziertes Linux-Gastbetriebssystem und legen Sie im VM-Manifest
osType
aufLinux
fest. Windows-Gastbetriebssysteme werden für diese Funktion nicht unterstützt, da sie cloud-init nicht unterstützen.Achten Sie darauf, dass auf dem Gastbetriebssystem cloud-init installiert ist. Zu den neuesten Linux-Betriebssystemen gehört cloud-init.
In den folgenden Abschnitten wird beschrieben, wie Sie Startroutinen im VM-Manifest entweder mit der cloud-init API oder mit Startskripts angeben.
Cloud-init API zum Initialisieren von VMs verwenden
Cloud-init wird häufig für die Initialisierung von Cloud-Instanzen und zum Anpassen von VMs beim Start verwendet. Die VM-Initialisierung umfasst in der Regel Aufgaben wie Paketinstallationen, Repository-Einrichtung, das Erstellen von SSH-Schlüsseln, das Schreiben von Daten in Dateien und das Einrichten anderer Aspekte Ihrer VM. Sie binden YAML-Konfigurationsdatei für cloud-init mit dem Feld spec.cloudInit
in die benutzerdefinierte Ressource VirtualMachine
ein. Wenn Ihre VM-Instanz gestartet wird, liest cloud-init die bereitgestellten Daten und initialisiert die VM entsprechend.
Beachten Sie die folgenden Details unserer cloud-init-Implementierung:
Sie geben cloud-init-Daten im YAML-Manifest
VirtualMachine
an, wenn Sie eine VM erstellen oder aktualisieren. Eine Anleitung zum Erstellen einer VM durch Anwenden eines Manifests finden Sie unter Anleitung: Linux-VM in VM-Laufzeit auf GDC erstellen und verwalten.Wir verwenden die Datenquelle
NoCloud
spec.cloudInit.noCloud
in unserer VM-Spezifikation.Sie geben Nutzerdaten und Netzwerkdaten im Manifest
VirtualMachine
in separaten Abschnitten an. Die Benennung und Struktur der Abschnitte hängen vom Datenformat ab, das Sie verwenden möchten.Sie können cloud-init-Konfigurationsinformationen in den folgenden Datenformaten angeben:
- Text entfernen
- Base64-codierter String
- Kubernetes Secret
Um Ihnen den Einstieg zu erleichtern, haben wir einige Konfigurationsbeispiele für gängige VM-Initialisierungsaufgaben bereitgestellt.
Cloud-init-Nutzerdaten
Die VM-Laufzeit auf GDC unterstützt cloud-init-Nutzerdaten in der cloud-config-Syntax. Beginnen Sie Ihre Nutzerdaten daher mit #cloud-config
. Sie können die Nutzerdaten als Klartext, als Base64-codierten String oder als Kubernetes-Secret formatieren.
Weitere Informationen zur Syntax von Nutzerdaten und zur Modulreferenz finden Sie in der cloud-init-Dokumentation.
Cloud-init-Nutzerdaten als Klartext
Das folgende Beispielmanifest zeigt, wie Nutzerdaten als Klartext angegeben werden. In diesem Fall führt cloud-init beim Start der VM einen Befehl aus:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- echo hello
cloud-init-Nutzerdaten als base64-codierter String
Das folgende Beispiel zeigt, wie Nutzerdaten im base64-codierten Format angegeben werden.
In diesem Beispiel bestehen die Nutzerdaten aus dem gleichen echo hello
-Befehl wie im Klartextbeispiel:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Cloud-init-Nutzerdaten als Kubernetes-Secret
Das folgende Beispiel zeigt ein YAML-Manifest für VirtualMachine
und Secret
. Der Abschnitt spec.cloudInit.noCloud.secretRef
in der VirtualMachine
-Konfiguration gibt an, dass sich die cloud-init-Nutzerdaten in einem Kubernetes-Secret mit dem Namen my-sec
befinden. Die entsprechende Secret
-Konfiguration gibt die Nutzerdaten als Schlüssel/Wert-Paar an. Der base64-codierte Wert ist in diesem Fall die cloud-init-Nutzerdaten in der cloud-config-Syntax.
Verwenden Sie im referenzierten Secret den Datenschlüssel userData
(siehe Abbildung) oder userdata
, um die cloud-init-Nutzerdaten anzugeben.
In diesem Beispiel bestehen die Nutzerdaten aus dem gleichen echo hello
-Befehl wie im Klartextbeispiel:
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==
Wenn das referenzierte Secret nicht gefunden wird oder der Datenschlüssel userData
oder userdata
nicht im Secret vorhanden ist, beachten Sie das folgende VM-Startverhalten:
Bei der VM-Erstellung wird die VM in den Status
ErrorConfiguration
mit einem detaillierten Grund und einer Meldung versetzt.In anderen Fällen verwendet die VM weiterhin die alten cloud-init-Nutzerdaten, bis die VM korrekt konfiguriert ist. Daher werden Updates durch Gast-Agents erst aktiviert oder deaktiviert, wenn die VM richtig konfiguriert ist.
Verwenden Sie den folgenden Befehl, um VM-Informationen abzurufen, einschließlich der verwendeten cloud-init-Nutzerdaten:
kubectl get vm VM_NAME -o yaml --kubeconfig KUBECONFIG_PATH
Ersetzen Sie Folgendes:
VM_NAME
ist der Name Ihrer VM.KUBECONFIG_PATH
: der Pfad zur kubeconfig-Datei für den Cluster, der Ihre VM enthält.
Verwenden Sie entweder kubectl get event
oder kubectl describe gvm
, um das zugehörige Kubernetes-Warnungsereignis abzurufen.
Cloud-init-Netzwerkdaten
Ähnlich wie bei Nutzerdaten können Sie die Netzwerkdaten als Klartext, als Base64-codierten String oder als Kubernetes-Secret formatieren. Im Gegensatz zu Nutzerdaten verwenden Netzwerkdaten keine cloud-config-Syntax.
Wenn Sie Klartext oder einen base64-codierten String verwenden, beträgt die maximal zulässige Größe 2.048 Byte. Wenn die Nutzerdaten größer als 2.048 Byte sind, geben Sie sie als Kubernetes-Secret an.
Weitere Informationen zur Syntax von Netzwerkdaten und weitere Informationen finden Sie unter Netzwerkkonfiguration Version 2 in der Dokumentation zu cloud-init.
Cloud-init-Netzwerkdaten als Klartext
Das folgende Beispielmanifest zeigt, wie Sie Netzwerkdaten als Klartext angeben.
In diesem Fall aktiviert cloud-init DHCP für alle Ethernet-Geräte, deren Namen mit einem „e“ (e*
) beginnen:
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
cloud-init-Netzwerkdaten als base64-codierter String
Das folgende Beispiel zeigt, wie Netzwerkdaten im base64-codierten Format angegeben werden. In diesem Beispiel bestehen die Netzwerkdaten aus der im Klartextbeispiel angegebenen DHCP-Konfiguration:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataBase64: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
Cloud-init-Netzwerkdaten als Kubernetes-Secret
Das folgende Beispiel zeigt ein YAML-Manifest für VirtualMachine
und Secret
. Der Abschnitt spec.cloudInit.noCloud.networkDataSecretRef
in der VirtualMachine
-Konfiguration gibt an, dass sich die cloud-init-Netzwerkdaten in einem Kubernetes Secret mit dem Namen my-sec
befinden. Die entsprechende Secret
-Konfiguration gibt die Netzwerkdaten als Schlüssel/Wert-Paar an. Der base64-codierte Wert sind in diesem Fall die cloud-init-Netzwerkdaten.
Verwenden Sie im referenzierten Secret den Datenschlüssel networkData
(siehe Abbildung) oder networkdata
, um die cloud-init-Netzwerkdaten anzugeben.
In diesem Beispiel bestehen die Netzwerkdaten aus der im Klartextbeispiel angegebenen DHCP-Konfiguration:
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
Beispiele für cloud-init
Die folgenden Abschnitte enthalten Klartextbeispiele für einige gängige Anwendungsfälle für die VM-Initialisierung mit cloud-init:
- Autorisierte SSH-Schlüssel konfigurieren
- Neuen Nutzer hinzufügen
- Befehle beim ersten Start ausführen
- Dateien schreiben
Autorisierte SSH-Schlüssel konfigurieren
Im folgenden Beispiel für Nutzerdaten wird dem Standardnutzer der autorisierte SSH-Schlüssel ssh-rsa AAAAB3NzaK8L93bWxnyp
zugewiesen.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaK8L93bWxnyp
Neue Nutzer hinzufügen
Im folgenden Beispiel für Nutzerdaten wird der Nutzer test
erstellt und test
uneingeschränkten Sudo-Zugriff gewährt. In diesem Beispiel wird dem Nutzer das nicht ablaufende Passwort pwd
zugewiesen.
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
Befehle beim ersten Start ausführen
Im folgenden Beispiel für Nutzerdaten werden ein echo
- und ein ls
-Befehl ausgeführt. Sie können Befehle verwenden, um beim Start Ihrer VM unter anderem Pakete zu installieren.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- [ echo, hello ]
- [ ls, -l, / ]
Dateien schreiben
Im folgenden Beispiel für Nutzerdaten wird ein Bash-Skript in die Datei test
im Verzeichnis /var/lib/google
Ihrer VM geschrieben. Die cloud-init-Anweisungen legen die Dateiberechtigungen für den Dateieigentümer auf Lesen, Schreiben und Ausführen (0744
) fest.
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
Fehlerbehebung für cloud-init
Wenn bei der VM-Initialisierung Probleme auftreten und Sie cloud-init verwenden, prüfen Sie die folgenden cloud-init-Logs in Ihrer VM:
/var/log/cloud-init.log
: Standardmäßig schreibt cloud-init alle Ereignisse mit der EbeneDEBUG
oder höher in dieses Log./var/log/cloud-init-output.log
: Standardmäßig leitet cloud-init sowohl stdout als auch stderr von allen cloud-init-Phasen an dieses Log weiter.
VMs mit Startskripts initialisieren
Startskripts führen Aufgaben während des Startvorgangs einer VM-Instanz aus. Sie können im Abschnitt spec.startupScripts
der Spezifikation VirtualMachine
ein oder mehrere Skripts angeben. Startskripts können zum Initialisieren Ihrer VM verwendet werden. Die VM-Initialisierung umfasst in der Regel Aufgaben wie Paketinstallationen, Repository-Einrichtung, das Erstellen von SSH-Schlüsseln, das Schreiben von Daten in Dateien und das Einrichten anderer Aspekte Ihrer VM.
Beachten Sie die folgenden Details für Startskripts:
Sie geben Startskripts im YAML-Manifest
VirtualMachine
an, wenn Sie eine VM erstellen oder aktualisieren. Eine Anleitung zum Erstellen einer VM durch Anwenden eines Manifests finden Sie unter Anleitung: Linux-VM in VM-Laufzeit auf GDC erstellen und verwalten.Die angegebenen Skripts werden bei jedem VM-Start ausgeführt.
Fügen Sie
#!/bin/...
am Anfang des Skripts ein, um den Skriptinterpreter anzugeben. Fügen Sie beispielsweise#!/bin/bash
hinzu, um das Skript mit der Bash-Shell auszuführen.Sie können nicht sowohl cloud-init-API-Anweisungen (
spec.cloudInit
) als auch Startskripts (spec.startupScripts
) im selbenVirtualMachine
-Manifest angeben.
Skriptformate
Sie können Startskripts in den folgenden Datenformaten angeben:
- Text entfernen
- Base64-codierter String
- Kubernetes Secret
Beachten Sie die folgenden Regeln für die Arbeit mit verschiedenen Skriptformaten:
Wenn Sie Klartext oder einen base64-codierten String verwenden, beträgt die maximal zulässige Größe für Skriptinhalte 2.048 Byte. Wenn der Inhalt Ihres Skripts fast oder größer als 2.048 Byte ist, geben Sie Skripts als Kubernetes-Secret an.
Wenn Sie ein Kubernetes-Secret verwenden, geben Sie den Skriptinhalt mit dem Datenschlüssel
script
im referenzierten Secret an.Wenn ein referenziertes Secret nicht gefunden wird oder der Datenschlüssel
script
nicht im referenzierten Secret vorhanden ist, führt die VM das Skript weiter aus. Die VM schreibt oder aktualisiert jedoch den Skriptinhalt nicht. In diesem Fall finden Sie das Kubernetes-Warnungsereignis entweder mitkubectl get event
oderkubectl describe gvm
.
Das folgende Beispiel für ein YAML-Manifest VirtualMachine
enthält drei Skripts, eines in jedem der unterstützten Formate. In diesem Fall führt jedes Skript den Befehl echo
hello
aus, der in myscript1
(Klartextbeispiel) angezeigt wird.
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=
Fehlerbehebung für Skripts
Führen Sie den folgenden Befehl aus, um die Skriptergebnisse oder -protokolle zu überprüfen:
journalctl -u cloud-final
Die Logeinträge des Startskripts beginnen mit dem folgenden Text:
started to run the command /var/lib/google/startup-scripts/SCRIPT_NAME ...
Der Logeintrag enthält SCRIPT_NAME
, den Namen des Startskripts.