Cómo utilizar los selectores de nodos en Kubernetes
Podemos restringir un Pod para que sólo pueda ejecutarse en un Nodo concreto. Puede haber algunas situaciones en las que queramos tener más control sobre el nodo en el que aterriza un pod.
nodeSelector es una de las formas de restricción de selección de nodos. nodeSelector es un campo de PodSpec. Se trata de una sencilla función de programación de Pods que permite programar un Pod en un nodo cuyas etiquetas coincidan con las etiquetas nodeSelector especificadas por el usuario.
Para saber más sobre Node Selects, haz clicaquí para ir a la página oficial de Kubernetes.
En este artículo, no tendremos taint en el nodo maestro para que los pods puedan desplegarse también en el nodo maestro. A continuación, crearemos pods para que se desplieguen tanto en el nodo trabajador como en el nodo maestro. A continuación, adjuntaremos una etiqueta al nodo maestro y señalaremos los pods para que se desplieguen sólo en el nodo maestro utilizando el nodeSelector.
Requisitos previos
- Cluster Kubernetes con al menos 1 nodo trabajador.
Si quieres aprender a crear un Clúster Kubernetes, haz clicaquí. Esta guía te ayudará a crear un clúster Kubernetes con 1 nodo maestro y 2 nodos en instancias EC2 de AWS Ubuntu 18.04.
Qué haremos
- Configurar los selectores de nodos
Configurar los selectores de nodos
En primer lugar, vamos a extraer los detalles de los nodos del clúster mediante el siguiente comando.
kubectl get nodes #Get nodes available in the cluster
kubectl describe nodes node01 | grep Taint #Describe node1 node to extract details regarding Taints
kubectl describe nodes master | grep Taint #Describe master node to extract details regarding Taints
Lo anterior muestra que los nodos no tienen manchas, esto significa que los Pods pueden colocarse en cualquiera de los nodos, ya sea en el maestro o en el nodo01.
Ahora, vamos a crear un despliegue que no tenga ningún selector de nodo.
vim my-deployment-without-node-selector.yaml #Create a deployment definition
apiVersion: apps/v1 kind: Deployment metadata: labels: app: frontend name: frontend spec: replicas: 3 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - image: httpd:2.4-alpine name: frontend
Ahora, estamos preparados para crear un despliegue utilizando el siguiente comando.
kubectl get pods #Get pods available in the cluster
kubectl create -f my-deployment-without-node-selector.yaml #Create a deployment
kubectl get pods ##Get nodes available in the cluster
Ahora, cambia el número de réplicas en el despliegue editando el archivo y aplica los cambios.
kubectl apply -f my-deployment-without-node-selector.yaml #Apply changes made in the deployment definition file
kubectl get pods -o wide # Get more details regarding pods using -o wide option
En la captura de pantalla anterior, se puede ver que se están creando nuevos pods y que también se están programando en el nodo maestro.
La razón de esto es que ambos nodos, el maestro y el nodo01, no tienen manchas.
Así que, para restringir la programación y asegurarnos de que los pods sólo se colocan en el nodo maestro, vamos a crear una etiqueta en el nodo maestro.
kubectl label nodes master on-master=true #Create a label on the master node
kubectl describe node master #Get more details regarding the master node
En la captura de pantalla anterior, se puede ver que el nodo maestro tiene una etiqueta como «on-master=true»
Ahora, vamos a crear un nuevo despliegue con nodeSelector:on-master=true en él para asegurarnos de que los Pods se despliegan sólo en el nodo maestro.
vim my-deployment-with-node-selector.yaml #Create a deployment definition file
apiVersion: apps/v1 kind: Deployment metadata: name: streamer-v4-deployment labels: app: streamer-v4 spec: replicas: 2 selector: matchLabels: app: streamer-v4 template: metadata: labels: app: streamer-v4 spec: containers: - name: streamer-v4 image: nginx ports: - containerPort: 8880 nodeSelector: on-master: "true"
Ahora se puede crear un nuevo despliegue con nodeSelector con el siguiente comando.
kubectl create -f my-deployment-with-node-selector.yaml #Create a deployment
kubectl get pods -o wide | grep streamer-v4-deployment #Get more details of the pods
En la captura de pantalla anterior, se puede ver que los Pods se despliegan sólo en el nodo maestro.
Ahora, vamos a cambiar «replica=50» para ver dónde se desplegarán los pods.
vim my-deployment-with-node-selector.yaml #Change a deployment definition
Aplica los últimos cambios con el comando que se menciona a continuación.
kubectl apply -f my-deployment-with-node-selector.yaml #Apply changes to the deployment
Aquí puedes ver que todos los pods se están creando y desplegando sólo en el nodo «maestro».
Conclusión
En este artículo hemos visto cómo se pueden restringir los pods para que se desplieguen sólo en un nodo específico utilizando label y nodeSelector.
También hemos visto que si el nodo maestro no tiene Taints, los pods pueden desplegarse en él.