Cómo configurar la programación

En esta página, se describen las opciones del programador y cómo configurar las restricciones de programación de pods predeterminadas en tus clústeres de Google Distributed Cloud de solo software para equipos físicos.

Google Distributed Cloud proporciona varias funciones estándar de Kubernetes que puedes usar para controlar la programación de Pods, como las siguientes:

Para obtener información sobre las restricciones de propagación de la topología de pods en Kubernetes, consulta Kubernetes Scheduler en la documentación de Kubernetes.

Antes de comenzar

Antes de configurar la distribución predeterminada de Pods, asegúrate de que cada nodo de tu clúster tenga las etiquetas de topología correctas. Puedes usar la API de Nodepool.Spec.TaintsAndLabels para aplicar etiquetas. Etiquetar nodos de forma manual con kubectl label ofrece más flexibilidad, pero requiere etiquetado manual cuando agregas un nodo nuevo al clúster.

Configura el programador personalizado predeterminado {[:config-default]}

Etiqueta nodos

  1. Agrega etiquetas de topología a los archivos YAML del clúster y del grupo de nodos. En el siguiente ejemplo, se supone que hay dos grupos de nodos trabajadores en diferentes racks y que los nodos del plano de control están en rack1.

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: abm-cluster
      namespace: cluster-abm-cluster
    spec:
      controlPlane:
        nodePoolSpec:
          labels:
            topology.k8s.io/rack: rack1
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: nodepool-rack1
      namespace: cluster-abm-cluster
    spec:
      labels:
        topology.k8s.io/rack: rack1
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: nodepool-rack2
      namespace: cluster-abm-cluster
    spec:
      labels:
        topology.k8s.io/rack: rack2
    
  2. Aplica la configuración actualizada del clúster.

    bmctl update cluster -c CLUSTER_NAME
    

    Reemplaza CLUSTER_NAME por el nombre de tu clúster.

  3. Espera a que la etiqueta topology.k8s.io/rack se propague a todos los nodos del clúster.

Habilita las restricciones de propagación de Pod predeterminadas

  1. Agrega la anotación preview.baremetal.cluster.gke.io/custom-scheduler-configuration:enable al archivo YAML del clúster.

  2. Agrega la sección schedulerConfiguration en cluster.spec.controlPlane en el archivo YAML del clúster.

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: abm-cluster
      namespace: cluster-abm-cluster
      annotations:
        preview.baremetal.cluster.gke.io/custom-scheduler-configuration: enable
    spec:
      controlPlane:
        schedulerConfiguration:
          defaultTopologySpreadConstraint:
            defaultConstraints:
            - topologyKey: topology.k8s.io/rack
              whenUnsatisfiable: DoNotSchedule
              maxSkew: 1
            defaultingType: List
    
  3. Aplica la configuración actualizada del clúster.

    bmctl update cluster -c CLUSTER_NAME
    

    Reemplaza CLUSTER_NAME por el nombre de tu clúster.

  4. Espera a que se complete la reconciliación del clúster. Supervisa cluster.status.clusterState hasta que muestre Running. Durante este proceso, se ejecuta un trabajo de control-plane-update para cada nodo del plano de control.

Verifica la configuración de la distribución de pods

  1. Crea una implementación de prueba con cinco réplicas.

  2. Observa la distribución de pods. La diferencia en la cantidad de Pods en nodepool-rack1 y nodepool-rack2 debe ser exactamente de uno.

  3. Verifica el archivo kube-scheduler-profile.config en cada nodo del plano de control. El archivo, ubicado en /etc/kubernetes/kube-scheduler-profile.config, debe contener la configuración de propagación de la topología de cluster.spec.

Solucionar problemas

Para diagnosticar y resolver problemas con la distribución predeterminada de pods, verifica lo siguiente:

  1. Revisa el BareMetalMachine.Status.ControlPlaneComponents para conocer el estado de la función.
  2. Examina los registros de cluster-operator y cap-controller-manager para ver los eventos pertinentes.
  3. Si fallan los Pods estáticos de kube-scheduler, verifica que la configuración del programador sea correcta en el archivo YAML del clúster.

¿Qué sigue?