Ejercicio 2: Trabajando con un Pod multicontenedor (VOLUNTARIO)
En esta tarea vamos a profundizar en los Pods multicontenedor. Como indicamos en el contenido del módulo, un Pod puede estar formado por varios contenedores y por volúmenes (para permitir que los contenedores del Pod puedan compartir almacenamiento).
- Nota 1: Estudiaremos más en profundidad los volúmenes en una unidad posterior.
- Nota 2: Veremos también que los Pods son efímeros, es decir, que se pierde la información cuando el Pod se elimina.
La razón principal por la que los Pods pueden tener múltiples contenedores es para admitir aplicaciones auxiliares que ayudan a una aplicación primaria. Ejemplos típicos de estas aplicaciones pueden ser las que envían o recogen datos externos (por ejemplo de un repositorio) y los servidores proxy. El ayudante y las aplicaciones primarias a menudo necesitan comunicarse entre sí. Normalmente, esto se realiza a través de un sistema de archivos compartido o mediante la interfaz loopback (localhost).
Veamos dos ejemplos concretos:
- Un servidor web junto con un programa auxiliar que sondea un repositorio Git en busca de nuevas actualizaciones.
- Un servidor web con un servidor de aplicaciones PHP-FPM, lo podemos implementar en un Pod, y cada servicio en un contenedor. Además tendría un volumen interno que se montaría en el DocumentRoot para que el servidor web y el servidor de aplicaciones puedan acceder a la aplicación.
Veamos un pequeño ejemplo de un Pod multicontenedor:
Tenemos la definición del Pod en el fichero pod-multicontenedor.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-multicontenedor
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: contenedor1
image: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
- name: contenedor2
image: debian
volumeMounts:
- name: html
mountPath: /html
command: ["/bin/sh", "-c"]
args:
- while true; do
date > /html/index.html;
sleep 1;
done
Estudiemos la definición del Pod:
![]()
- El Pod se llama
pod-multicontenedory en el apartadospecvemos que está formado por un volumen (llamadohtmly de tipoemptyDir, que estudiaremos más adelante, pero que básicamente es un directorio que vamos a montar en los contenedores) y dos contenedores (llamadoscontenedor1ycontenedor2). - El
contenedor1se crea a partir de la imagennginx, es el contenedor principal, encargado de servir la web. En este contenedor montamos el volumenhtmlen su DocumentRoot (/usr/share/nginx/html). Va a servir el ficheroindex.htmlque está modificando el otro contenedor. - El
contenedor2es el auxiliar. En este caso se monta el volumenhtmlen el directoriohtmldonde va modificando el ficheroindex.htmlcon la fecha y hora actuales cada un segundo (parámetrocommandyargs). - Como los dos contenedores tienen montado el volumen, el fichero
index.htmlque va modificando elcontenedor2, es el fichero que sirve elcontenedor1.
Para realizar la actividad realiza los siguientes pasos:
- Crea el Pod.
- Muestra la información del Pod, y fíjate que el Pod está formado por un volumen y dos contenedores.
-
Muestra el contenido del fichero
index.htmlen el primer contenedor, ejecutando:kubectl exec pod-multicontenedor -c contenedor1 -- /bin/cat /usr/share/nginx/html/index.htmlEn esta ocasión hay que indicar el contenedor (opción
-c) para indicar en que contenedor vamos a ejecutar la instrucción. -
Muestra el contenido del fichero
index.htmlen el segundo contenedor, ejecutando:kubectl exec pod-multicontenedor -c contenedor2 -- /bin/cat /html/index.html - Ejecuta un “port forward” para acceder al Pod en el puerto 8081 de localhost, sabiendo que el servicio usa el puerto 80.
- Accede desde un navegador para ver el resultado. Refresca la página para observar cómo va cambiando el fichero
index.html.
Para terminar accedes a la página desde un navegador web y comprueba que el pod está funcionando de manera adecuada.