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.
-
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 -
Listar los servidores que componen el cluster y sus etiquetas (Labels)
kubectl get nodes --show-labels -
Describir un Nodo y revisar sus etiquetas (Labels)
Cuando finalice de evisar los Labels del nodo, presione la letra q para salir y regresar el cursor.kubectl describe node student-X-worker | less -
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=ssdkubectl label nodes student-X-worker environment=desarrollo -
Revisar las etiquetas (Labels) del Nodo Worker del ambiente de laboratorio
En la salida del comando anterior veririque que las etiquetas disktype=ssd y environment=desarrollo existan.kubectl get node student-X-worker --show-labelsNAME STATUS ROLES AGE VERSION LABELS student-0-worker Ready worker 3d22h v1.20.11 ommited...,disktype=ssd,environment=desarrollo, ommited... -
Elimine la etiqueta environment=desarrollo del Nodo student-X-worker que agregó anteriormente
kubectl label nodes student-X-worker environment- -
Revisar nuevamente las etiquetas (Labels) del Nodo Worker del ambiente de laboratorio
En la salida del comando anterior veririque que la etiqueta environment=desarrollo ya no exista.kubectl get node student-X-worker --show-labelsNAME STATUS ROLES AGE VERSION LABELS student-0-worker Ready worker 3d22h v1.20.11 ommited...,disktype=ssd,ommited... -
Cree un nuevo Namespace con el siguiente comando
kubectl create ns example-node-selector -
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 -
Ejecute la creación del Deployment con el siguiente comando:
kubectl apply -f deployment-node-selector.yaml -n example-node-selector -
Verificar el estado de los PODS en el cluster
El comando anterior debe mostrar una salida como la siguiente:kubectl get pods -n example-node-selectorNote que los PODS se encuentran en estado PendingNAME 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 -
Determinar la razon por la cual los PODS se encuentran en estado Pending
El comando anterior debe mostrar una salida como la siguiente:kubectl get events -n example-node-selectorLAST 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. -
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:
Por esto:spec: nodeSelector: environment: desarrollo containers:Guardar el archivo modificadospec: nodeSelector: disktype: ssd containers: -
Aplicar los cambios al Deployment
kubectl apply -f deployment-node-selector.yaml -n example-node-selector -
Verificar nuevamente el estado de los PODS en el cluster
El comando anterior debe mostrar una salida como la siguiente:kubectl get pods -n example-node-selectorLos PODS fueron provisionados corerctamente, debido a que se corrigió la etiqueta de selección de Nodo en el manifiesto del Deployment.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 -
Puede realizar la limpieza del ambiente con los siguientes comandos:
kubectl delete -f deployment-node-selector.yaml -n example-node-selectorkubectl label nodes student-0-worker disktype-kubectl delete ns example-node-selector