Selector de nodos en 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!
2 pensamientos sobre “Selector de nodos en kubernetes”