Mit VM-Reservierungen für die Ressourcenverfügbarkeit sorgen

In diesem Dokument wird beschrieben, wie Sie Jobs erstellen, die auf reservierten Ressourcen ausgeführt werden, und wie Sie verhindern, dass Jobs Reservierungen verbrauchen.

Reservierungen sind eine Funktion der Compute Engine. Eine Reservierung bietet ein sehr hohes Maß an Sicherheit beim Beschaffen von Kapazitäten für eine oder mehrere VMs mit der angegebenen Hardwarekonfiguration. Für eine Reservierung einer VM fallen die Kosten für diese VM vom Erstellen bis zum Löschen der Reservierung an. Während Sie diese VM nutzen, entsprechen die Gesamtkosten jedoch denen einer VM ohne Reservierung.

Reservierungen sind in der Regel nützlich, wenn die Kapazitätsverfügbarkeit entscheidend ist oder um Fehler beim Abrufen von Ressourcen zu vermeiden. Für Batch-Jobs sollten Sie spezielle Reservierungen verwenden, um die Zeit für die Jobplanung zu minimieren. Sie können auch versuchen, vorhandene Reservierungen zu verwenden, wenn sie nicht genutzt werden. Wenn Sie nicht ausreichend genutzte Reservierungen haben, z. B. Reservierungen, die für Rabatte für die zugesicherte Nutzung erforderlich sind, können Sie Jobs so konfigurieren, dass sie versucht werden, zu verwenden, wenn sie nicht genutzt werden, um Ihre angefallenen Kosten zu optimieren. Wenn Sie die Ressourcenverfügbarkeit für andere Arbeitslasten in Ihrem Projekt priorisieren möchten, können Sie einen Job explizit daran hindern, Reservierungen zu verbrauchen.

Weitere Informationen zu Reservierungen finden Sie in der Compute Engine-Dokumentation zu Reservierungen.

Hinweise

  1. Wenn Sie Batch noch nicht verwendet haben, lesen Sie den Hilfeartikel Batch-Dateien erstellen und ausführen und aktivieren Sie Batch, indem Sie die Voraussetzungen für Projekte und Nutzer erfüllen.
  2. Sie benötigen die Berechtigungen, um eine Reservierung zu erstellen oder eine vorhandene Reservierung aufzurufen, die die VMs eines Jobs bei Bedarf nutzen sollen.
  3. Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen eines Jobs benötigen:

    Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

    Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Beschränkungen

Zusätzlich zu den allgemeinen Einschränkungen für Reservierungen gelten für Batch-Reservierungen auch die folgenden Einschränkungen:

  • Die VMs eines Jobs können keine freigegebenen Reservierungen nutzen.
  • Die VMs eines Jobs können keine Reservierungen nutzen, wenn für den Job oder die Reservierung eine Richtlinie für kompakte Platzierung angegeben ist.
  • Wenn Sie einen Job mit der Google Cloud Console erstellen, werden die zugehörigen Reservierungen automatisch von den VMs in Anspruch genommen. Wenn Sie eine bestimmte Reservierung nutzen oder verhindern möchten, dass VMs Reservierungen nutzen, müssen Sie das Feld reservation beim Erstellen eines Jobs mit der gcloud CLI oder der Batch API definieren.

Voraussetzungen

In diesem Abschnitt werden die Anforderungen zusammengefasst, die die VMs eines Jobs erfüllen müssen, um eine Reservierung zu nutzen. Weitere Informationen zu allen Anforderungen finden Sie in der Compute Engine-Dokumentation unter Allgemeine Anforderungen an Reservierungen und weiter unten in diesem Dokument unter Vorgehensweise zur Planung der Konfiguration.

  • Damit die VMs eines Jobs grundsätzlich eine Reservierung nutzen können, müssen alle folgenden Bedingungen erfüllt sein:

    • Für den Job und die Reservierung müssen VM-Attribute angegeben werden, die genau übereinstimmen.

    • Sie müssen alle Einschränkungen in diesem Dokument und alle anderen allgemeinen Anforderungen für Reservierungen einhalten.

  • Damit jede VM eines Jobs eine Reservierung nutzen kann, muss während der Laufzeit der VM nicht verwendete Kapazität in der Reservierung verfügbar sein.

    Die nicht verwendete Kapazität einer Reservierung ist die Differenz zwischen der VM-Anzahl und der Anzahl der VMs, die sie derzeit nutzen. VMs versuchen, Reservierungen zu nutzen, wenn Sie nicht verwendete Reservierungskapazität haben. So kann eine VM eine Reservierung bereits beim Erstellen oder später während der Laufzeit nutzen. Eine VM nutzt eine Reservierung so lange, bis sie beendet wird oder die Reservierung gelöscht wird.

    Je nach Ihrer gesamten nicht genutzten Reservierungskapazität können keine, einige oder alle VMs eines Jobs Reservierungen nutzen. Die Anzahl der reservierten VMs kann während der Laufzeit des Jobs variieren.

Job erstellen und ausführen, der reservierte VMs verbrauchen kann

  1. Planen Sie Ihre Konfiguration. Führen Sie die folgenden Schritte aus, um sicherzustellen, dass Ihr Job und Ihre Reservierung kompatibel sind.

    Wenn Sie eine bereits vorhandene Reservierung nutzen möchten, müssen Sie einen Job mit einer entsprechenden Konfiguration erstellen. Wenn Sie eine neue Reservierung erstellen möchten, wählen Sie die gewünschten Konfigurationsoptionen aus.

    1. Ermitteln Sie die Reservierungseigenschaften. Aufgrund der Einschränkungen muss der Freigabetyp Einzelprojekt sein. Dies ist die Standardoption für eine Reservierung. Legen Sie die Werte fest, die Sie für die folgenden Reservierungseigenschaften verwenden möchten:

      • Verbrauchstyp*
      • VM-Anzahl

      *Der Verbrauchstyp der Reservierung (spezifisch ausgewählt oder automatisch genutzt) bestimmt, welche VMs die Reservierung nutzen können.

      Die VM-Anzahl entspricht der Gesamtkapazität einer Reservierung. Berücksichtigen Sie bei der Festlegung dieses Werts die Anzahl der VMs des Jobs.

    2. Legen Sie die VM-Attribute für den Job und die Reservierung fest. Aufgrund der Einschränkungen kann weder für den Job noch für die Reservierung eine Richtlinie für kompakte Platzierung angegeben werden. Dies ist die Standardoption für Reservierungen und Jobs. Legen Sie die Werte für die folgenden VM-Eigenschaften fest, die genau mit der Reservierung und dem Job übereinstimmen müssen:

      • Projekt
      • Zone*
      • Maschinentyp
      • Mindest-CPU-Plattform (falls zutreffend)
      • GPU-Typ und ‑Anzahl (falls vorhanden)
      • Typ und Anzahl der lokalen SSDs (falls vorhanden)
      • Reservierungsaffinität#

      *Die Job-VMs müssen sich in derselben Zone wie die reservierten VMs befinden. Sie müssen diese Zone entweder im Feld allowedLocations[] des Jobs angeben oder, wenn Sie das Feld allowedLocations[] weglassen, den Standort des Jobs auf die Region festlegen, die diese Zone enthält.

      Der Job muss alle diese Eigenschaften entweder mit den Unterfeldern policy oder mit einer VM-Instanzvorlage definieren. Für einen Job kann keine Kombination aus policy-Unterfeldern und einer Vorlage angegeben werden.

      Ein optionales Feld kann nicht für eine Ressource definiert und bei der anderen ausgelassen werden. Definieren oder lassen Sie das optionale Feld sowohl für die Reservierung als auch für den Job aus. Wenn für den Job eine VM-Instanzvorlage angegeben ist, gilt dies auch für die Felder der angegebenen Vorlage.

      #Der Nutzungstyp der Reservierung bestimmt die Reservierungsaffinität, die für die VMs des Jobs erforderlich ist. Sie müssen sie im Job so angeben:

  2. Reservierung vorbereiten Erstellen Sie die Reservierung, die die VMs des Jobs nutzen sollen, falls Sie dies noch nicht getan haben. Prüfen Sie, ob die Reservierung die von Ihnen geplanten Unterkünfte enthält.

  3. Erstellen und ausführen Sie den Job. Mit der gcloud CLI oder der Batch API können Sie einen Job erstellen und ausführen, der VMs aus der vorbereiteten Reservierung nutzt:

    gcloud

    1. Erstellen Sie eine JSON-Datei mit den Konfigurationsdetails des Jobs, in der die Unterfelder der Ressource „VM-Instanz“ (instances[]) so festgelegt sind, dass sie genau mit den VM-Attributen einer Reservierung übereinstimmen.

      Wenn Sie beispielsweise einen einfachen Script-Job erstellen möchten, der VMs aus einer Reservierung nutzt, erstellen Sie eine JSON-Datei mit folgendem Inhalt:

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      Ersetzen Sie VM_RESOURCES durch die VM-Ressourcen, die der Reservierung entsprechen, die der Job nutzen soll. Geben Sie dazu die instances[]-Unterfelder an, die Sie in den vorherigen Schritten geplant haben.

      Beginnen Sie beispielsweise mit dem folgenden Wert für VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }
      

      Nehmen Sie folgende Änderungen vor, um diesen Wert zu verwenden:

      1. Möchten Sie eine Instanzvorlage verwenden?

        • Ja:Ersetzen Sie das Feld policy durch das Feld instanceTemplate und geben Sie eine vorhandene VM-Instanzvorlage an, die der Reservierung entspricht. Sehen Sie sich beispielsweise das Beispiel für die Verwendung einer VM-Instanzvorlage an. Wenn für die Reservierung GPUs oder lokale SSDs verwendet werden, müssen Sie außerdem das Feld installGpuDrivers und das Feld volumes[] des Jobs konfigurieren. Andernfalls überspringen Sie die restlichen Änderungen.

        • Nein:Ersetzen Sie MACHINE_TYPE durch denselben Maschinentyp wie in der Reservierung.

      2. Enthält die Reservierung eine Mindest-CPU-Plattform?

        • Ja:Ersetzen Sie MIN_CPU_PLATFORM durch dieselbe Mindest-CPU-Plattform.

        • Nein:Entfernen Sie das Feld minCpuPlatform.

      3. Enthält die Reservierung GPUs?

        • Ja:Ersetzen Sie INSTALL_GPU_DRIVERS, GPU_TYPE und GPU_COUNT so, dass sie der Reservierung entsprechen. Sehen Sie sich beispielsweise das Codebeispiel zur Verwendung von GPUs an.

        • Nein:Entfernen Sie das Feld installGpuDrivers und das Feld accelerators[].

      4. Enthält die Reservierung lokale SSDs?

        • Ja:Ersetzen Sie LOCAL_SSD_SIZE und LOCAL_SSD_NAME so, dass sie der Reservierung entsprechen, und binden Sie die lokalen SSDs an, indem Sie dem Job das Feld volumes[] hinzufügen. Sehen Sie sich beispielsweise das Codebeispiel für die Verwendung lokaler SSDs an.

        • Nein:Entfernen Sie das Feld disks[].

      5. Wird für die Reservierung der spezifisch ausgewählte Verbrauchstyp verwendet?

        • Ja:Ersetzen Sie SPECIFIC_RESERVATION_NAME durch den Namen der Reservierung.

        • Nein:Entfernen Sie das Feld reservation.

      Angenommen, Sie verwenden eine automatisch in Anspruch genommene Reservierung für n2-standard-32 VMs, für die keine Mindest-CPU-Plattform, GPUs oder lokalen SSDs angegeben sind. Außerdem sollten Sie keine VM-Instanzvorlage angeben. In diesem Fall müssen Sie VM_RESOURCES durch den folgenden Wert ersetzen:

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. Verwenden Sie den Befehl gcloud batch jobs submit, um den Job zu erstellen und auszuführen:

      gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
      

      Ersetzen Sie Folgendes:

      • JOB_NAME: Der Name des Jobs.

      • LOCATION: den Standort der Stelle. Sofern im Job nicht das Feld allowedLocations[] angegeben ist, muss dies die Region sein, die die Zone der Reservierung enthält.

      • JSON_CONFIGURATION_FILE: der Pfad zu einer JSON-Datei mit den Konfigurationsdetails des Jobs.

    API

    Stellen Sie eine POST-Anfrage an die jobs.create-Methode, bei der die Unterfelder der VM-Instanzressource (instances[]) genau mit den VM-Attributen einer Reservierung übereinstimmen.

    Wenn Sie beispielsweise einen einfachen Script-Job erstellen möchten, der VMs aus einer Reservierung nutzt, stellen Sie die folgende Anfrage:

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: die Projekt-ID Ihres Projekts.

    • LOCATION: den Standort der Stelle. Sofern im Job nicht das Feld allowedLocations[] angegeben ist, muss dies die Region sein, die die Zone der Reservierung enthält.

    • JOB_NAME: Der Name des Jobs.

    • VM_RESOURCES: die VM-Ressourcen, die mit der Reservierung übereinstimmen, die der Job nutzen soll. Geben Sie dazu die instances[]-Unterfelder an, die Sie in den vorherigen Schritten geplant haben.

      Beginnen Sie beispielsweise mit dem folgenden Wert für VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }

      Nehmen Sie folgende Änderungen vor, um diesen Wert zu verwenden:

      1. Möchten Sie eine Instanzvorlage verwenden?

        • Ja:Ersetzen Sie das Feld policy durch das Feld instanceTemplate und geben Sie eine vorhandene VM-Instanzvorlage an, die der Reservierung entspricht. Sehen Sie sich beispielsweise das Beispiel für die Verwendung einer VM-Instanzvorlage an. Wenn für die Reservierung GPUs oder lokale SSDs verwendet werden, müssen Sie außerdem das Feld installGpuDrivers und das Feld volumes[] des Jobs konfigurieren. Andernfalls überspringen Sie die restlichen Änderungen.

        • Nein:Ersetzen Sie MACHINE_TYPE durch denselben Maschinentyp wie in der Reservierung.

      2. Enthält die Reservierung eine Mindest-CPU-Plattform?

        • Ja:Ersetzen Sie MIN_CPU_PLATFORM durch dieselbe Mindest-CPU-Plattform.

        • Nein:Entfernen Sie das Feld minCpuPlatform.

      3. Enthält die Reservierung GPUs?

        • Ja:Ersetzen Sie INSTALL_GPU_DRIVERS, GPU_TYPE und GPU_COUNT so, dass sie der Reservierung entsprechen. Sehen Sie sich beispielsweise das Codebeispiel zur Verwendung von GPUs an.

        • Nein:Entfernen Sie das Feld installGpuDrivers und das Feld accelerators[].

      4. Enthält die Reservierung lokale SSDs?

        • Ja:Ersetzen Sie LOCAL_SSD_SIZE und LOCAL_SSD_NAME so, dass sie der Reservierung entsprechen, und binden Sie die lokalen SSDs an, indem Sie dem Job das Feld volumes[] hinzufügen. Sehen Sie sich beispielsweise das Codebeispiel für die Verwendung lokaler SSDs an.

        • Nein:Entfernen Sie das Feld disks[].

      5. Wird für die Reservierung der spezifisch ausgewählte Verbrauchstyp verwendet?

        • Ja:Ersetzen Sie SPECIFIC_RESERVATION_NAME durch den Namen der Reservierung.

        • Nein:Entfernen Sie das Feld reservation.

      Angenommen, Sie verwenden eine automatisch in Anspruch genommene Reservierung für n2-standard-32 VMs, für die keine Mindest-CPU-Plattform, GPUs oder lokalen SSDs angegeben sind. Außerdem sollten Sie keine VM-Instanzvorlage angeben. In diesem Fall müssen Sie VM_RESOURCES durch den folgenden Wert ersetzen:

      "policy": {
        "machineType": "n2-standard-32"
      }

Job erstellen und ausführen, der keine reservierten VMs verbrauchen kann

Wenn Sie verhindern möchten, dass ein Job Reservierungen nutzt, setzen Sie das Feld reservation auf NO_RESERVATION. Weitere Informationen zum Verhindern des Verbrauchs von Reservierungen finden Sie in der Compute Engine-Dokumentation unter VMs erstellen, ohne Reservierungen zu verbrauchen.

Mit der gcloud CLI oder der Batch API können Sie einen Job erstellen und ausführen, der keine reservierten VMs belegen kann.

gcloud

  1. Erstellen Sie eine JSON-Datei, in der die Konfigurationsdetails des Jobs angegeben und das Feld reservation auf NO_RESERVATION festgelegt ist.

    Wenn Sie beispielsweise einen einfachen Script-Job erstellen möchten, der keine Reservierungen aufnimmt, erstellen Sie eine JSON-Datei mit folgendem Inhalt:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. Verwenden Sie den Befehl gcloud batch jobs submit, um den Job zu erstellen und auszuführen:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Ersetzen Sie Folgendes:

    • JOB_NAME: Der Name des Jobs.

    • LOCATION: den Standort der Stelle.

    • JSON_CONFIGURATION_FILE: der Pfad zu einer JSON-Datei mit den Konfigurationsdetails des Jobs.

API

Stellen Sie eine POST-Anfrage an die Methode jobs.create, die das Feld reservation auf NO_RESERVATION festlegt.

Wenn Sie beispielsweise einen einfachen Script-Job erstellen möchten, der keine Reservierungen nutzen kann, stellen Sie die folgende Anfrage:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID Ihres Projekts.

  • LOCATION: den Standort der Stelle.

  • JOB_NAME: Der Name des Jobs.

Nächste Schritte