Selector de nodos en kubernetes

node-selector-kubernetes

node-selector-kubernetes


En esta nueva entrada, siguiendo con los artículos de kubernetes, en el último hablamos sobre volúmenes, para ello vamos a ver como funciona el selector de nodos en kubernete y como aplicarlo. Esta funcionalidad nos será de gran ayuda cuando en nuestros entornos, cuando tengamos diferentes nodos con diferentes recursos.

Por lo general en entornos productivos, vamos a tener diferentes nodos debido a las diferentes necesidades. Quizás los microservicios los queremos en un nodo y servicios de infraestructura en otro nodo, o hacer una ubicación de los pods geográficamente. Para estos casos vamos a hacer uso del selector de nodos.

¿Qué es el selector de nodos en Kubernetes?

Un selector de nodos, o nodeSelector, es un campo específicado en la especificación del Pod. La cual se específica como un mapa clave valor.

El nodeSelector, cuyo objetivo como hemos comentado es la elección de que ese Pod pueda ejecutarse en un nodo seleccionado, tiene que tener también un par de clave valor en el nodo. De esa manera Pod y Nodo hacen match para que ese Pod funcione únicamente en el nodo seleccionado.

Ejemplo de aplicación de un Node Selector

En el entorno en el que actualmente me encuentro trabajando, tenemos cuatro nodos diferentes, al que se le asignan los Pod en función de la funcionalidad del Pod. Si el Pod que se despliega es un microservicio, o si el Pod que se despliega es una aplicación de infraestructura, por ejemplo nuestro jenkins se encuentra en un nodo con unos recursos y nuestros microservicios en otros nodos con diferentes recursos.

A continuación vamos a ver los pasos y las necesidades para poder realizar la aplicación a un Pod de un NodeSelector.

Crear etiqueta en un Nodo para aplicar NodeSelector

Para poder asignar un Pod a un nodo, lo primero es crear en el nodo la etiqueta correspondiente (label), por lo que primero vamos a obtener los nodos que tenemos. Para ello, vamos a introducir la siguiente anotación:

kubectl get nodes

Una vez hemos seleccionado el nodo en el que queremos añadir el label hacemos lo siguiente, kubectl label nodes <node-name> <label-key>=<label-value>, por ejemplo:

kubectl label nodes ip-190-168-140-57.ec2.internal nodegroup-type=microservices

Como siempre hay que hacer, vamos a asegurarnos que hemos introducido bien el valor de nuestro nodo, para ello vamos a hacer uso de la siguiente anotación:

kubectl describe nodes

o también podemos mirar el nodo concreto:

kubectl describe nodes ip-190-168-140-57.ec2.internal

Como podemos ver nuestro nodo ha sido modificado y ahora tenemos un selector de nodo al que asociarle nuestro pod.

Name:               ip-190-168-140-57.ec2.internal
Roles:              <none>
Labels:             alpha.eksctl.io/cluster-name=eks-dev-cluster
                    alpha.eksctl.io/instance-id=i-0100bdd9c9bd76460
                    alpha.eksctl.io/nodegroup-name=instances-stateless
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/instance-type=c5.2xlarge
                    beta.kubernetes.io/os=linux
                    failure-domain.beta.kubernetes.io/region=us-east-1
                    failure-domain.beta.kubernetes.io/zone=us-east-1c
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=ip-190-168-140-57.ec2.internal
                    kubernetes.io/os=linux
                    node.kubernetes.io/instance-type=c5.2xlarge
                    nodegroup-instances=mixed-instances-stateless
                    nodegroup-type=microservices
                    topology.kubernetes.io/region=us-east-1
                    topology.kubernetes.io/zone=us-east-1c

Como podemos ver en el código anterior, nuestra etiqueta ha sido creada.

Crear NodeSelector en un Pod asociado a un Nodo

Para hacer que un Pod se encuentre asociado a un nodo hay que asignarle en el node selector el label que hemos asociado en el nodo.

Vamos a crear un Pod asociado a nuestro nodo con la etiqueta microservicios, para ello vamos a crear un Pod de un servicio que hemos construido localmente:

apiVersion: v1
kind: Pod
metadata:
  namespace: microservice-stack
  name: location
  labels:
    env: dev
spec:
  containers:
  - name: location
    image: location:latest    
  nodeSelector:
    nodegroup-type=microservices

Ahora podemos ver en el nodo en el que se ha desplegado nuestro Pod, para ello podemos introducir el siguiente comando, vamos a añadir el namespace ya que lo hemos desplegado en un namespace específico.

kubectl get pod location -o wide -n microservice-stack

En nuestro caso vemos como se ha desplegado en el nodo

NAME                         READY   STATUS    RESTARTS   AGE    IP           NODE                              NOMINATED NODE   READINESS GATES
location                      1/1     Running   0          2m   10.0.2.199   ip-190-168-140-57.ec2.internal   <none>           <none>

Conclusión

En este artículo sobre Selector de nodos en kubernetes, hemos visto con un sencillo ejemplo y caso de uso cuándo y cómo aplicar el nodeselector en kubernetes. En próximos artículos veremos también el uso de nodeAffinity, el cual funciona en función de unos recursos.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!


No te olvides de seguirnos en nuestras redes sociales Facebook o Twitter para estar actualizado.


2 pensamientos sobre “Selector de nodos en kubernetes

Deja una respuesta

Tu dirección de correo electrónico no será publicada.