Ressourcenverfügbarkeit mithilfe von VM-Reservierungen sicherstellen

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 ein Feature von 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. Eine Reservierung für eine VM verursacht folgende Kosten: ab dem Erstellen und bis zum Löschen der Reservierung. Aber während die Sie nutzen, entsprechen die Gesamtkosten denen einer VM ohne Reservierung.

Reservierungen sind in der Regel nützlich, wenn die Verfügbarkeit von Kapazitäten 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 gerade 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 zu priorisieren, einen Job explizit daran hindern, Reservierungen zu nutzen.

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

Hinweise

  1. Wenn Sie Batch zum ersten Mal verwenden, lesen Sie Erste Schritte mit Batch und aktivieren Sie Batch, indem Sie den Voraussetzungen für Projekte und Nutzer.
  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.

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 im Allgemeinen eine Reservierung nutzen können, müssen folgende Bedingungen erfüllt sein:

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

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

  • Damit jede VM eines Jobs erfolgreich eine Reservierung nutzt, muss die Reservierung während der VM-Laufzeit

    Die ungenutzte Kapazität einer Reservierung ist die Differenz zwischen VM-Anzahl und die Anzahl der VMs, die sie derzeit nutzen. VMs versuchen, Reservierungen zu nutzen, wenn Sie nicht verwendete Reservierungskapazität haben. Eine VM kann also einen Reservierung, wenn die VM erstellt wird, oder später in ihrer Laufzeit. Eine VM nicht die Nutzung einer Reservierung beenden, bis die VM nicht mehr ausgeführt wird oder die Reservierung gelöscht.

    Abhängig von Ihrer gesamten ungenutzten Reservierungskapazität, kann keine, einige oder alle Die VMs des Jobs können Reservierungen nutzen und die Anzahl der reservierten VMs während der Joblaufzeit variieren.

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

  1. Konfiguration planen Schließen Sie Ihren Auftrag und Ihre Reservierung ab, um sicherzustellen, dass sie kompatibel sind. führen Sie die folgenden Schritte aus.

    Wenn Sie eine vorhandene Reservierung nutzen möchten, müssen Sie eine mit einer entsprechenden Konfiguration. Wenn Sie vorhaben, eine neue Reservierung die gewünschten Konfigurationsoptionen aus.

    1. Ermitteln Sie die Reservierungseigenschaften. Aufgrund der Einschränkungen Der Freigabetyp muss single-project sein. Dies ist die Standardeinstellung. Option für eine Reservierung. Legen Sie die Werte für die folgenden Reservierungseigenschaften fest:

      • Verbrauchstyp*
      • VM-Anzahl

      * Die Verbrauchstyp (spezifisch ausgerichtet oder automatisch genutzt) bestimmt, welche VMs die Reservierung nutzen können.

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

    2. Bestimmen Sie die VM-Attribute für den Job und die Reservierung. 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 fest, die Sie für Folgendes verwenden möchten: VM-Attribute, die exakt übereinstimmen müssen für die Reservierung und den Job:

      • Projekt
      • Zone*
      • Maschinentyp
      • Mindest-CPU-Plattform (falls zutreffend)
      • GPU-Typ und -Anzahl (falls vorhanden)
      • Typ und Anzahl lokaler 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 in der allowedLocations[] oder, wenn Sie den Parameter Feld allowedLocations[], Standort des Jobs festlegen in die Region ein, 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.

      #Die Reservierung Verbrauchstyp bestimmt die für die VMs des Jobs erforderliche Reservierungsaffinität, die müssen Sie im Job wie folgt angeben:

  2. Reservierung vorbereiten Falls noch nicht geschehen, Reservierung erstellen die die VMs des Jobs nutzen sollen. Achten Sie darauf, dass die Reservierung die die Sie geplant haben.

  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, unter Angabe der instances[]-Unterfelder, die Sie in der vorherigen Schritten.

      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 den accelerators[].

      4. Umfasst die Reservierung lokale SSDs?

        • Ja: Ersetzen Sie LOCAL_SSD_SIZE und LOCAL_SSD_NAME, um der Reservierung zu entsprechen, und stellen Sie die lokalen SSDs bereit, indem Sie Feld volumes[] für den Job. Sehen Sie sich hierzu das Codebeispiel für mit lokalen SSDs.

        • Nein: Entfernen Sie das Feld disks[].

      5. Wird für die Reservierung der speziell angestrebte Nutzungstyp 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. Darüber hinaus haben Sie keine VM-Instanzvorlage angeben möchten. In diesem Fall müssen Sie VM_RESOURCES ersetzen durch den folgenden Wert:

      "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: der Standort des Jobs. Sofern der Job nicht die allowedLocations[], das muss die Region sein die die Zone der Reservierung enthält.

      • JSON_CONFIGURATION_FILE: Pfad für ein JSON-Objekt mit den Konfigurationsdetails des Jobs.

    API

    Stellen Sie eine POST-Anfrage an den Methode jobs.create mit dem die Unterfelder der VM-Instanzressource (instances[]) um genau mit den VM-Attributen einer Reservierung abzugleichen.

    Um beispielsweise einen einfachen Skriptjob zu erstellen, der VMs aus einem Reservierung erforderlich ist, 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. Beispiel: finden Sie im Codebeispiel für Mit einer VM-Instanzvorlage Wenn die Reservierung GPUs oder lokale SSDs verwendet, müssen Sie außerdem das Feld installGpuDrivers des Jobs konfigurieren und volumes[]. 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 hierzu das Codebeispiel für mit GPUs.

        • 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, um der Reservierung zu entsprechen, und stellen Sie die lokalen SSDs bereit, indem Sie Feld volumes[] für den Job. Sehen Sie sich hierzu das Codebeispiel für mit lokalen SSDs.

        • Nein: Entfernen Sie das Feld disks[].

      5. Wird für die Reservierung der speziell angestrebte Nutzungstyp verwendet?

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

        • Nein: Entfernen Sie das Feld reservation.

      Angenommen, Sie verwenden ein automatisch verbrauchtes Reservierung für n2-standard-32 VMs, die keine angibt Mindest-CPU-Plattform, GPUs oder lokale SSDs. 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 nutzen kann

Wenn Sie verhindern möchten, dass ein Job Reservierungen nutzt, setzen Sie das Feld reservation auf NO_RESERVATION. Weitere Informationen zum Verhindern von Reservierungen konsumieren, siehe VMs ohne Nutzung von Reservierungen erstellen in der Compute Engine-Dokumentation.

Sie können einen Job, der keine reservierten VMs verbrauchen kann, mit der Methode gcloud CLI oder Batch API verwenden.

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 zum Erstellen und Ausführen des Jobs die Methode gcloud batch jobs submit-Befehl:

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

    Ersetzen Sie Folgendes:

    • JOB_NAME: Der Name des Jobs.

    • LOCATION: der Standort des Jobs.

    • 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: der Standort des Jobs.

  • JOB_NAME: der Name des Jobs.

Nächste Schritte