Kubernetes y la nube
Qué añade un orquestador sobre Docker, el vocabulario de Kubernetes que hay que saberse de memoria, cómo se opera un clúster con kubectl, y sobre qué modelo de servicio en la nube acaba ejecutándose todo: IaaS, PaaS, SaaS, CaaS y KaaS.
El vocabulario de Kubernetes
Kubernetes tiene un vocabulario propio que se pregunta literalmente. Estos son los términos que hay que saber colocar.
| Término | Qué es |
|---|---|
| Clúster | El conjunto de máquinas, físicas o virtuales, y de recursos que administra Kubernetes. Necesita al menos un nodo maestro y un nodo trabajador. |
| Nodo | Cada máquina del clúster capaz de albergar pods. Los maestros toman las decisiones y los trabajadores ejecutan la carga. |
| Pod | La unidad más pequeña que Kubernetes sabe crear y planificar. Es un grupo de uno o varios contenedores que comparten red y almacenamiento. |
| Servicio | Una abstracción estable sobre un conjunto de pods: una dirección fija a la que se envía el tráfico, que Kubernetes reparte entre los pods que haya vivos. |
| Volumen | Un directorio con datos accesible para los contenedores de un pod, que sobrevive al reinicio del contenedor. |
| Namespace | Una partición lógica del clúster, un clúster virtual dentro del real. Sirve para separar entornos o equipos. |
El concepto que hay que entender bien es el pod, porque no equivale a contenedor. Un pod es normalmente un contenedor, pero puede llevar varios cuando son inseparables: el servicio y un acompañante que le recoge los registros o le hace de proxy. Lo que agrupa el pod son contenedores y volúmenes bajo una misma dirección IP, de modo que se ven entre ellos como si estuvieran en la misma máquina, y viven y mueren juntos. Emparentada con esa idea está la IP flotante: una dirección que no pertenece a una máquina concreta, sino que se puede mover entre varias máquinas o varios contenedores, y que es lo que permite que el servicio siga respondiendo en la misma dirección cuando cambia quién lo atiende.
Kubernetes se despliega en dos mitades: el plano de control se instala en el servidor central y decide, y en cada nodo trabajador se instala un agente, el Kubelet, que recibe esas decisiones y se ocupa de que los contenedores de su máquina estén en el estado que le han dicho. Es multiplataforma y es el orquestador que se usa en producción.
El servicio existe porque los pods son efímeros y su dirección cambia cada vez que se recrean. Nadie puede apuntar a la dirección de un pod. Se apunta al servicio, que ofrece un nombre y una dirección estables y hace de balanceador hacia los pods que en ese momento estén disponibles. El tráfico que entra desde fuera del clúster se gobierna con el ingress.
Cadena de contención, de mayor a menor: clúster contiene nodos, un nodo alberga pods, y un pod agrupa contenedores. El servicio no contiene nada: es la puerta estable por la que se llega a un grupo de pods.
El vocabulario de Kubernetes
Clúster
- Plano de control: API server, scheduler, etcd
- Nodos trabajadores: kubelet
Carga de trabajo
- Pod: la unidad mínima, uno o varios contenedores juntos
- ReplicaSet: mantiene el número de pods
- Deployment: gestiona el ReplicaSet y las actualizaciones
Acceso y configuración
- Service: punto de acceso estable
- Ingress: entrada HTTP desde fuera
- ConfigMap y Secret: configuración y credenciales
- Namespace: separación lógica dentro del clúster
Para el examen
Pod: la unidad mínima; puede llevar más de un contenedor
Deployment: mantiene el número de réplicas
Service: da un punto de acceso estable
Namespace: separación lógica dentro del clúster
Por qué hace falta un orquestador: el estado deseado
Docker resuelve el problema de un contenedor en una máquina. En cuanto hay treinta contenedores repartidos por diez servidores, aparecen preguntas que Docker no contesta: en qué máquina arrancar cada uno, qué hacer cuando una máquina se cae, cómo repartir el tráfico entre cinco copias del mismo servicio, cómo sustituir la versión 2.4 por la 2.5 sin cortar el servicio, o cómo lanzar más copias cuando llega el examen y sube la carga.
Un orquestador es la capa que responde a todo eso, y de paso permite escalar, aporta seguridad de servicio y equilibra la carga: si se cae un nodo replica sus contenedores en otro, reparte las ejecuciones entre los nodos disponibles y puede mover un contenedor de una máquina saturada a otra que lo esté menos. Su idea de fondo es el estado deseado: el administrador no da órdenes paso a paso, sino que describe cómo debe quedar el sistema, y el orquestador se encarga permanentemente de que la realidad coincida con esa descripción.
Un pod suelto no tiene ninguna garantía: si muere, muere. Quien asegura que haya siempre un número determinado de copias es otro objeto. El histórico se llamaba Replication Controller y aún aparece en muchos apuntes; su sucesor es el ReplicaSet, que hace lo mismo con una forma más flexible de seleccionar los pods.
Ninguno de los dos se escribe hoy a mano. Lo que se declara es un Deployment, que es la pieza de nivel superior: define qué imagen hay que ejecutar y cuántas réplicas se quieren, crea por debajo el ReplicaSet que las mantiene, y sobre todo sabe cambiar de versión de forma progresiva, levantando pods de la versión nueva y retirando los de la vieja poco a poco, sin cortar el servicio y con posibilidad de deshacer el cambio.
| Objeto | Responsabilidad |
|---|---|
| Pod | Ejecutar los contenedores. Es efímero. |
| ReplicaSet | Mantener vivo el número de pods pedido, recreando los que falten. |
| Deployment | Declarar la versión y el número de réplicas, y gestionar los cambios de versión y su reversión. |
| Service | Dar una dirección estable y repartir el tráfico entre los pods. |
| Replication Controller | El antecesor del ReplicaSet. Se cita por histórico, no se usa. |
El escalado horizontal es, en este modelo, cambiar un número. Subir de tres réplicas a diez es modificar una línea del Deployment, y Kubernetes se ocupa de crear los pods, repartirlos entre los nodos que tengan sitio y darlos de alta en el servicio para que empiecen a recibir tráfico.
Si una pregunta habla de desplegar una versión nueva sin parar el servicio y de poder volver atrás, la respuesta es Deployment, no ReplicaSet ni pod.
Para el examen
Cómo trabaja Kubernetes: por estado deseado
Qué se declara: cómo debe quedar; el sistema corrige las diferencias
Qué da eso: la autorreparación
kubectl: el modo declarativo y el imperativo
kubectl es la herramienta de línea de comandos con la que se administra un clúster de contenedores repartido sobre una infraestructura de nodos. Con ella se trabaja de dos maneras distintas, y la distinción se pregunta.
| Modo | Cómo funciona | Cuándo se usa |
|---|---|---|
| Declarativo | Se escribe un fichero con el estado que se quiere y se aplica. Si se vuelve a aplicar, Kubernetes calcula la diferencia y ajusta lo que haga falta. | Siempre en producción: el fichero se guarda en control de versiones y es la verdad del despliegue. |
| Imperativo | Se dan órdenes concretas que crean objetos directamente, sin fichero. | Pruebas rápidas y diagnóstico. Lo creado así no queda documentado en ninguna parte. |
# Declarativo: se aplica el fichero, y se puede repetir sin miedo
kubectl apply -f api-temario.yaml
# Imperativo: crea el objeto una vez, y falla si ya existe
kubectl create -f api-temario.yaml
# Imperativo puro, sin fichero: util para una prueba rapida
kubectl run api-temario --image=api-temario:2.4.1 --port=3000
# Consultar el clúster
kubectl get pods
kubectl get nodes
kubectl get services
# Detalle y diagnostico de un objeto concreto
kubectl describe pod api-temario
kubectl logs api-temario
kubectl exec -it api-temario -- bash
# Escalar y cambiar de version
kubectl scale deployment api-temario --replicas=5
kubectl set image deployment/api-temario api=api-temario:2.5.0
kubectl rollout undo deployment/api-temarioLa diferencia práctica entre apply y create es que apply es idempotente: aplicar dos veces el mismo fichero deja el clúster igual, mientras que create falla si el objeto ya existía. Por eso apply es el que encaja con la automatización, donde el mismo fichero se ejecuta una y otra vez.
apply es declarativo y create es imperativo. Es una pregunta habitual, y la pista para recordarlo es que apply describe un destino mientras que create ordena una acción.
Para el examen
kubectl apply: modo declarativo: sobre ficheros y repetible
run y create: modo imperativo: para pruebas, no para producción
Ficheros declarativos: el manifiesto de un pod y docker-compose.yml
Los ficheros de Kubernetes se escriben en YAML y todos comparten la misma estructura de cuatro bloques, así que leído uno se leen todos.
- apiVersion: qué versión de la API del clúster se está usando.
- kind: qué clase de objeto se va a crear. Pod, Deployment, Service, Namespace.
- metadata: los datos de identificación, sobre todo el nombre y las etiquetas por las que otros objetos lo encontrarán.
- spec: la especificación de lo que se quiere, que es lo único que cambia de verdad de un tipo de objeto a otro.
apiVersion: v1
kind: Pod
metadata:
name: api-temario
labels:
app: api-temario
spec:
containers:
- name: api
image: registro.llegandoalcorte.com/api-temario:2.4.1
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: production
restartPolicy: AlwaysLas etiquetas de metadata no son decorativas: son el mecanismo con el que unos objetos seleccionan a otros. Un servicio no enumera los pods a los que manda tráfico, sino que declara qué etiqueta deben llevar, y así los pods que se creen mañana entran automáticamente en el reparto. La política de reinicio decide qué hacer si el contenedor se detiene, y Always significa que se reintente siempre.
Existe un pariente pequeño de esta idea que conviene no confundir con el orquestador. Docker Compose sirve para llevar la mano de un grupo de contenedores dentro de un único anfitrión: en un fichero docker-compose.yml se declara qué contenedores se quieren, con sus imágenes, sus puertos, sus volúmenes y sus dependencias, y una sola orden lo levanta todo de golpe. Su caso de uso típico es montar en un momento el entorno de trabajo completo de un equipo de desarrollo.
# docker-compose.yml: el entorno completo de desarrollo
services:
bd-temario:
image: postgres:16
environment:
POSTGRES_PASSWORD: desarrollo
volumes:
- datos-temario:/var/lib/postgresql/data
api-temario:
image: api-temario:2.4.1
depends_on:
- bd-temario
ports:
- "8080:3000"
volumes:
datos-temario:La frontera entre los dos es el número de máquinas: Docker Compose coordina contenedores dentro de un solo anfitrión, y Kubernetes los distribuye por un clúster de nodos.
Para el examen
Los cuatro campos de todo manifiesto: apiVersion, kind, metadata y spec
docker-compose.yml: varios servicios en un solo anfitrión
Manifiesto de Kubernetes: describe un clúster
Los dos orquestadores: Kubernetes y Docker Swarm
Kubernetes, que se abrevia como k8s por las ocho letras que van entre la k y la s, es el orquestador de referencia, pero no el único. Docker Swarm es la alternativa integrada en el propio Docker: mucho más sencilla de montar y de entender, con bastantes menos capacidades, y hoy claramente minoritaria frente a Kubernetes.
| Herramienta | Alcance | Cuándo se elige |
|---|---|---|
| Docker Compose | Varios contenedores en una sola máquina | Entornos de desarrollo y despliegues pequeños |
| Docker Swarm | Un clúster de nodos, con el modelo del propio Docker | Cuando se busca simplicidad y el volumen es modesto |
| Kubernetes | Un clúster de nodos, con un modelo de objetos completo | Producción, y prácticamente el estándar de hecho |
Compose no es un orquestador de clúster: coordina contenedores dentro de un anfitrión. Es la confusión más habitual al enumerar herramientas de orquestación.
Para el examen
Docker Swarm: integrado en Docker y más sencillo
Kubernetes: el estándar del sector y el que se pregunta
Modelos de servicio en la nube: IaaS, PaaS, SaaS, CaaS y KaaS
Los contenedores casi nunca se ejecutan hoy sobre hierro propio, sino sobre una plataforma contratada, y esa contratación tiene modelos con nombre. Todos responden a la misma pregunta: hasta dónde llega el proveedor y desde dónde empieza el cliente. Cuanto más alto es el modelo, menos administra el cliente y menos control conserva.
| Modelo | Qué contrata el cliente | Qué administra el proveedor | Qué le queda al cliente |
|---|---|---|---|
| IaaS | Infraestructura: máquinas, almacenamiento y red. | El centro de datos, el hardware y la capa de virtualización. | El sistema operativo hacia arriba: parches, software de base y aplicación. |
| PaaS | Una plataforma de ejecución, que se monta desde una consola web con los entornos que necesite cada equipo de desarrollo. | Todo lo anterior más el sistema operativo, el motor de ejecución y las bases de datos. | Solo su aplicación y sus datos. |
| SaaS | La aplicación ya terminada, que se usa desde el navegador. | Absolutamente todo, incluida la propia aplicación. | Su configuración y sus datos. |
| CaaS | Contenedores como servicio: el cliente entrega imágenes y el proveedor las ejecuta. | La infraestructura y el motor de contenedores. | Las imágenes y su configuración. |
| KaaS | Un clúster de Kubernetes gestionado. | La infraestructura y el plano de control del clúster, con sus nodos maestros. | Los objetos que despliega: pods, servicios y deployments. |
CaaS y KaaS son variantes de la misma idea aplicadas a los contenedores, y se sitúan entre IaaS y PaaS. La diferencia entre las dos es el nivel de la abstracción: en CaaS el cliente entrega contenedores y no ve el clúster, y en KaaS el cliente sí administra un clúster de Kubernetes, pero sin encargarse de montarlo ni de mantener sus nodos maestros. Los tres grandes proveedores de nube lo ofrecen: EKS en Amazon Web Services, GKE en Google Cloud y AKS en Microsoft Azure.
| Plataforma | Modelo |
|---|---|
| OpenShift | PaaS, sobre Kubernetes |
| Google App Engine | PaaS |
| Heroku | PaaS |
| AWS Elastic Beanstalk | PaaS |
| Cloud Foundry | PaaS |
| DigitalOcean | IaaS |
| Microsoft Azure | Nube completa: IaaS, PaaS y SaaS |
En la sigla CSP, la C es de Cloud: proveedor de servicios en la nube. No es un proveedor de comunicaciones, aunque algunos apuntes lo traduzcan así.
Para el examen
IaaS: infraestructura
PaaS: plataforma
SaaS: el programa terminado
Regla: cuanto más arriba, menos administra el cliente
El catálogo de las plataformas
Los nombres de los servicios concretos se preguntan, sobre todo los de Amazon Web Services y los de OpenStack, que es la plataforma abierta de infraestructura y la que más aparece en el ámbito público por no depender de un fabricante. La gracia de verlos juntos es que las dos ofrecen lo mismo con nombres distintos.
| Función | Amazon Web Services | OpenStack |
|---|---|---|
| Máquinas virtuales | EC2 | Nova |
| Almacenamiento de objetos | S3 | Swift |
| Almacenamiento de bloques | EBS | Cinder |
| Recursos de red | Neutron | |
| Cuadro de mandos web | Horizon |
Junto a esas dos, los otros proveedores de infraestructura que se citan son Microsoft Azure y Google Cloud. En el ámbito de la Administración General del Estado hay además infraestructura propia, ofrecida sobre la red SARA a los organismos públicos, que evita sacar de las administraciones los datos y las cargas de trabajo.
| Plataforma PaaS | Qué la caracteriza |
|---|---|
| OpenShift | La plataforma de Red Hat construida sobre Kubernetes. Se puede instalar en el centro de datos propio o consumirse como servicio. |
| Heroku | Muy parecida en propósito a OpenShift, pero solo existe en modo nube: no se instala en casa. |
| Cloud Foundry | Plataforma abierta que cubre el ciclo de vida completo del desarrollador, del código a la ejecución. |
El mecanismo interno de una plataforma PaaS moderna es, precisamente, lo que se ha estudiado en este subtema: la consola crea los contenedores que hagan falta para el entorno pedido, por ejemplo una versión concreta de Java con una base de datos y una caché, y los distribuye por el clúster con Kubernetes. El desarrollador entrega su código y no llega a ver nada de eso.
OpenShift es la respuesta cuando la pregunta pide una plataforma PaaS que se apoye en Kubernetes y pueda instalarse en las instalaciones del propio organismo.
Para el examen
Las tres grandes: AWS, Microsoft Azure y Google Cloud
En la Administración española: la nube SARA y los servicios comunes