¿Qué vamos a ver?
Basado en la documentación oficial de K8s (licencia CC-BY-4.0).
>_.source <(kubectl completion bash)
Comprueba que funciona escribiendo kubectl y presionando la tecla "TAB" 2 veces.Crea un namespace para aislar los recursos de este ejercicio del resto de recursos en tu clúster:
kubectl create namespace lab-pod-initialization
Vamos a crear un Pod con un Contenedor de aplicación y otro Contenedor de inicialización, que se ejecutará hasta completarse antes de que el Contenedor de aplicación comience.
pods/init-container.yaml con este manifiesto:apiVersion: v1
kind: Pod
metadata:
name: demo-init
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
initContainers:
- name: install
image: busybox
command:
- wget
- "-O"
- "/work-dir/index.html"
- http://kubernetes.io
volumeMounts:
- name: workdir
mountPath: "/work-dir"
dnsPolicy: Default
volumes:
- name: workdir
emptyDir: {}
En la definición del Pod especificamos un Volumen de tipo emptyDir que comparten ambos Contenedores. El contenedor de inicialización crea un archivo HTML en el mismo con la web de k8s.io, que el contenedor NGINX finalmente muestra.kubectl apply -f pods/init-container.yaml -n lab-pod-initialization
kubectl get pods demo-init -n lab-pod-initialization
kubectl describe pods demo-init -n lab-pod-initialization
¿Cuántos segundos ha tardado el Contenedor de inicialización en ejecutarse? ¿La imagen de NGINX se ha descargado antes o después de que terminara de ejecutarse?kubectl exec -it demo-init -n lab-pod-initialization -- /bin/bash
apt update
apt install curl -y
curl localhost
La salida debe mostrar la web del archivo creado por el Contenedor de inicialización.exit
Elimina el namespace, lo cual eliminará todos los recursos:
kubectl delete namespace lab-pod-initialization
En esta práctica hemos visto cómo: