es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for 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:

    1. Utilizar un Node Selector: Puedes utilizar un NodeSelector para seleccionar todos los nodos en el clúster y ejecutar un trabajo en ellos. Aquí tienes un ejemplo:
      kind: Job
      apiVersion: batch/v1
      metadata:
       name: clean-specific-image
      spec:
       template:
         metadata:
           name: clean-specific-image
         spec:
           nodeSelector:
             kubernetes.io/hostname: ''
           containers:
           - name: clean-specific-image
             image: docker
             command: ["/bin/sh", "-c", "docker rmi <id_imagen>"]
           restartPolicy: OnFailure
      

      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 NodeSelector kubernetes.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.

    2. 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:

      apiVersion: apps/v1
      kind: DaemonSet
      metadata:
       name: clean-specific-image
      spec:
       selector:
         matchLabels:
           app: clean-specific-image
       template:
         metadata:
       labels:
         app: clean-specific-image
      spec:
       hostNetwork: true
       containers:
       - name: clean-specific-image
         image: docker
         command: ["/bin/sh", "-c", "docker rmi <id_imagen>"]
         securityContext:
           privileged: true
       restartPolicy: OnFailure
      

      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 campo securityContext: 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.

Comments are closed.