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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Service | un nombre y una dirección fijos para un grupo de pods | |
| Etiqueta | un par nombre y valor que se pone a un pod | app=portal |
| Selector | las etiquetas que elige un Service | |
| Puerto de destino | el puerto del pod al que el Service envía | 8080 |
| DNS del clúster | el 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
| Pod | Etiqueta app | ¿Lo elige el selector? |
|---|---|---|
| portal-1 | portal | Sí |
| portal-2 | portal | Sí |
| pedidos-1 | pedidos | No: el valor es otro |
| informes-1 | sin etiqueta app | No: falta la clave |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Crea el namespace portal
kubectl create namespace portalSe 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
kubectl create deployment portal --image=busybox:1.37.0 --replicas=2 -n portal -- httpd -f -p 8080 -h /etcSe 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
kubectl rollout status deployment/portal -n portalSe 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
kubectl expose deployment portal --port=80 --target-port=8080 -n portalSe 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
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].targetPortSe 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
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
kubectl get pods -n portal -l app=portal --no-headers | wc -lSe 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
kubectl get pods -n portal -l app=otroSe 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
kubectl get endpointslices -n portal -l kubernetes.io/service-name=portal -o jsonpath='{.items[0].endpoints[*].addresses[0]}' | wc -wSe 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
kubectl run visita -n portal --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://portal/hostnameSe 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
kubectl run visita -n portal --rm -i --restart=Never --image=busybox:1.37.0 -- wget -qO- http://portal/hostnameSe 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
kubectl run visita -n portal --rm -i --restart=Never --image=busybox:1.37.0 -- nslookup portal.portal.svc.cluster.localSe 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
kubectl delete namespace portalSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.