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.
- 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.
- 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.
- 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.
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:
- Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
- Asegúrese de que dispone de la función de acceso al servicio IAM Writer o Manager IBM Cloud para el espacio de nombres
default
.
-
Obtenga una lista de las clases de prioridad existentes. Puede utilizar una clase prioritaria existente como plantilla para la nueva clase.
kubectl get priorityclasses
-
Elija la clase de prioridad que desea copiar y cree un archivo YAML local.
kubectl get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml
-
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 depriorityClassName
. 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 unpriorityClassName
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 unglobalDefault
, ejecutekubectl describe priorityclass <name>
.description
Opcional: indique a los usuarios para qué se utiliza esta clase de prioridad. Encierre la serie entre comillas ( ""
). -
Cree la clase de prioridad en el clúster.
kubectl apply -f filepath/priorityclass.yaml
-
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:
- Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
- Asegúrese de que dispone de la función de acceso al servicio IAM Writer o Manager IBM Cloud en el espacio de nombres en el que desea desplegar los pods.
- Comprenda cómo funciona la planificación de prioridad, ya que la prioridad puede evitar los pods existentes y afectar a la forma en que se consumen los recursos del clúster.
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.
-
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
-
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>
-
Obtenga la clase de prioridad que desea utilizar, o bien cree su propia clase de prioridad.
kubectl get priorityclasses
-
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>
-
Cree los pods priorizados en el espacio de nombres en el que desea desplegarlos.
kubectl apply -f filepath/pod-deployment.yaml