Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar.

Virtuelle Maschine Auto-Balance (Experimentell)

virtual-machine-auto-balance ist ein experimentelles Add-on. Für weitere Informationen zu experimentellen Funktionen siehe Feature Labels.

Das virtual-machine-auto-balance Add-on ermöglicht SUSE Virtualization die Nutzung des Kubernetes Descheduler zur Neugewichtung von Arbeitslasten virtueller Maschinen. Der Kubernetes Descheduler optimiert die Arbeitslastplanung, indem er Pods entfernt, die nicht optimal gemäß den von den Administratoren definierten Richtlinien platziert sind. Diese entscheidende Funktion verbessert die Ressourcennutzung, balanciert die Arbeitslasten über die Knoten hinweg und steigert die Gesamtleistung des Clusters.

Aktivierung des Add-ons

Wenn aktiviert, stellt das Add-on den Descheduler im kube-system Namespace bereit und eine zugehörige Konfiguration in der kube-system/descheduler ConfigMap. Sie können das Add-on nur aktivieren, wenn der Cluster mehr als einen Knoten hat.

  1. Gehen Sie in der SUSE Virtualization Benutzeroberfläche zu Erweiterte → Add-ons.

  2. Wählen Sie descheduler (Experimentell) und dann ⋮ → Aktivieren aus.

Descheduler-Richtlinien

Die Konfiguration enthält die folgenden Plugins:

  • DefaultEvictor: Bietet eine allgemeine Konfiguration für die Entfernung auf oberster Ebene.

  • LowNodeUtilization: Überwacht die Ressourcennutzung der Knoten und entfernt Pods von überlasteten Knoten zu unterausgelasteten Knoten basierend auf definierten Schwellenwerten.

Mit der Standardkonfiguration entfernt der Descheduler nur Pods virtueller Maschinen.

Anpassung der Descheduler-Richtlinien

Wählen Sie ⋮ → YAML bearbeiten, um die Descheduler-Richtlinien gemäß Ihren Anforderungen anzupassen. Die Konfiguration ist im YAML-Format definiert.

  - apiVersion: harvesterhci.io/v1beta1
    kind: Addon
    metadata:
      name: descheduler
      namespace: kube-system
      labels:
        addon.harvesterhci.io/displayName: "virtual-machine-auto-balance"
        addon.harvesterhci.io/experimental: "true"
    spec:
      repo: http://harvester-cluster-repo.cattle-system.svc/charts
      version: << .DESCHEDULER_CHART_VERSION >>
      chart: descheduler
      {{- if and .Addons .Addons.descheduler }}
      enabled: {{ .Addons.descheduler.Enabled }}
      {{- else }}
      enabled: false
      {{- end }}
      valuesContent: |
        kind: Deployment
        image:
          repository: registry.k8s.io/descheduler/descheduler
          pullPolicy: IfNotPresent
        deschedulingInterval: 5m
        replicas: 1
        cmdOptions:
          v: 3
          feature-gates: EvictionsInBackground=true
        deschedulerPolicy:
          maxNoOfPodsToEvictPerNode: 5
          profiles:
          - name: default
            pluginConfig:
            - name: DefaultEvictor
              args:
                nodeFit: true
                ignorePvcPods: false
                evictLocalStoragePods: true
                labelSelector:
                  matchExpressions:
                    - key: "kubevirt.io"
                      operator: "In"
                      values:
                        - "virt-launcher"
            - name: LowNodeUtilization
              args:
                evictableNamespaces:
                  exclude:
                  - cattle-dashboards
                  - cattle-fleet-clusters-system
                  - cattle-fleet-local-system
                  - cattle-fleet-system
                  - cattle-logging-system
                  - cattle-monitoring-system
                  - cattle-provisioning-capi-system
                  - cattle-system
                  - fleet-local
                  - harvester-system
                  - kube-system
                  - local
                  - longhorn-system
                thresholds:
                  cpu: 30
                  memory: 30
                targetThresholds:
                  cpu: 50
                  memory: 50
            plugins:
              balance:
                enabled:
                - LowNodeUtilization
  • deschedulingInterval: Wie oft der Descheduler ausgeführt wird. Der Standardwert ist 5m (5 Minuten).

  • maxNoOfPodsToEvictPerNode: Maximale Anzahl von Pods, die während eines einzelnen Descheduling-Zyklus entfernt werden können. Der Standardwert ist 5.

  • evictableNamespaces.exclude: Namespaces, die von der Evakuierung ausgeschlossen werden sollen. Standardmäßig sind die System-Namespaces ausgeschlossen, um kritische Systemkomponenten zu schützen.

  • targetThresholds: Obere Auslastungsgrenze für überwachte Ressourcen. Knoten, deren Nutzung diesen Schwellenwert überschreitet, werden als überlastet markiert, was die Evakuierung von Pods auslöst, um ihre Last zu reduzieren. Standardwerte werden automatisch für CPU (50) und Speicher (50) angewendet, aber Sie können Werte für andere überwachte Ressourcen definieren.

  • thresholds: Untere Auslastungsgrenze für überwachte Ressourcen. Pods, die von überlasteten Knoten entfernt wurden, werden nur auf Knoten neu geplant, deren Nutzung derzeit unter diesem Schwellenwert liegt. Standardwerte werden automatisch für CPU (30) und Speicher (30) angewendet, aber Sie können Werte für andere überwachte Ressourcen definieren.

Deaktivierung des Add-ons

  1. Gehen Sie in der SUSE Virtualization Benutzeroberfläche zu Erweiterte → Add-ons.

  2. Wählen Sie descheduler (Experimentell) und dann ⋮ → Deaktivieren aus.

Knotennutzung

Überprüfen Sie die Descheduler-Protokolle für Informationen zur Knotennutzung.

> kubectl logs -n kube-system -l app.kubernetes.io/name=descheduler -f
I1209 02:06:21.067225       1 lownodeutilization.go:210] "Node has been classified" category="underutilized" node="hp-131-tink-system" usage={"cpu":"4583m","memory":"3075Mi","pods":"25"} usagePercentage={"cpu":20,"memory":2,"pods":13}
I1209 02:06:21.067328       1 lownodeutilization.go:210] "Node has been classified" category="underutilized" node="hp-121-tink-system" usage={"cpu":"5198m","memory":"4023Mi","pods":"30"} usagePercentage={"cpu":23,"memory":3,"pods":15}
I1209 02:06:21.067355       1 lownodeutilization.go:210] "Node has been classified" category="overutilized" node="hp-119-tink-system" usage={"cpu":"10490m","memory":"109333705514","pods":"81"} usagePercentage={"cpu":46,"memory":81,"pods":41}

Fehlerbehebung

Der Descheduler arbeitet mit Pods anstelle von virtuellen Maschinen. Wenn eine virtuelle Maschine, von der Sie erwarten, dass sie entfernt wird, dies nicht tut, überprüfen Sie die Descheduler-Protokolle.

Beispiel:

> kubectl logs -n kube-system -l app.kubernetes.io/name=descheduler -f
I1209 02:06:21.068059       1 defaultevictor.go:228] "pod does not fit on any other node because of nodeSelector(s), Taint(s), or nodes marked as unschedulable" pod="default/virt-launcher-vm-3-w866s"

In diesem Beispiel wurde die virtuelle Maschine manuell migriert, sodass die zugehörige Pod-Spezifikation einen restriktiven Knotenauswähler enthält. Der Descheduler kann diesen Pod nicht evakuieren, da der Knotenauswähler verhindern würde, dass der Pod erfolgreich auf einem anderen verfügbaren Knoten im Cluster ausgeführt wird.