IBM Cloud Docs
Configuración de la prioridad de pod

Configuración de la prioridad de pod

Con la preferencia y prioridad de pod, puede configurar las clases de prioridad para indicar la prioridad relativa de los pods. El planificador de Kubernetes tiene en cuenta la prioridad de un pod e incluso puede evitar (eliminar) pods con menor prioridad para hacer espacio en un nodo trabajador para pods de prioridad más alta.

¿Por qué se establece la prioridad de los pods?
Como administrador del clúster, desea controlar qué pods son más importantes para la carga de trabajo del clúster. Las clases de prioridad pueden ayudarle a controlar las decisiones del planificador de Kubernetes para favorecer los pods de prioridad más alta sobre los pods de prioridad más baja. El planificador de Kubernetes puede incluso evitar (eliminar) pods de prioridad más baja que se estén ejecutando, para que se puedan planificar pods pendientes de prioridad más alta.

Al establecer la prioridad de pod, puede evitar que las cargas de trabajo de prioridad más baja afecten a las cargas de trabajo críticas para el clúster, especialmente en los casos en los que el clúster empieza a alcanzar su capacidad de recursos.

Asegúrese de que ha configurado el acceso adecuado de los usuarios a su clúster y, si procede, las políticas de seguridad del pod (PSP). Las políticas de acceso y las PSP pueden ayudar a evitar que usuarios no fiables desplieguen pods de alta prioridad que evitan que otros pods se planifiquen.

¿Cómo funcionan la programación prioritaria y el derecho preferente?

En general, los pods pendientes que tienen una prioridad más alta se planifican antes que los pods con prioridad más baja. Si no dispone de recursos suficientes en los nodos de trabajo, el programador de Kubernetes puede adelantar (eliminar) pods para liberar recursos suficientes para que se programen los pods de mayor prioridad. La evitación también se ve afectada por los periodos de terminación ordenada, los presupuestos de interrupción de pod y la afinidad de los nodos trabajadores.

Si no especifica una prioridad para el despliegue del pod, el valor predeterminado se establece en la clase de prioridad establecida como globalDefault. Si no tiene una clase de prioridad globalDefault, la prioridad predeterminada para todos los pods es cero (0). De forma predeterminada, IBM Cloud Kubernetes Service no establece globalDefault, de modo que la prioridad predeterminada de pod es cero.

Para entender cómo la prioridad de pod y el planificador de Kubernetes trabajan juntos, tenga en cuenta los casos de ejemplo de la figura siguiente. Debe colocar los pods priorizados en nodos trabajadores con recursos disponibles. De lo contrario, los pods de prioridad alta del clúster pueden quedar pendientes, al mismo tiempo que se eliminan pods existentes, como en el caso de ejemplo 3.

Escenarios de prioridad Pod.
Escenarios de prioridad del pod

  1. Tres pods con prioridad alta, media y baja están pendientes de planificación. El planificador de Kubernetes encuentra un nodo trabajador disponible con espacio para los tres pods, y los planifica en orden de prioridad, con el pod de prioridad más alto planificado primero.
  2. Tres pods con prioridad alta, media y baja están pendientes de planificación. El planificador de Kubernetes encuentra un nodo trabajador disponible, pero el nodo trabajador sólo tiene recursos suficientes para admitir los pods de prioridad alta y media. El pod de prioridad baja no está planificado y se queda pendiente.
  3. Dos pods con prioridad alta y media están pendientes de planificación. Existe un tercer pod con una prioridad baja en un nodo trabajador disponible. Sin embargo, el nodo trabajador no tiene recursos suficientes para planificar ninguno de los pods pendientes. El planificador de Kubernetes evita, o elimina, el pod de baja prioridad, que devuelve el pod a un estado pendiente. A continuación, el planificador de Kubernetes intenta planificar el pod de prioridad alta. Sin embargo, el nodo trabajador no tiene suficientes recursos para planificar el pod de prioridad alta y, en su lugar, el planificador de Kubernetes planifica el pod de prioridad media.

Para más información, consulte la documentación de Kubernetes sobre prioridad y preferencia de pods.

¿Puedo desactivar el controlador de admisión de prioridad de pods?
No. Si no desea utilizar la prioridad de pod, no establezca un globalDefault o incluya una clase de prioridad en los despliegues de pod. Cada pod se establece de forma predeterminada en cero, excepto los pods críticos del clúster que IBM despliega con las clases de prioridad predeterminadas. Puesto que la prioridad de pod es relativa, esta configuración básica garantiza que se prioricen los pods críticos del clúster para los recursos, y planifica cualquier otro pod siguiendo las políticas de planificación existentes que tiene aplicadas.
¿Cómo afectan las cuotas de recursos a la prioridad de los pods?
Puede utilizar la prioridad de pods en combinación con cuotas de recursos, incluidos los ámbitos de cuotas. Con ámbitos de cuotas, puede configurar las cuotas de recursos para que tengan en cuenta la prioridad de pod. Los pods de mayor prioridad pueden llegar a consumir recursos del sistema que están limitados por la cuota de recursos antes que los pods de menor prioridad.

Clases de prioridad predeterminadas

Los clústeres de IBM Cloud® Kubernetes Service vienen con algunas clases de prioridad de forma predeterminada.

No modifique las clases predeterminadas, que se utilizan para gestionar correctamente el clúster. Puede utilizar estas clases en los despliegues de apps o crear sus propias clases de prioridad.

En la tabla siguiente se describen las clases de prioridad que se encuentran en el clúster de forma predeterminada y para qué se utilizan.

Clases de prioridad predeterminadas que no debe modificar
Nombre Establecida por Valor de prioridad Finalidad
system-node-critical Kubernetes 2000001000 Los pods seleccionados que se despliegan en espacios de nombres de sistemas privilegiados al crear el clúster utilizan esta clase de prioridad para proteger la funcionalidad crítica de los nodos trabajadores, como los pods de redes, almacenamiento, registro, supervisión y métricas.
system-cluster-critical Kubernetes 2000000000 Los pods seleccionados que se despliegan en espacios de nombres de sistemas privilegiados al crear el clúster utilizan esta clase de prioridad para proteger la funcionalidad crítica de los clústeres, como los pods de redes, almacenamiento, registro, supervisión y métricas.
ibm-app-cluster-critical IBM 900000000 Los pods seleccionados que se despliegan en espacios de nombres de sistemas privilegiados al crear el clúster utilizan esta clase de prioridad para proteger la funcionalidad crítica de las aplicaciones, como los pods del equilibrador de carga.

Puede comprobar qué pods utilizan las clases de prioridad ejecutando el mandato siguiente.

kubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName

Creación de una clase de prioridad

Para establecer la prioridad de pod, tiene que utilizar una clase de prioridad.

Antes de empezar:

  1. Obtenga una lista de las clases de prioridad existentes. Puede utilizar una clase prioritaria existente como plantilla para la nueva clase.

    kubectl get priorityclasses
    
  2. Elija la clase de prioridad que desea copiar y cree un archivo YAML local.

    kubectl get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml
    
  3. Cree el archivo YAML de clase de prioridad.

    apiVersion: scheduling.k8s.io/v1alpha1
    kind: PriorityClass
    metadata:
      name: <priority_class_name>
    value: <1000000>
    globalDefault: <false>
    description: "Use this class for XYZ service pods only."
    
    Visión general de los componentes del archivo YAML
    Componentes Descripción
    name Obligatorio: el nombre de la clase de prioridad que desea crear.
    value Obligatorio: especifique un número entero inferior o igual a 1000 millones (1000000000). Cuanto mayor sea el valor, más alta es la prioridad. Los valores son relativos a los valores de otras clases de prioridad del clúster. Reserve números muy altos para los pods críticos del sistema que no desea que se eviten (eliminen).

    Por ejemplo, el rango de valores de las clases de prioridad crítica de clúster predeterminadas oscila es 900000000-2000001000, de modo que debe especificar un valor inferior a estos números para las clases de prioridad nuevas para que nada tenga una prioridad más alta que estos pods.

    globalDefault Opcional: establezca el campo en true para convertir esta clase de prioridad en el valor predeterminado global que se aplica a cada pod planificado sin un valor de priorityClassName. Solo se puede establecer una clase de prioridad en el clúster como valor predeterminado global. Si no hay ningún valor predeterminado global, los pods sin un priorityClassName especificado tienen una prioridad de cero (0).

    Las clases de prioridad predeterminadas no establecen un globalDefault. Si ha creado otras clases de prioridad en el clúster, para asegurarse de que que no establecen un globalDefault, ejecute kubectl describe priorityclass <name>.

    description Opcional: indique a los usuarios para qué se utiliza esta clase de prioridad. Encierre la serie entre comillas ("").
  4. Cree la clase de prioridad en el clúster.

    kubectl apply -f filepath/priorityclass.yaml
    
  5. Verifique que se ha creado la clase de prioridad.

    kubectl get priorityclasses
    

Estupendo. Ha creado una clase de prioridad. Comunique a su equipo la información de la prioridad de prioridad y qué clase de prioridad, si corresponde, deben utilizar en sus despliegues de pod.

Asignación de prioridad a los pods

Asigne una clase de prioridad a su especificación de pod para establecer la prioridad del pod dentro del clúster de IBM Cloud Kubernetes Service.

Antes de empezar:

Complete los siguientes pasos para comprobar la importancia de otros pods desplegados, de modo que pueda elegir la clase de prioridad correcta para sus pods en relación con lo que ya está desplegado.

  1. Consulte las clases de prioridad que utilizan otros pods en el espacio de nombres.

    kubectl get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
    
  2. Obtenga los detalles de la clase de prioridad y anote el número del valor. Los pods con números más altos se priorizan antes que los pods con números más bajos. Repita este paso para todas las clases de prioridad que desee revisar.

    kubectl describe priorityclass <priorityclass_name>
    
  3. Obtenga la clase de prioridad que desea utilizar, o bien cree su propia clase de prioridad.

    kubectl get priorityclasses
    
  4. En la especificación de pod, añada el campo priorityClassName con el nombre de la clase de prioridad que ha recuperado en el paso anterior.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ibmliberty
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ibmliberty
      template:
        metadata:
          labels:
            app: ibmliberty
        spec:
          containers:
          - name: ibmliberty
            image: icr.io/ibm/liberty:latest
            ports:
            - containerPort: 9080
          priorityClassName: <priorityclass_name>
    
  5. Cree los pods priorizados en el espacio de nombres en el que desea desplegarlos.

    kubectl apply -f filepath/pod-deployment.yaml