Cloud native k8s] k8s afinidad, antiafinidad, corrupción, tolerancia

Tabla de contenido

1. Programación de K8

2. Afinidad y antiafinidad

1. Pods y nodos

2. Afinidad dura y afinidad blanda

3. Tinción y Tolerancia

1. Mancha

1.1 Composición de las manchas

1.2 Instalación y eliminación de manchas

2. Tolerancias

2.1 Uso básico de Tolerancia

         2.2 Caso de tolerancia

3. Configuración multi-contaminación y multi-tolerante


1. Programación de K8

  1. El programador usa el mecanismo de observación de listas de kubernetes para descubrir pods que se crearon recientemente en el clúster y aún no se programaron en Node. El programador programará cada pod no programado que se encuentre para que se ejecute en un nodo adecuado.
  2. kube-scheduler es el programador predeterminado para los clústeres de Kubernetes y forma parte del plano de control del clúster. Si realmente desea o necesita esto, kube-scheduler está diseñado para permitirle escribir un componente de programación y reemplazar el kube-scheduler original.
  3. Los factores a considerar al tomar decisiones de programación incluyen: solicitudes de recursos individuales y agregados, restricciones de hardware/software/políticas, requisitos de afinidad y antiafinidad , localidad de datos, interferencia entre cargas y más.

2. Afinidad y antiafinidad

1. Pods y nodos

  1. A partir del pod, se puede dividir en afinidad y antiafinidad, correspondientes a podAffinity y podAntiAffinity respectivamente.
  2. A partir del nodo, también se puede dividir en afinidad y antiafinidad, correspondientes a nodeAffinity y nodeAntiAffinity respectivamente .
  3. En términos de instrucciones de operación, puede haber ln, Notln, Exists, DoesNotExist, etc.

 Por afinidad, significa que quiero programar el puesto con esta etiqueta
Para antiafinidad, significa que no quiero programar el puesto con esta etiqueta

2. Afinidad dura y afinidad blanda

preferido Durante la programación Ignorado Durante la ejecución afinidad suave  

Estrategia blanda: combinada con el siguiente "operador: NotIn", significa intentar no programar el pod para el nodo coincidente, pero si no hay nodos no coincidentes, también se puede programar para el nodo coincidente.
 

 requerido Durante la programación Ignorado Durante la ejecución  afinidad fuerte

Estrategia dura: Combinado con el siguiente "operador: In", significa que debe programarse a un nodo que cumpla con las condiciones, de lo contrario esperará Pendiente.
 

De cualquier manera, en última instancia, depende de la etiqueta de la etiqueta.

kubectl get pods -n company ai-action-statistic-gray-86465f9c4b-hdfk4 -oyaml | grep nodeSelector -B 5 -A 5
  uid: ed47f094-f70a-45ed-b7dd-d46f2d01986f
spec:
  affinity:
    nodeAffinity:
      requerido durante la programación ignorada durante la ejecución:    #硬策略
        nodeSelectorTerms:
        - matchExpressions:
          - clave: node-role.kubernetes.io /
            operador gris: En
            valores:
            - gris
      preferido Durante la programación ignorada durante la ejecución:  #软策略
          - peso: 1
            preferencia:
              expresiones coincidentes:
              - clave: aplicación de PC
                operador: NotIn
                valores:
                - luna

3. Tinción y Tolerancia

Se pueden aplicar una o más contaminaciones a cada nodo de K8, lo que significa que el nodo no aceptará aquellos pods que no puedan tolerar estas contaminaciones. Si se aplica una tolerancia a los pods, significa que esos pods pueden (pero no están obligados) programarse en nodos con la contaminación correspondiente.

1. Mancha

  1. Si un nodo está marcado como contaminado, significa que no se permite programar pods en el nodo a menos que el pod también esté marcado como contaminado .
  2. Al usar el clúster k8s implementado por kubeadm, debe encontrar que, en circunstancias normales, la aplicación no se programará en el nodo principal. Porque el clúster k8s implementado por kubeadm agrega Taints al nodo principal de forma predeterminada .

  

1.1 Composición de las manchas

Use el comando kubectl taint para establecer una contaminación en un nodo de Nodo. ​​Después de que el Nodo está contaminado, existe una relación repulsiva con el Pod, lo que permite que el Nodo rechace la ejecución programada del Pod, o incluso expulse el Pod que ya existe. en el Nodo salir.

La composición de cada mancha es la siguiente:

clave=valor:efecto

Cada corrupción tiene una clave y un valor como etiqueta de la corrupción, donde el valor puede estar vacío y el efecto describe el efecto de la corrupción.

Las corrupciones tienen tres estrategias:

  1. PreferNoSchedule : la versión de política suave de NoSchedule, lo que significa no programar el nodo contaminado tanto como sea posible.
  2. NoExecute : esta opción significa que una vez que Taint surta efecto, si el Pod que se ejecuta en el nodo no tiene una configuración de tolerancia correspondiente (Tolerar), será desalojado directamente.
  3. NoSchedule : Indica que k8s no programará el Pod al Nodo con esta mancha

1.2 Instalación y eliminación de manchas

Los siguientes son ejemplos de comandos para establecer y eliminar contaminaciones con kubectl:

# Establecer taint
kubectl taint nodes node1 key1=value1:NoSchedule
# Remove taint
kubectl taint nodes node1 key1:NoSchedule-
 

 A continuación, veamos un ejemplo específico: al usar kubeadm para implementar e inicializar un clúster de Kubernetes, el nodo principal se configura con una contaminación node-role.kubernetes.io/master:NoSchedule, que se puede ver con el comando kubectl describe node. Esta mancha indica que, de manera predeterminada, el nodo maestro no programará la ejecución de pods, es decir, no ejecutará cargas de trabajo. Los comandos para configurar y eliminar esta mancha para los clústeres que utilizan la implementación manual binaria son los siguientes:

kubectl taint nodes <nombre-nodo> node-role.kubernetes.io/master=:NoSchedule
kubectl taint nodes <nombre-nodo> node-role.kubernetes.io/master:NoSchedule-

2. Tolerancias

El Nodo con el conjunto de contaminación tendrá una relación mutuamente excluyente con el Pod de acuerdo con el efecto de la contaminación: NoSchedule, PreferNoSchedule, NoExecute, y el Pod no se programará para el Nodo hasta cierto punto. Pero podemos establecer la tolerancia (Toleration) en el Pod, lo que significa que el Pod con la tolerancia establecida puede tolerar la existencia de corrupción y puede programarse para el Nodo con corrupción .

2.1 Uso básico de Tolerancia

La clave y el efecto en la declaración de Tolerancia del pod deben ser consistentes con la configuración de Mancha y cumplir con una de las siguientes condiciones:

  1. El valor del operador existe, no es necesario especificar el valor en este momento
  2. El valor del operador es igual y el valor es igual
  3. Si no se especifica ningún operador, el valor predeterminado es Igual.

 También hay dos casos especiales:

El efecto NoExecute Taint tiene los siguientes efectos en la ejecución de pods en un nodo:

  1. Una clave vacía con el operador Existe puede coincidir con todas las claves y valores
  2. Un efecto vacío coincide con todos los efectos

    En el ejemplo anterior, el valor del efecto es NoSchedule Aquí hay una breve descripción del valor del efecto:

  3. NoSchedule: si un pod no declara tolerar esta mancha, el sistema no programará el pod en el nodo con esta mancha.
  4. PreferNoSchedule: La versión de límite suave de NoSchedule.Si un Pod no declara tolerar esta Taint, el sistema intentará evitar programar el Pod para este nodo, pero no es obligatorio.
  5. NoExecute: define el comportamiento de desalojo del pod en respuesta a fallas del nodo.
  6. Los pods sin tolerancia serán desalojados inmediatamente
  7. Se configura el pod correspondiente a Tolerancia, si no se asigna ningún valor a los segundos de tolerancia, siempre permanecerá en este nodo
  8. Si se configura el pod correspondiente a Tolerancia y se especifica el valor de tolerationSeconds, se expulsará después del tiempo especificado.

 2.2 Caso de tolerancia

tolerancias:
 - clave: "clave1"
operador: "Igual"
valor: "valor1"
efecto: "NoSchedule"
toleranciaSeconds: 3600
 - clave: "clave1"
operador: "Igual"
valor: "valor1"
efecto: "NoEjecutar"
 - clave:
Operador "key2" :
efecto "Existe": "NoSchedule" 

  • Entre ellos, la clave, el valor y el efecto deben ser consistentes con la corrupción establecida en el Nodo.
  • El valor del operador Existe ignorará el valor valor
  • tolerationSeconds se usa para describir el tiempo que el Pod puede continuar ejecutándose cuando el Pod necesita ser desalojado

Veamos dos casos especiales de configuración de tolerancia en Pods:

Ejemplo 1: cuando no se especifica ningún valor de clave, se toleran todas las claves corruptas:

tolerancias:
- operador: "Existe"

 Ejemplo 2: cuando no se especifica ningún valor de efecto, significa tolerar todos los efectos de corrupción:

tolerancias:
- clave:
operador "clave": "Existe"

Tenga en cuenta que, en caso de que falle un nodo, a fin de mantener la configuración de límite de velocidad existente para el desalojo de pod, el sistema configurará gradualmente Taint para el nodo en el modo de límite de velocidad, lo que puede evitar las Consecuencias de una gran cantidad de pods. desalojado Esta función es compatible con tolerationSeconds, lo que permite que los pods definan cuánto tiempo dura una falla de nodo antes de ser desalojados.

3. Configuración multi-contaminación y multi-tolerante

**El sistema permite establecer varias contaminaciones en el mismo nodo, y también se pueden establecer varias tolerancias en el módulo. **El programador de Kubernetes maneja múltiples Taints y Tolerations que pueden coincidir, y los Taints restantes que no se ignoran son los efectos en los Pods. Aquí hay algunos casos especiales:

  1. Si hay efecto=NoSchedule en el Taint restante, el programador no programará el pod para este nodo.
  2. Si no hay efecto NoSchedule en el Taint restante, pero hay un efecto PreferNoSchedule, el programador intentará no asignar el pod a este nodo.
  3. Si el efecto del Taint restante es NoExecute y el pod ya se está ejecutando en el nodo, se expulsará; si no se está ejecutando en el nodo, no se volverá a programar en el nodo.

kubectltaint nodes node1 key1=value1:NoSchedule  
kubectl taint nodes node1 key1=value1:NoEjecute  
kubectl taint nodes node1 key2=value2:NoSchedule

Supongo que te gusta

Origin blog.csdn.net/weixin_71438279/article/details/127743154
Recomendado
Clasificación