In diesem Dokument wird beschrieben, wie Sie ein benutzerdefiniertes Image für die Verwendung mit VM-Instanzen (Virtual Machine) mit Air Gap in Google Distributed Cloud (GDC) erstellen.
Sie können benutzerdefinierte Images von vorhandenen Quelllaufwerken erstellen und damit VMs erstellen und starten . Benutzerdefinierte Images sind ideal, wenn Sie ein nichtflüchtiges Bootlaufwerk in einem bestimmten Zustand erstellen und ändern und diesen Zustand zum Erstellen von VMs speichern müssen. Wenn Sie ein benutzerdefiniertes Image erstellen und speichern, um es in Zukunft als neues VM-Image zu verwenden, vermeiden Sie, dass Sie die Einrichtungsschritte später wiederholen müssen.
Dieses Dokument richtet sich an Entwickler in Plattformadministrator- oder Anwendungsoperatorgruppen, die VMs erstellen und VM-Images in einer Google Distributed Cloud (GDC)-Umgebung mit Air Gap verwalten. Weitere Informationen finden Sie unter Dokumentation zu Zielgruppen für GDC mit Air Gap.
Hinweis
Wenn Sie gdcloud Befehlszeilenschnittstellenbefehle (CLI) verwenden möchten, müssen Sie die gdcloud CLI heruntergeladen, installiert
und konfiguriert haben.
Alle Befehle für Distributed Cloud verwenden die gdcloud- oder kubectl-CLI und erfordern eine Betriebssystemumgebung.
Pfad der kubeconfig-Datei abrufen
Wenn Sie Befehle für den Management API-Server ausführen möchten, benötigen Sie die folgenden Ressourcen:
Melden Sie sich an und generieren Sie die kubeconfig-Datei für den Management API-Server, falls Sie noch keine haben.
Ersetzen Sie in dieser Anleitung
MANAGEMENT_API_SERVERdurch den Pfad zur kubeconfig-Datei des Management API-Servers.
IAM-Rollen anfordern
Wenden Sie sich an Ihren Projekt-IAM-Administrator, um die folgenden Rollen für Ihr Projekt anzufordern:
Project VirtualMachine Admin (
project-vm-admin): VMs im Projekt-Namespace erstellen, ändern, auflisten und löschen.Projektbetrachter(
project-viewer): Alle Ressourcen in den Projekt-Namespaces ansehen.Project Virtual Machine Image Admin (
project-vm-image-admin): Benutzerdefinierte VM-Images im Projekt-Namespace erstellen, auflisten und löschen.
Alle VM-Rollen müssen an den Namespace des Projekts gebunden sein, in dem sich die VM befindet. Folgen Sie der Anleitung, um Ihren Zugriff zu prüfen.
Benutzerdefiniertes Image erstellen
In diesem Abschnitt wird beschrieben, wie Sie ein benutzerdefiniertes Image auf einer VM erstellen.
VM für ein Image vorbereiten
Sie können ein Image von einem Laufwerk erstellen, während es an eine ausgeführte VM angehängt ist. Das Image wird jedoch zuverlässiger, wenn Sie die VM in einen Zustand versetzen, den das Image erfassen kann.
Schreiben von Daten auf den nichtflüchtigen Speicher beenden
Beenden Sie die VM sodass sie herunterfahren und das Schreiben von Daten auf den nichtflüchtigen Speicher beenden kann.
Image erstellen
Führen Sie die folgenden Schritte aus, um Laufwerk-Images von einem nichtflüchtigen Speicher zu erstellen, auch wenn dieser mit einer VM verbunden ist:
Console
Wählen Sie ein Projekt aus.
Klicken Sie im Navigationsmenü auf Virtual Machines > Images.
Klicken Sie auf Image erstellen.
Geben Sie einen eindeutigen Namen für das Image ein. Der Name darf maximal 35 Zeichen lang sein.
Geben Sie eine Version ein, die dem Image-Namen hinzugefügt werden soll.
Wählen Sie im Feld Quelllaufwerk ein Laufwerk aus.
Geben Sie im Feld Minimale Laufwerkgröße eine Laufwerkgröße ein.
Geben Sie eine Beschreibung des Images ein.
Klicken Sie auf Erstellen.
Das Image wird in der Liste der Images angezeigt.
API
Listen Sie alle
VirtualMachineDisk-Objekte auf:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachinedisks.virtualmachine.gdc.googWählen Sie ein
VirtualMachineDisk-Objekt aus, das als Quelllaufwerk für das neue Image verwendet werden soll.Prüfen Sie, ob das VM-Laufwerk an eine VM angehängt ist:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \ -o jsonpath='{.status.virtualMachineAttachments}'Die folgende Beispielausgabe zeigt ein Laufwerk, das an eine VM angehängt ist:
[{"autoDelete":true,"nameRef":{"name":"vm1"},"uid":"...."}]- Wenn die Ausgabe einen Wert für
"name"zurückgibt, ist das Laufwerk an eine VM angehängt, die durch dasnameFeld angegeben wird. In diesem Beispiel ist der Wert fürnamegleichvm1. Fahren Sie fort , den Ausführungsstatus der VM zu prüfen. - Wenn die Ausgabe leer ist, rufen Sie die get the
sizeof theVirtualMachineDiskab.
- Wenn die Ausgabe einen Wert für
Prüfen Sie den Ausführungsstatus der VM. Wenn der Status nicht
Stoppedist, beenden Sie die VM und fahren Sie mit dem Erstellen desVirtualMachineImagefort.Rufen Sie die
sizedesVirtualMachineDiskab, um das Image zu erstellen:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \ -o jsonpath='{.spec.size}'Erstellen Sie ein
VirtualMachineImageImport-Objekt und stellen Sie es auf dem Management API-Server bereit:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ apply -f - <<EOF apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineImageImport metadata: name: VM_IMAGE_IMPORT_NAME spec: source: diskRef: name: DISK_NAME imageMetadata: name: IMAGE_NAME operatingSystem: OS_NAME minimumDiskSize: MINIMUM_DISK_SIZE EOFPrüfen Sie, ob der Image-Import abgeschlossen ist und der Status
Readylautet:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachineimageimports.virtualmachine.gdc.goog VM_IMAGE_IMPORT_NAME \ -o jsonpath='{.status}'Wenn der Import abgeschlossen ist, sieht die Statusausgabe so ähnlich aus:
{ "conditions": [ { "lastTransitionTime": "", "message": "", "observedGeneration": 1, "reason": "ImportJobComplete", "status": "True", "type": "Ready" } ], "imageName": IMAGE_NAME }Prüfen Sie, ob das Image erstellt wurde:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachineimages.virtualmachine.gdc.goog \ CREATED_IMAGE_NAMEErsetzen Sie die Variablen anhand der folgenden Definitionen.
Variable Definition MANAGEMENT_API_SERVERDie kubeconfig-Datei des Management API-Servers. PROJECTDas GDC-Projekt, in dem das Image erstellt werden soll. DISK_NAMEDer Name des Quelllaufwerks, z. B. vm1-boot-disk.VM_IMAGE_IMPORT_NAMEDer Name des VM-Image-Imports. Der Name darf maximal 35 Zeichen lang sein. IMAGE_NAMEDer Name des erstellten Images, z. B. custom-image.OS_NAMEDer Name des Betriebssystems des Images. Er muss einer der folgenden Werte sein: ubuntu-2004,windows-2019oderrhel-8.MINIMUM_DISK_SIZEDie minimale Laufwerkgröße im VM-Image-Import, z. B. 20G:
minimumDiskSizemuss immer größer oder gleich der Größe des Quell-Bootlaufwerks sein.CREATED_IMAGE_NAMEDer Name des erstellten Images. Der Name des erstellten Images muss eindeutig sein. Sie können keinen Image-Namen verwenden, der bereits im Projekt vorhanden ist.
Terraform
Listen Sie alle
VirtualMachineDisk-Objekte auf:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachinedisks.virtualmachine.gdc.googWählen Sie ein
VirtualMachineDisk-Objekt aus, das als Quelllaufwerk für das neue Image verwendet werden soll.Prüfen Sie, ob das VM-Laufwerk an eine VM angehängt ist:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \ -o jsonpath='{.status.virtualMachineAttachments}'Beispielausgabe, die zeigt, dass ein Laufwerk an eine VM angehängt ist:
[{"autoDelete":true,"nameRef":{"name":"vm1"},"uid":"...."}]- Wenn die Ausgabe einen Wert für
"name"zurückgibt, ist das Laufwerk an eine VM angehängt, die durch dasnameFeld angegeben wird. In dieser Beispielausgabe ist der Wert fürnamegleichvm1. Fahren Sie fort , den Ausführungsstatus der VM zu prüfen. - Wenn die Ausgabe leer ist, rufen Sie die get the
sizeof theVirtualMachineDiskab.
- Wenn die Ausgabe einen Wert für
Prüfen Sie den Ausführungsstatus der VM. Wenn der Status nicht
Stoppedist, beenden Sie die VM und fahren Sie mit dem Erstellen desVirtualMachineImagefort.Rufen Sie die
sizedesVirtualMachineDiskab, um das Image zu erstellen:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \ -o jsonpath='{.spec.size}'Erstellen Sie eine Datei mit dem Namen
main.tfund dem folgenden Inhalt:provider "kubernetes" { config_path = "MANAGEMENT_API_SERVER" } resource "kubernetes_manifest" "image_import" { manifest = { "apiVersion" = "virtualmachine.gdc.goog/v1" "kind" = "VirtualMachineImageImport" "metadata" = { "name" = "VM_IMAGE_IMPORT_NAME" "namespace" = "PROJECT" } "spec" = { "source" = { "diskRef" = { "name" = "DISK_NAME" } } "imageMetadata" = { "name" = "IMAGE_NAME" "operatingSystem" = "OS_NAME" "minimumDiskSize" = "MINIMUM_DISK_SIZE" } } } }Wenden Sie das
VirtualMachineImageImport-Objekt mit Terraform an:terraform applyPrüfen Sie, ob der Image-Import abgeschlossen ist und der Status
Readylautet:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachineimageimports.virtualmachine.gdc.goog VM_IMAGE_IMPORT_NAME \ -o jsonpath='{.status}'Wenn der Import abgeschlossen ist, sollte der Status so aussehen:
{ "conditions": [ { "lastTransitionTime": "", "message": "", "observedGeneration": 1, "reason": "ImportJobComplete", "status": "True", "type": "Ready" } ], "imageName": IMAGE_NAME }Prüfen Sie, ob das Image erstellt wurde:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ get virtualmachineimages.virtualmachine.gdc.goog \ CREATED_IMAGE_NAMEErsetzen Sie die Variablen anhand der folgenden Definitionen.
Variable Definition MANAGEMENT_API_SERVERDie kubeconfig-Datei des Management API-Servers. PROJECTDas GDC-Projekt, in dem das Image erstellt werden soll. DISK_NAMEDer Name des Quelllaufwerks, z. B. vm1-boot-disk.VM_IMAGE_IMPORT_NAMEDer Name des VM-Image-Imports. Der Name darf maximal 35 Zeichen lang sein. IMAGE_NAMEDer Name des erstellten Images, z. B. custom-image.OS_NAMEDer Name des Betriebssystems des Images. Er muss einer der folgenden Werte sein: ubuntu-2004,windows-2019oderrhel-8.MINIMUM_DISK_SIZEDie minimale Laufwerkgröße im VM-Image-Import, z. B. 20G:
minimumDiskSizemuss immer größer oder gleich der Größe des Quell-Bootlaufwerks sein.CREATED_IMAGE_NAMEDer Name des erstellten Images. Der Name des erstellten Images muss eindeutig sein. Sie können keinen Image-Namen verwenden, der bereits im Projekt vorhanden ist.