Automatische Bereitstellung von GKE-Knoten wird mit den definierten Grenzwerten nicht hochskaliert

Automatische Bereitstellung von GKE-Knoten wird mit den definierten Grenzwerten nicht hochskaliert

Ich möchte die automatische Bereitstellung von GKE-Knoten verwenden, um bei Bedarf einen Knotenpool mit GPU zu erstellen (das heißt, wenn ich einen Job starte, der GPU-Ressourcen benötigt).

Gemäß dem GCP-Tutorial habe ich einen Cluster mit aktivierten cluster autoscalingund eingerichtet node auto-provisioning. NAP hat Grenzwerte für CPU, Speicher und GPU festgelegt:

resourceLimits:
  - maximum: '15'
    minimum: '1'
    resourceType: cpu
  - maximum: '150'
    minimum: '1'
    resourceType: memory
  - maximum: '2'
    resourceType: nvidia-tesla-k80

Ich weiß, dass NAP funktioniert, weil es bei mir bereits einige Knoten hochgefahren hat, aber alle davon waren „normale“ (ohne GPU).

Nun muss NAP „gezwungen“ werden, einen Knotenpool mit einer GPU-Maschine zu erstellen. Davor existiert im Cluster kein GPU-Knoten. Dazu erstelle ich einen Job mit einer solchen Konfigurationsdatei:

apiVersion: batch/v1
kind: Job
metadata:
  name: training-job
spec:
  ttlSecondsAfterFinished: 100
  template:
    metadata:
      name: training-job
    spec:
      nodeSelector:
        gpu: "true"
        cloud.google.com/gke-spot: "true"
        cloud.google.com/gke-accelerator: nvidia-tesla-k80
      tolerations:
        - key: cloud.google.com/gke-spot
          operator: Equal
          value: "true"
          effect: NoSchedule
      containers:
        - name: gpu-test
          image: przomys/gpu-test
          resources:
            requests:
              cpu: 500m
            limits:
              nvidia.com/gpu: 2 # requesting 2 GPU
      restartPolicy: Never # Do not restart containers after they exit

Der Job wird erstellt, dann aber als „Nicht planbar“ markiert und das CA-Protokoll gibt mir folgenden Fehler aus:

{
  "noDecisionStatus": {
    "measureTime": "1650370630",
    "noScaleUp": {
      "unhandledPodGroups": [
        {
          "rejectedMigs": [
            {
              "reason": {
                "messageId": "no.scale.up.mig.failing.predicate",
                "parameters": [
                  "NodeAffinity",
                  "node(s) didn't match Pod's node affinity/selector"
                ]
              },
              "mig": {
                "zone": "us-central1-c",
                "nodepool": "pool-3",
                "name": "gke-cluster-activeid-pool-3-af526144-grp"
              }
            },
            {
              "mig": {
                "name": "gke-cluster-activeid-nap-e2-standard--c7a4d4f1-grp",
                "zone": "us-central1-c",
                "nodepool": "nap-e2-standard-2-w52e84k8"
              },
              "reason": {
                "parameters": [
                  "NodeAffinity",
                  "node(s) didn't match Pod's node affinity/selector"
                ],
                "messageId": "no.scale.up.mig.failing.predicate"
              }
            }
          ],
          "napFailureReasons": [
            {
              "parameters": [
                "Any GPU."
              ],
              "messageId": "no.scale.up.nap.pod.gpu.no.limit.defined"
            }
          ],
          "podGroup": {
            "totalPodCount": 1,
            "samplePod": {
              "controller": {
                "apiVersion": "batch/v1",
                "kind": "Job",
                "name": "training-job"
              },
              "namespace": "default",
              "name": "training-job-7k8zd"
            }
          }
        }
      ],
      "unhandledPodGroupsTotalCount": 1
    }
  }
}

Ich vermute, dasskein.Scale.up.nap.pod.gpu.kein.Limit.definiertist der wichtigste Teil.GCP-Lernprogrammweist michHier. Aber ich habe diese Grenze definiert, daher gehen mir die Ideen aus ...

Vielleicht hat jemand eine Idee, was ich falsch mache?

verwandte Informationen