Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado.

Balanceo Automático de Máquinas Virtuales (Experimental)

balanceo-automático-de-máquinas-virtuales es un complemento experimental. Para más información sobre características experimentales, consulta Etiquetas de Características.

El complemento balanceo-automático-de-máquinas-virtuales permite a SUSE Virtualization utilizar el Descheduler de Kubernetes para el reequilibrio de las cargas de trabajo de las máquinas virtuales. El Descheduler de Kubernetes optimiza la programación de cargas de trabajo desalojando pods que no están colocados de manera óptima según las políticas definidas por el administrador. Esta función crucial mejora la utilización de recursos, equilibra las cargas de trabajo entre nodos y mejora el rendimiento general del clúster.

Habilitando el complemento

Cuando se habilita, el complemento despliega el Descheduler en el espacio de nombres kube-system y una configuración relacionada en el ConfigMap kube-system/descheduler. Solo puedes habilitar el complemento cuando el clúster tiene más de un nodo.

  1. En la interfaz de usuario SUSE Virtualization, ve a Complementos Avanzados →.

  2. Selecciona descheduler (Experimental), y luego selecciona ⋮ → Habilitar.

Políticas del Descheduler

La configuración contiene los siguientes complementos:

  • DefaultEvictor: Proporciona una configuración común de desalojo a nivel superior.

  • LowNodeUtilization: Monitorea el uso de recursos de los nodos y desaloja pods de nodos sobreutilizados a nodos infrautilizados según los umbrales definidos.

Con la configuración predeterminada, el Descheduler solo desaloja pods de máquinas virtuales.

Personalizando las políticas del Descheduler

Selecciona ⋮ → Editar YAML para personalizar las políticas del Descheduler según tus requisitos. La configuración se define en formato YAML.

  - 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: Con qué frecuencia se ejecuta el Descheduler. El valor por defecto es 5m (5 minutos).

  • maxNoOfPodsToEvictPerNode: Número máximo de pods que pueden ser desalojados durante un único ciclo de desprogramación. El valor por defecto es 5.

  • evictableNamespaces.exclude: Espacios de nombres que se deben excluir del desalojo. Por defecto, los espacios de nombres del sistema están excluidos para proteger componentes críticos del sistema.

  • targetThresholds: Límite superior de utilización para los recursos monitorizados. Los nodos cuya utilización exceda este umbral se marcan como sobreutilizados, lo que desencadena el desalojo de pods para reducir su carga. Los valores por defecto se aplican automáticamente para CPU (50) y memoria (50), pero puedes definir valores para otros recursos monitorizados.

  • thresholds: Límite inferior de utilización para los recursos monitorizados. Los pods desalojados de nodos sobreutilizados se reprograman solo en nodos cuya utilización esté actualmente por debajo de este umbral. Los valores por defecto se aplican automáticamente para CPU (30) y memoria (30), pero puedes definir valores para otros recursos monitorizados.

Deshabilitando el complemento

  1. En la interfaz de usuario SUSE Virtualization, ve a Complementos Avanzados →.

  2. Selecciona descheduler (Experimental), y luego selecciona ⋮ → Deshabilitar.

Uso del nodo

Consulta los registros del Descheduler para obtener información sobre el uso del nodo.

> 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}

Solución de problemas

El Descheduler trabaja con pods en lugar de máquinas virtuales. Si una máquina virtual que esperas que sea desalojada no lo es, consulta los registros del Descheduler.

Ejemplo:

> 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"

En este ejemplo, la máquina virtual fue migrada manualmente, por lo que la especificación del pod relacionado contiene un selector de nodo restrictivo. El Descheduler no puede desalojar este pod porque el selector de nodo impediría que el pod se ejecute con éxito en cualquier otro nodo disponible en el clúster.