Como usar un DaemonSet en Kubernetes

como usar un DaemonSet en Kubernetes

como usar un DaemonSet en Kubernetes


En esta nueva entrada vamos a hablar sobre otro objeto de kubernetes, Daemonset, en dónde veremos como usar un DaemonSet en Kubernetes, qué es un Daemonset y por qué y para qué necesitamos crearlos dentro de nuestras arquitecturas de kubernetes.

¿Qué es un Daemonset?

Un Deamonset es un objeto de kubernetes y al igual que otros objetos de kubernetes, gestiona una serie de réplicas de Pods.

La función principal de un Daemonset es asegurar que uno o un conjunto de Pods se ejecutan en el nodo o nodos específicados. En el momento que elimines un Daemonset, todos los Pods que fueron creados serán eliminados también.

¿Para qué usamos un Daemonset?

Todos los objetos de Kubernetes suelen tener una finalidad o una serie de usos especifícos y concretos, en este caso los usos más frecuentes de un Daemonset suelen ser:

  • Ejecutar un demonio para permitir el almacenamiento en cada nodo, por ejemplo ceph, una plataforma de almacenamiento open source.
  • Tener un demonio para recolectar logs, este caso es muy usado. Por ejemplo herramientas que se podrían levantar como daemonset serían fluentd o logstash.
  • Ejecutar un demonio para realizar una monitorización constante, como por ejemplo con Prometheus.

Como hemos comentado un Daemonset se va a encargar de gestionar y crear Pods, entonces, ¿por qué no usar un deployment o crear un Pods directamente?. La respuesta sería que puedes utilizar un deployment o crear pods, pero que se recomienda usar un Daemonset, siempre que se quiera y que sea importante que un Pod se ejecute en uno o varios hosts.

¿Cómo se planifican los DaemonSet?

Por lo general, el Pod que se ejecuta en un nodo es planificado por el planificador por defecto de kubernetes, pero en el caso de los DaemonSet, el Pod puede ser planificado por el controlador de DaemonSet.

Si se opta por realizar la planificación con el controlador de DaemonSet, este tiene una serie de características propias. Por un lado el estado de Pending desaparece ya que este planificador no lo lleva. Y por otro lado, cuando el Pod preemption se encuentra habilitado (la preferencia), el controlador de DaemonSet realizará planificaciones sin considerar ningún tipo de prioridad o preferencia.

Para poder utilizar el planificador por defecto, podemos hacer uso de ScheduleDaemonSetPods, lo cual nos permitirá añadir el NodeAffinity, para unirlo a un nodo por afinidad.

Ejemplo de como usar un DaemonSet en Kubernetes

A continuación vamos a realizar un DaemonSet para fluentd, el cual es un perfecto ejemplo de uso de DaemonSet ya que nos permite recolectar y unificar la información de diferentes servicios y consumirla para entender y hacer un mejor uso de toda esa información.

Antes de crear y ejecutar nuestro DaemonSet de pruebas, vamos a crear un nuevo namespace en donde lo ejecutaremos.

kubectl create namespace logging
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: logging
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      # para ejecutar en el nodo master, con minikube es el por defecto
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

Guardamos el DaemonSet anterior en un fichero y lo llamamos fluentd-daemonset.yaml, y lo ejecutamos de la siguiente manera:

kubectl apply -f fluentd-daemonset.yaml -n logging

Obtendremos un mensaje de creación y a continuación veremos si se ha creado correctamente.

Ejecutamos:

kubectl get daemonset -n logging
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
fluentd-elasticsearch   1         1         1       1            1           <none>                   104s

Podemos ver como tenemos nuestro DaemonSet ejecutándose en nuestro namespace.

A continuación vamos a ver los pods que se han creado para este DaemonSet.

kubectl get pods  -n logging -o wide
NAME                               READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
fluentd-elasticsearch-mjt5d        1/1     Running   0          99m   172.17.0.5     minikube   <none>           <none>

Ten en cuenta que en un DaemonSet no puedes controlar el número de Pods o escalar, ya que se ejecutan Pods por Nodo.

Conclusión

En este artículo hemos visto como como usar un DaemonSet en Kubernetes. En el que hemos visto los motivos y sus principales usos.

Este tipo de objetos de Kubernetes nos será muy útil en alguno de los escenarios que hemos hablado y/o en arquitecturas complejas en los que se incluya un stack de logging completo, como por ejemplo podríasmo aplicar fluentd con kibana y elasticsearch.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!


No te olvides de seguirnos en nuestras redes sociales Facebook o Twitter para estar actualizado.


Deja una respuesta

Tu dirección de correo electrónico no será publicada.