Skip to content

Node Labels y Node Selector

Etiquetas y Selectores

Las etiquetas son pares de clave/valor que se asocian a los objetos, como los pods. El propósito de las etiquetas es permitir identificar atributos de los objetos que son relevantes y significativos para los usuarios, pero que no tienen significado para el sistema principal. Se puede usar las etiquetas para organizar y seleccionar subconjuntos de objetos. Las etiquetas se pueden asociar a los objetos a la hora de crearlos y posteriormente modificarlas o añadir nuevas. Cada objeto puede tener un conjunto de etiquetas clave/valor definidas, donde cada clave debe ser única para un mismo objeto.

"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

Las etiquetas permiten consultar y monitorizar los objetos de forma más eficiente y son ideales para su uso en UIs y CLIs

Selectores de etiquetas

Al contrario que los nombres y UIDs, las etiquetas no garantizan la unicidad. En general, se espera que muchos objetos compartan la(s) misma(s) etiqueta(s).

A través del selector de etiqueta, el cliente/usuario puede identificar un conjunto de objetos. El selector de etiqueta es la primitiva principal de agrupación en Kubernetes.

Requisito basado en Igualdad

Los requisitos basados en Igualdad o Desigualdad permiten filtrar por claves y valores de etiqueta. Los objetos coincidentes deben satisfacer todas y cada una de las etiquetas indicadas, aunque puedan tener otras etiquetas adicionalmente. Se permiten tres clases de operadores =,==,!=. Los dos primeros representan la igualdad (y son simplemente sinónimos), mientras que el último representa la desigualdad. Por ejemplo:

environment = production
tier != frontend

Requisito basado en Conjunto

Los requisitos de etiqueta basados en Conjuntos permiten el filtro de claves en base a un conjunto de valores. Se puede utilizar tres tipos de operadores: in,notin y exists (sólo el identificador clave). Por ejemplo:

environment in (production, qa)
tier notin (frontend, backend)
partition
!partition

Asignación de pods a nodos

Es posible restringuir un POD para ejecutarse en nodo(s) en particular. Hay varias formas de hacerlo y todos los enfoques recomendados utilizan selectores de etiquetas para facilitar la selección. A menudo, no es necesario establecer ninguna restricción de este tipo; el componentes de Scheduling de Kubernetes lo hará automáticamente, encontrará una ubicación razonable (por ejemplo, distribuyendo sus Pods entre nodos para no colocar Pods en un nodo con recursos libres insuficientes). Sin embargo, hay algunas circunstancias en las que es posible que desee controlar en qué nodo se implementa el Pod, por ejemplo, para asegurarse de que un Pod termine en un nodo con un SSD, o para ubicar pods de dos servicios diferentes para comunicarse en la misma zona de disponibilidad.

Selector de nodos

nodeSelector es la forma recomendada más simple de restricción de selección de nodo. Puede agregar el campo nodeSelector a la especificación de su pod y especificar las etiquetas de nodo que desea que tenga el nodo de destino. Kubernetes solo programa el Pod en nodos que tienen cada una de las etiquetas que especifique.

Laboratorio: Asignar pods a nodos

Esta guía muestra cómo asignar un pod de Kubernetes a un nodo particular en un clúster de Kubernetes Si se desea asignar un pod a un nodo en específico una de las maneras en las que se puede lograr es por medio de etiquetas.

  1. Ingresar al ambiente de laboratorio en el servidor student-#-aio al cluster de usuarios de Kubernetes, exportar la variable de ambiente KUBECONFIG

    export KUBECONFIG=~/rke-cluster-users/kube_config_cluster.yml
    

  2. Listar los servidores que componen el cluster y sus etiquetas (Labels)

    kubectl get nodes --show-labels
    

  3. Describir un Nodo y revisar sus etiquetas (Labels)

    kubectl describe node student-X-worker | less
    
    Cuando finalice de evisar los Labels del nodo, presione la letra q para salir y regresar el cursor.

  4. Agregar las etiquetas con nombre disktype=ssd y environment=desarrollo a un Nodo, la etiqueta disktype=ssd ejemplifica a un Nodo que contiene discos SSD, mientras que la etiqueta environment=desarrollo ejemplifica a un servidor de ambiente de Desarrollo.

    kubectl label nodes student-X-worker disktype=ssd
    
    kubectl label nodes student-X-worker environment=desarrollo
    

  5. Revisar las etiquetas (Labels) del Nodo Worker del ambiente de laboratorio

    kubectl get node student-X-worker --show-labels
    
    En la salida del comando anterior veririque que las etiquetas disktype=ssd y environment=desarrollo existan.
    NAME               STATUS   ROLES    AGE     VERSION    LABELS
    student-0-worker   Ready    worker   3d22h   v1.20.11   ommited...,disktype=ssd,environment=desarrollo, ommited...
    

  6. Elimine la etiqueta environment=desarrollo del Nodo student-X-worker que agregó anteriormente

    kubectl label nodes student-X-worker environment-
    

  7. Revisar nuevamente las etiquetas (Labels) del Nodo Worker del ambiente de laboratorio

    kubectl get node student-X-worker --show-labels
    
    En la salida del comando anterior veririque que la etiqueta environment=desarrollo ya no exista.
    NAME               STATUS   ROLES    AGE     VERSION    LABELS
    student-0-worker   Ready    worker   3d22h   v1.20.11   ommited...,disktype=ssd,ommited...
    

  8. Cree un nuevo Namespace con el siguiente comando

    kubectl create ns example-node-selector
    

  9. Cree un nuevo archivo de manifiesto llamado deployment-node-selector.yaml con el siguiente contenido:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redis-cache
    spec:
      selector:
        matchLabels:
          app: store
      replicas: 3
      template:
        metadata:
          labels:
            app: store
        spec:
          nodeSelector:
            environment: desarrollo
          containers:
          - name: redis-server
            image: redis:3.2-alpine
    

  10. Ejecute la creación del Deployment con el siguiente comando:

    kubectl apply -f deployment-node-selector.yaml -n example-node-selector
    

  11. Verificar el estado de los PODS en el cluster

    kubectl get pods -n example-node-selector
    
    El comando anterior debe mostrar una salida como la siguiente:
    NAME                           READY   STATUS    RESTARTS   AGE
    redis-cache-854f5645f9-897fz   0/1     Pending   0          14s
    redis-cache-854f5645f9-g4njr   0/1     Pending   0          14s
    redis-cache-854f5645f9-vhkx4   0/1     Pending   0          14s
    
    Note que los PODS se encuentran en estado Pending

  12. Determinar la razon por la cual los PODS se encuentran en estado Pending

    kubectl get events -n example-node-selector
    
    El comando anterior debe mostrar una salida como la siguiente:
    LAST SEEN   TYPE      REASON              OBJECT                              MESSAGE
    5m6s        Warning   FailedScheduling    pod/redis-cache-854f5645f9-897fz    0/2 nodes are available: 1 node(s) didn't match Pod's node affinity, 1 node(s) had taint {node-role.kubernetes.io/controlplane: true}, that the pod didn't tolerate.
    

  13. Editar nuevamente el archivo deployment-node-selector.yaml y cambiar la etiqueta de selección de Nodo en la segunda sección spec: Cambiar esto:

        spec:
          nodeSelector:
            environment: desarrollo
          containers:
    
    Por esto:
        spec:
          nodeSelector:
            disktype: ssd
          containers:
    
    Guardar el archivo modificado

  14. Aplicar los cambios al Deployment

    kubectl apply -f deployment-node-selector.yaml -n example-node-selector
    

  15. Verificar nuevamente el estado de los PODS en el cluster

    kubectl get pods -n example-node-selector
    
    El comando anterior debe mostrar una salida como la siguiente:
    NAME                           READY   STATUS    RESTARTS   AGE
    redis-cache-6656d5c55d-h64tx   1/1     Running   0          2s
    redis-cache-6656d5c55d-hnhmj   1/1     Running   0          1s
    redis-cache-6656d5c55d-qvwgm   1/1     Running   0          6s
    
    Los PODS fueron provisionados corerctamente, debido a que se corrigió la etiqueta de selección de Nodo en el manifiesto del Deployment.

  16. Puede realizar la limpieza del ambiente con los siguientes comandos:

    kubectl delete -f deployment-node-selector.yaml -n example-node-selector
    
    kubectl label nodes student-0-worker disktype-
    
    kubectl delete ns example-node-selector