Skip to main content

Pods Estáticos

Antes de comenzar vamos a entender que el kubelet ejecuta Pods en cualquier Nodo, sea del tipo master o worker.

Algunas instalaciones de Kubernetes no poseen el kubelet en los masters pues ejecutan los componentes kube-apiserver, kube-controller, etcd y kube-scheduler a través de services en el sistema operativo. Pero algunas instalaciones ejecutan los componentes del cluster como Pods dentro del propio master, luego necesitan del kubelet en funcionamiento.

El kubelet solamente entiende manifiestos para ejecutar Pods y nada más. Todos los otros objetos de Kubernetes como Deployments, ReplicaSets, Services, etc no son entendidos por el kubelet.

En una configuración normal de un cluster Kubernetes el kubelet aguarda instrucciones del kube-apiserver de qué Pods deben ser cargados en el Nodo, pero la decisión fue tomada por el kube-scheduler y los datos guardados en el etcd.

¿Qué sucedería si tuviéramos el siguiente escenario?

Alt text

Ahí viene la cuestión, ¿cómo ejecutar un Pod si no hay api-server, si no hay etcd, si no hay nada?

¿Cómo podríamos proveer las configuraciones de un Pod para el kubelet sin el kube-apiserver?

Podemos inyectar los Pods con los archivos YAML de definición de los Pods en una carpeta que el kubelet esté configurado para leer periódicamente. Cualquier alteración en esa carpeta el kubelet recreará los Pods para ejecutar los cambios y si los archivos son removidos el Pod será borrado automáticamente. Obviamente necesitamos un container runtime que el kubelet pueda ejecutar. Esos Pods que no poseen intervención del kube-apiserver son los llamados Static Pods.

Podría ser cualquier directorio del sistema desde que el kubelet esté configurado para leer este directorio.

Alt text

Alt text

Puedes ejecutar un Pod en tu propia máquina si instalas el kubelet. Él cuidará del proceso de mantener este Pod funcionando en tu máquina local, pero no tendremos ReplicaSets, Deployments, o sea, cada Pod como un contenedor cualquiera.

Podrás ver el Pod ejecutándose con docker ps o nerdctl ps o crictl ps por ejemplo dentro del cluster, pero no con kubectl get pods, pues recuerda el kubectl funciona con el kube-apiserver.

El kubelet posee dos maneras de ejecutar Pods:

  • Por archivo, como mostramos
  • Por un endpoint que es usado por el kube-apiserver para hacer input

Si estamos creando un Pod estático colocando el archivo manualmente en un Nodo, ¿podemos ver a través del comando kubectl get pods? Sí podemos, pues el kubelet crea un objeto espejo en el kube-apiserver, pero no es editable o manipulable a través del kubectl, o sea, no puede ser borrado, pero puede ser visualizado.

Como mencionado anteriormente los Static Pods son muy usados para los propios servicios de Kubernetes y es así que el kubeadm crea los componentes del cluster.

El kube-scheduler no posee ningún efecto sobre Static Pods.

Alt text

Pero uno de los requisitos de Kubernetes es tener el swap desactivado.

sudo apt-get install kubelet -y

sudo swapoff -a

sudo systemctl enable kubelet --now

sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-12-28 15:41:50 -03; 1s ago
Docs: https://kubernetes.io/docs/home/
Main PID: 64784 (kubelet)
Tasks: 21 (limit: 18778)
Memory: 26.0M
CPU: 173ms
CGroup: /system.slice/kubelet.service
└─64784 /usr/bin/kubelet

## Si algún problema ocurre haga un checkup
journalctl -xeu kubelet

Las instalaciones del kubelet crean el servicio en el sistema que es el kubelet.service entonces vamos a buscar dónde está.

sudo find / -type f -name kubelet.service 2>/dev/null

/usr/lib/systemd/system/kubelet.service
/var/lib/systemd/deb-systemd-helper-enabled/multi-user.target.wants/kubelet.service

cat /etc/systemd/system/multi-user.target.wants/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

Este kubelet falta algunas configuraciones todavía, pues no sabe dónde hay manifiestos de Pods, no sabe quién es el container runtime, no sabe nada, entonces vamos a ajustar.

Edite el archivo para esto si está con el docker instalado en su máquina.

Observe que pasé el container runtime, el endpoint y el path donde tendrán Pods.

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/kubelet \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--pod-manifest-path=/etc/kubernetes/manifests \
--v=2
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
### Reinicie el servicio y vea si aplicó las configuraciones
sudo systemctl daemon-reload
sudo systemctl restart kubelet.service
sudo systemctl status kubelet.service
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-12-28 16:43:37 -03; 55s ago
Docs: https://kubernetes.io/docs/home/
Main PID: 186026 (kubelet)
Tasks: 28 (limit: 18778)
Memory: 28.4M
CPU: 791ms
CGroup: /system.slice/kubelet.service