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

  1. 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

  1. 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

comprobar-manchas-en-nodos

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

despliegue-sin-selector-de-nodo

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

crear-despliegue

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

aumentar-el-cuento-de-réplicas-en-el-despliegue

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

añadir-etiqueta-a-nodos-maestros

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"

despliegue-con-selector-de-nodo

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

crear-despliegue-con-selector-de-nodo

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

aumentar-el-cuento-de-réplicas-en-el-despliegue

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

aumentar-el-cuento-de-réplicas-en-el-despliegue

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.

También te podría gustar...