Cómo ejecutar un trabajo en cada nodo de Kubernetes en lugar de un daemonset.
Hay un clúster de Kubernetes con 100 nodos, tengo que limpiar las imágenes específicas manualmente. Sé que el recolector de basura kubelet puede ayudar, pero no se ha aplicado en mi caso.
Después de buscar en Internet, encontré una solución: el uso de Docker dentro de Docker, para resolver mi problema.
Solo quiero eliminar la imagen en cada nodo una vez, ¿hay alguna forma de ejecutar un trabajo en cada nodo una vez?
Revisé las etiquetas de Kubernetes y la afinidad de las vainas, pero aún no tengo ideas. ¿Alguien podría ayudarme?
También intenté usar un daemonset para resolver el problema, pero resulta que solo puede eliminar la imagen para parte de los nodos en lugar de todos. No sé cuál podría ser el problema…
Aquí está el ejemplo del daemonset:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: test-ds
labels:
k8s-app: test
spec:
selector:
matchLabels:
k8s-app: test
template:
metadata:
labels:
k8s-app: test
spec:
containers:
- name: test
env:
- name: DELETE_IMAGE_NAME
value: "nginx"
image: busybox
command: ['sh', '-c', 'curl --unix-socket /var/run/docker.sock -X DELETE http://localhost/v1.39/images/$(DELETE_IMAGE_NAME)']
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock-volume
ports:
- containerPort: 80
volumes:
- name: docker-sock-volume
hostPath:
# ubicación en el host
path: /var/run/docker.sock
davy.ai
Solución para limpiar imágenes específicas en un clúster de Kubernetes
Introducción
Tienes un clúster de Kubernetes con 100 nodos, y necesitas limpiar una imagen específica de forma manual. Aunque la recolección de basura del kubelet puede ayudar, no se está aplicando en tu caso. Después de buscar en internet, encontraste una solución utilizando el método Docker-in-Docker (DinD) para resolver tu problema. Sin embargo, quieres ejecutar un trabajo en cada nodo solo una vez para eliminar la imagen, pero no sabes cómo lograrlo.
Solución
Existen dos posibles soluciones para ejecutar un trabajo en cada nodo una sola vez en Kubernetes:
En este ejemplo, el trabajo utiliza la imagen oficial de Docker para eliminar la imagen específica pasando el comando
docker rmi <id_imagen>
. El NodeSelectorkubernetes.io/hostname: ''
selecciona todos los nodos con cualquier nombre de host.Sin embargo, el problema de esta solución es que si agregas nuevos nodos al clúster, debes actualizar el trabajo para incluir los nuevos nodos.
Utilizar un DaemonSet: Puedes utilizar un DaemonSet para ejecutar un contenedor en cada nodo solo una vez, utilizando el campo
hostNetwork: true
en el PodSpec. Aquí tienes un ejemplo:El campo
hostNetwork: true
permite que el contenedor utilice el espacio de nombres de red del host del nodo, lo que significa que puede comunicarse con Docker en el nodo sin ninguna configuración adicional. El camposecurityContext: privileged: true
permite que el contenedor acceda al socket de Docker, lo cual es necesario para eliminar imágenes.Utilizando este método, puedes agregar nuevos nodos al clúster y el DaemonSet ejecutará automáticamente el contenedor en los nuevos nodos.
Conclusión
Puedes utilizar tanto el Node Selector como el método DaemonSet para ejecutar un trabajo en cada nodo solo una vez y eliminar una imagen específica en tu clúster de Kubernetes. El método DaemonSet es más escalable y automático, ya que ejecuta automáticamente el contenedor en cada nodo, pero requiere más configuración.