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:

  1. Para ejecutar el almacenamiento en cluster en cada nodo, como: glusterd, ceph
  2. Para ejecutar la recogida de registros en cada nodo, como: fluentd, logstash
  3. 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

  1. 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?

  1. 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

get-system-daemonsets

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

get-system-pods

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

comprobar-codificación-controlada-por-daemonset

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

mi-definición-de-daño

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

crear-un-demonio

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

get-daemonset-details

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

get-pod-details-created-under-daemonset

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.

También te podría gustar...