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.