Startskript auf Linux-VMs verwenden

In diesem Dokument wird erläutert, wie Sie Startskripts verwenden, um eine VM-Instanz und die zugehörigen Programme in Google Distributed Cloud (GDC) mit Air Gap zu starten.

Ein Startskript ist ein Automatisierungstool, das während des VM-Startvorgangs Aufgaben ausführt. Mit Startskripts können Sie VM-Konfigurations- und Bereitstellungsaufgaben auf neuen oder vorhandenen Instanzen automatisieren. So sparen Sie Zeit und reduzieren den manuellen Konfigurationsaufwand.

Dieses Dokument richtet sich an Entwickler in Plattformadministrator- oder Anwendungsoperatorgruppen, die Startskripts für VMs in einer Distributed Cloud-Umgebung verwenden möchten. Weitere Informationen finden Sie unter Dokumentation zu Zielgruppen für GDC mit Air Gap.

Hinweis

Wenn Sie gdcloud Befehlszeilenschnittstellenbefehle 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:

  1. Melden Sie sich an und generieren Sie die kubeconfig-Datei für den Management API-Server, falls Sie noch keine haben.

  2. Ersetzen Sie in dieser Anleitung MANAGEMENT_API_SERVER durch den Pfad zur kubeconfig-Datei des Management API-Servers.

IAM-Rollen anfordern

Wenn Sie Startskripts für eine VM verwenden möchten, bitten Sie Ihren Projekt-IAM-Administrator, Ihnen die folgenden Rollen für Ihr Projekt zuzuweisen:

  • Virtual Machine Project Admin (project-vm-admin): VMs im Projekt-Namespace erstellen, ändern, auflisten und löschen.

  • Secret Admin (secret-admin): Kubernetes-Secrets im Projekt-Namespace abrufen, auflisten, erstellen, aktualisieren, löschen, patchen und beobachten. Mit dieser Rolle können Sie Secrets für Startskripts angeben. Sie benötigen diese Rolle nicht, um Startskripts im Klartext anzugeben.

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 überprüfen.

Startskript übergeben

Sie können entweder Bash- oder Nicht-Bash-Skripts als Startskripts verwenden. Fügen Sie dazu #!/bin/… am Anfang des Skripts ein, um den Skriptinterpreter anzugeben. Wenn Sie beispielsweise ein Python 3-Startskript verwenden möchten, fügen Sie #! /usr/bin/python3 am Anfang des Skripts ein.

Google Distributed Cloud (GDC) mit Air Gap führt Startskripts in der Reihenfolge aus, in der sie im Array startupScripts angezeigt werden.

Die folgende Tabelle zeigt das Skriptformat, das Sie je nach Skriptgröße verwenden müssen:

Skriptgröße Skriptformat
Skripts bis zu 2.048 Byte Klartext
Skripts mit mehr als 2.048 Byte Kubernetes-Secret

Startskript definieren

Wenn Sie ein Startskript verwenden möchten, müssen Sie das Feld startupScripts dem Feld spec der VM hinzufügen. In diesem Feld können Sie mehrere Startskripts als Klartext oder als Kubernetes-Secret angeben.

Im folgenden Beispiel werden die Startskripts als Klartext und als Kubernetes-Secret angegeben:

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  # …
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data:
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

Beachten Sie Folgendes:

  • Das Startskript wird bei jedem Start ausgeführt.
  • Das Startskript hat standardmäßig Root-Berechtigungen.
  • Im Kubernetes-Secret muss der Name von scriptSecretRef in der spec der VM mit dem Feld metadata.name übereinstimmen.
  • Geben Sie im Kubernetes-Secret den Inhalt des Startskripts an, indem Sie dem Feld data einen Schlüssel script hinzufügen.

Neue VM mit einem Startskript erstellen

Diese Anleitung gilt unabhängig davon, was Sie als Image zum Erstellen Ihrer VM verwenden. Führen Sie Folgendes aus:

  1. Führen Sie Folgendes aus, um ein Startskript als Kubernetes-Secret zu erstellen:

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      create secret generic SECRET_NAME \
      --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. Folgen Sie der Anleitung auf der Seite VM erstellen, um eine VM zu erstellen. Fügen Sie in Schritt 1 das Startskript oder die Startskripts dem spec Feld hinzu, bevor Sie den Befehl zum Erstellen einer VM ausführen.

    In diesem Beispiel wird ein Startskript sowohl mit Klartext als auch mit einem Kubernetes-Secret definiert:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      namespace: PROJECT
    spec:
      # …
      startupScripts:
      - name: CLEAR_TEXT_SCRIPT_NAME
        script: |
          #!/bin/bash
          CLEAR_TEXT_SCRIPT
      - name: SECRET_SCRIPT_NAME
        scriptSecretRef:
          name: SECRET_NAME
    

    Diese Variablen sind so definiert:

    VariableDefinition
    MANAGEMENT_API_SERVER Die kubeconfig-Datei des Management API-Servers.
    PROJECT Das Distributed Cloud-Projekt, in dem Sie die VM erstellen möchten.
    VM_NAME Der Name der VM.
    FILE_NAME Der Name der Datei, in der das Startskript gespeichert werden soll.
    STARTUP_SCRIPT_CONTENT Die Befehle, die als Teil des Startskripts ausgeführt werden sollen.
    CLEAR_TEXT_SCRIPT_NAME Der Name des Startskripts im Klartext.
    CLEAR_TEXT_SCRIPT Das von Ihnen definierte Klartextskript.
    SECRET_NAME Der Name des Kubernetes-Secrets.
    SECRET_SCRIPT_NAME Der Name des Startskripts als Kubernetes-Secret.
  3. Führen Sie die folgenden Schritte aus, um eine VM zu erstellen.

    Das folgende Beispiel zeigt, wie Sie eine VM mit Startskripts erstellen, die einen neuen Nutzer mithilfe eines Kubernetes-Secrets und Klartext hinzufügen.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      apply -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data:
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    In diesem Beispiel sind die Variablen so definiert:

    VariableDefinition
    MANAGEMENT_API_SERVER Die kubeconfig-Datei des Management API-Servers.
    PROJECT Das Distributed Cloud-Projekt, in dem Sie die VM erstellen möchten.
    VM_NAME Der Name der neuen VM.
    VM_BOOT_DISK_NAME Der Name des Bootlaufwerks der neuen VM.
    BOOT_DISK_IMAGE_NAME Der Name des Images, das für das Bootlaufwerk der neuen VM verwendet werden soll.
    BOOT_DISK_SIZE Die Größe des Bootlaufwerks, z. B. 20G.
    Dieser Wert muss immer größer oder gleich dem minimumDiskSize des Bootlaufwerk-Images sein.
    BOOT_DISK_AUTO_DELETE Entweder true oder false. Gibt an, ob das Boot Laufwerk automatisch gelöscht wird, wenn die VM-Instanz gelöscht wird.
    MACHINE_TYPE Der vordefinierte Maschinentyp für die neue VM. Führen Sie diesen Befehl aus, um einen verfügbaren Maschinentyp auszuwählen:
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

Vorhandene VM mit einem Startskript aktualisieren

Sie können auch eine vorhandene VM mit einem Startskript aktualisieren. Die VM muss heruntergefahren werden, bevor Sie die Aktualisierung durchführen.

Folgen Sie der Anleitung, um die VM-Attribute zu aktualisieren und das Feld spec mit dem Startskript zu aktualisieren, das Sie ausführen möchten.

Ausgabe eines Startskripts ansehen

  1. Folgen Sie der Anleitung, um eine Verbindung zu einer VM herzustellen.
  2. Führen Sie den folgenden Befehl in der Gast-VM aus, um die Logs des ausgeführten Startskripts abzurufen:

    sudo journalctl -u cloud-final
    

    Die Startskriptlogs beginnen mit Folgendem:

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...