¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Services y DNS en Kubernetes

Después de esta lección: Puedo dar un nombre a unos pods y encontrarlo desde otro pod.

Lección de 55 min13 comandosLaboratorio de Kubernetes: un clúster k3s de un nodo para cada alumno en una VM Ubuntu privada

Un Service da un nombre fijo

Un Service de Kubernetes da a un grupo de pods un nombre y una dirección que no cambian. Así otro programa los encuentra aunque los pods mueran y nazcan con direcciones nuevas.

La web de una librería online necesita hablar con su gestor de pedidos. Si apuntara a la dirección de un pod concreto, dejaría de funcionar cuando ese pod se renovara.

Al final de esta lección

Nota

Puedo dar un nombre a unos pods y encontrarlo desde otro pod.

Palabras clave

PalabraQué significaEjemplo
Serviceun nombre y una dirección fijos para un grupo de pods
Etiquetaun par nombre y valor que se pone a un podapp=portal
Selectorlas etiquetas que elige un Service
Puerto de destinoel puerto del pod al que el Service envía8080
DNS del clústerel servicio que convierte un nombre en una dirección

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Los pods cambian de dirección, el Service no

Cada pod recibe una dirección propia cuando nace. Si el pod se renueva, la dirección cambia. Un Deployment renueva pods todo el rato, y nadie quiere apuntar a algo que cambia.

Un Service tiene una dirección que dura lo que dure el propio Service. Reparte las peticiones entre los pods elegidos. Los elige por etiquetas.

Ejemplo: un Service que elige app=portal

PodEtiqueta app¿Lo elige el selector?
portal-1portalSí
portal-2portalSí
pedidos-1pedidosNo: el valor es otro
informes-1sin etiqueta appNo: falta la clave

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Crea el namespace portal

Comando
kubectl create namespace portal

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Crea dos pods que sirven una página web

Comando
kubectl create deployment portal --image=busybox:1.37.0 --replicas=2 -n portal -- httpd -f -p 8080 -h /etc

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Espera a que los dos pods estén listos

Comando
kubectl rollout status deployment/portal -n portal

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Crea un Service para esos pods

Comando
kubectl expose deployment portal --port=80 --target-port=8080 -n portal

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira los puertos del Service

Comando
kubectl get service portal -n portal --no-headers -o custom-columns=NOMBRE:.metadata.name,TIPO:.spec.type,PUERTO:.spec.ports[0].port,DESTINO:.spec.ports[0].targetPort

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El selector elige pods por sus etiquetas

Una etiqueta es un par nombre y valor, como app=portal. El Deployment la pone a cada pod que crea. El selector del Service lista las etiquetas que busca.

Un pod vale solo si tiene todas las etiquetas del selector, con el mismo valor. Con -l pides a kubectl get solo los pods con una etiqueta. Es el mismo filtro que usa el Service.

Mira el selector que tiene el Service

Comando
kubectl get service portal -n portal -o jsonpath='{.spec.selector}'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cuenta los pods con la etiqueta app=portal

Comando
kubectl get pods -n portal -l app=portal --no-headers | wc -l

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Busca pods con otra etiqueta

Comando
kubectl get pods -n portal -l app=otro

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cuenta a cuántos pods envía el Service

Comando
kubectl get endpointslices -n portal -l kubernetes.io/service-name=portal -o jsonpath='{.items[0].endpoints[*].addresses[0]}' | wc -w

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que un Service con el selector equivocado da un error. No lo da: se crea sin quejarse y no tiene ningún pod detrás, así que nadie responde. Si un Service no contesta, cuenta sus pods antes de buscar otra causa.

El nombre del Service sirve de dirección

El clúster tiene su propio DNS: convierte el nombre de un Service en su dirección. Dentro del mismo namespace basta el nombre corto, portal.

Desde otro namespace se usa el nombre largo: portal.portal.svc.cluster.local, que es Service, namespace, svc y el dominio del clúster. Prueba desde un pod de visita, que se borra solo al terminar.

Pide la página desde un pod de visita

Comando
kubectl run visita -n portal --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://portal/hostname

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Repítelo y mira qué pod responde

Comando
kubectl run visita -n portal --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://portal/hostname

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pregunta al DNS por el nombre largo

Comando
kubectl run visita -n portal --rm -i --restart=Never --image=busybox:1.37.0 -- nslookup portal.portal.svc.cluster.local

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Borra el namespace portal

Comando
kubectl delete namespace portal

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sobre este laboratorio y su código: Laboratorio de Kubernetes: un clúster k3s de un nodo para cada alumno en una VM Ubuntu privada

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.