Crear un Daemonset en Kubernetes
Un DaemonSet se encarga de que todos los Nodos del Cluster Kubernetes ejecuten una copia de un Pod. Cada nodo tendrá una copia del Pod. Cuando se añaden nodos al clúster, se les añaden Pods y cuando se eliminan nodos del clúster, se eliminan los Pods. Si eliminamos un DaemonSet, éste limpiará los Pods que creó.
Un DaemonSet garantiza que todos los nodos ejecuten una copia de un Pod. Normalmente, el nodo en el que se ejecuta un Pod es seleccionado por el programador, pero los Pods DaemonSet son creados y programados por el controlador del DaemonSet.
Se puede utilizar Daemonset:
- Para ejecutar el almacenamiento en cluster en cada nodo, como: glusterd, ceph
- Para ejecutar la recogida de registros en cada nodo, como: fluentd, logstash
- Para ejecutar la monitorización de nodos en cada nota, como: Prometheus Node Exporter, collectd, agente Datadog
Para saber más sobre Daemonset, visitakubernetes.io la documentación oficial de Kubernetes.
En este artículo, crearemos un Daemonset de «fluentd_elasticsearch». Esto creará Pods de «fluentd_elasticsearch» en cada nodo del clúster. Nuestro archivo de definición de Daemonset tendrá Tolerancia para Taint de los nodos maestros para permitir que los Pods se programen también en el nodo maestro.
Requisitos previos
- Clúster Kubernetes con al menos 1 nodo trabajador.
Si quieres aprender a crear un Clúster Kubernetes, haz clicaquí. Esta guía te ayudará a crear un cluster de Kubernetes con 1 Maestro y 2 Nodos en Instancias EC2 de AWS Ubuntu 18.04.
¿Qué vamos a hacer?
- Crear un Daemonset
Crear un conjunto de demonios
Comprueba si existe algún conjunto de demonios en el espacio de nombres por defecto y en todos los espacios de nombres.
kubectl get daemonsets #Get daemonsets from the default namespace
kubectl get daemonsets --all-namespaces #Get daemonsets from all namespace using --all-namespace option
En la captura de pantalla anterior, puedes ver que hay algunos Daemonset disponibles. Todos estos Daemonset son para componentes del Cluster.
Ahora, obtén los pods que pertenecen al espacio de nombres «kube-system».
kubectl get pods -n kube-system #Get pods from the "kube-system" namespace
Todos estos pods que se ven en la captura de pantalla anterior pertenecen al Daemonset de componentes de clúster.
Obtén una lista de pods proxy.
kubectl get pods -n kube-system | grep proxy #Get pods from the "kube-system" namespace and grep for proxy
Comprueba qué controla los pods proxy.
kubectl describe pod kube-proxy-s5vzp -n kube-system #Describe the pod from the "kube-system" namespace
Obtén los detalles del daemonset que controla los pods proxy.
kubectl describe daemonset kube-proxy -n kube-system #Describe the daemonset from the "kube-system" namespace
Crea un archivo con la siguiente definición de daemonset.
vim my-daemonset.yml
apiVersion: apps/v1 kind: DaemonSet metadata: name: my-fluentd-elasticsearch-daemonset namespace: kube-system labels: k8s-app: fluentd-logging spec: selector: matchLabels: name: fluentd-elasticsearch template: metadata: labels: name: fluentd-elasticsearch spec: tolerations: - 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
En la definición anterior, tenemos una Tolerancia a la Mancha del nodo maestro. Esto permitirá que el pod se coloque también en el nodo maestro.
Crea un conjunto de demonios utilizando el archivo de definición creado en el paso anterior.
kubectl create -f my-daemonset.yml #Create a daemonset
kubectl get daemonset -n kube-system #Get daemonset from the "kube-system" namespace
Este conjunto deamonset se ha creado en el espacio de nombres «kube-system».
Describe el conjunto de demonios que acabamos de crear en el espacio de nombres «kube-system».
kubectl describe daemonset my-fluentd-elasticsearch-daemonset -n kube-system #Describe the daemonset from the "kube-system" namespace
En la captura de pantalla anterior, se puede ver que los Pods se han desplegado en 2 nodos.
Ahora, podemos obtener detalles de los pods que están desplegados como conjuntos de demonios en 2 nodos.
kubectl get pods -n kube-system | grep my-fluentd-elasticsearch-daemonset #Get pods from the "kube-system" namespace and grep
kubectl describe pod my-fluentd-elasticsearch-daemonset-4t9vs -n kube-system | grep Node #Describe the pods from the "kube-system" namespace and grep
kubectl describe pod my-fluentd-elasticsearch-daemonset-kxfjj -n kube-system | grep Node #Describe the pod from the "kube-system" namespace and grep
En la captura de pantalla anterior, se puede ver que los Pods se han desplegado en el nodo trabajador «node01» y en el nodo maestro «master». La razón por la que se ha programado el pod en el nodo maestro es la tolerancia a la mancha del nodo maestro.
Conclusión
En este artículo, hemos visto los pasos para crear un daemonset y hemos visto cómo se despliegan los pods en el daemonset en cada nodo del cluster Kubernetes.