Cómo utilizar y gestionar los DaemonSets de Kubernetes

Cómo utilizar y gestionar los DaemonSets de Kubernetes

  • ITOps y DevOps
6 min de lectura Actualizado May 7, 2021

Puntos clave: Kubernetes DaemonSets aseguran que pods específicos funcionen en todos los nodos para gestionar tareas como el registro y la monitorización, creando y eliminando automáticamente pods a medida que se son añadidos o eliminados nodos.

  • Configurado usando archivos YAML, permitiendo varias personalizaciones para el despliegue de pods.
  • Facilita el despliegue de servicios como Fluentd y Prometheus en todos los nodos de un clúster Kubernetes.

Kubernetes están un motor líder de código abierto que orquesta aplicaciones contenedorizadas. En este artículo, echaremos un vistazo a la función DaemonSet que ofrece Kubernetes. Explicaremos te casos de utiliza y cómo Crea, actualizar, comunicarse con y eliminar DaemonSets.

¿Qué es un Kubernetes DaemonSet?

La función DaemonSet se está utilizando para asegurar que algunos o todos tus pods son programados y ejecutándose en todos los nodos disponibles. Esto básicamente ejecuta una copia del pod deseado en todos los nodos.

  • Cuando se están añadido un nuevo nodo a un clúster Kubernetes, se añadirá un nuevo pod a ese nodo recién conectado.
  • Cuando un nodo están eliminado, el controlador DaemonSet se asegura de que el pod asociado a ese nodo están recogido como basura. Eliminar un DaemonSet limpiará todos los pods que DaemonSet ha creado.

Los DaemonSets son una parte integral del clúster Kubernetes, facilitando a los administradores configurar fácilmente servicios (pods) a través de todos o un subconjunto de nodos.

Casos de utiliza de DaemonSet

Los DaemonSets pueden mejorar el rendimiento de un clúster Kubernetes distribuyendo tareas de mantenimiento y servicios de soporte mediante el despliegue de Pods en todos los nodos. Son adecuados para servicios de larga duración como la monitorización o la recopilación de registros. A continuación son algunos ejemplos de casos de utiliza de DaemonSets:

  • Ejecutar un daemon para almacenamiento en clúster en cada nodo, como glusterd y ceph.
  • Ejecutar un daemon para la recopilación de logs en cada nodo, como Fluentd y logstash.
  • Ejecutar un daemon para monitorizar nodos en cada nota, como Prometheus Node Exporter, recoged o Datadog agent.

Dependiendo del requisito, te puede configurar múltiples DaemonSets para un solo tipo de daemon, con diferentes flags, memoria, CPU, etc., que soporten múltiples configuraciones y tipos de hardware.

Planificación de pods DaemonSet

Por defecto, el nodo en el que se ejecuta un pod está decidido por el programador de Kubernetes. Sin embargo, los pods DaemonSet son creados y programados por el controlador DaemonSet. Usar el controlador DaemonSet puede provocar comportamientos inconsistentes en los pods y problemas en la preempción de prioridad de Pod. Para mitigar estos problemas, Kubernetes (ScheduleDaemonSetPods) permite a los usuarios programar DaemonSets usando el planificador predeterminado en lugar del controlador DaemonSet. Esto se están logrados añadiendo el término NodeAffinity a los pods DaemonSet en lugar del término .spec.nodeName. El planificador por defecto se están entonces utilizado para vincular el Pod al host objetivo. Lo siguiente están una configuración de ejemplo de NodeAffinity:

    apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          # Key Name
          - key: disktype
            operator: In
            # Value
            values:
            - ssd            
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

Arriba, configuramos NodeAffinity para que solo se cree un pod en un nodo que tenga la etiqueta "disktype=ssd". Además, los pods DaemonSet cumplen con contaminaciones y tolerancias en Kubernetes. La tolerancia node.kubernetes.io/unschedulable:NoSchedule están añadida automáticamente a los pods DaemonSet. (Para más información sobre contaminaciones y tolerancias, consulte la documentación oficial de Kubernetes.)

Cómo Crea un DaemonSet

Como en todos los demás componentes de Kubernetes, los DaemonSets son configurados usando un archivo YAML. Veamos la estructura de un archivo DaemonSet.

    apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: test-daemonset
  namespace: test-daemonset-namespace
  Labels:
    app-type: test-app-type
spec:
  template:
    metadata:
      labels:
        name: test-daemonset-container
  selector:
    matchLabels:
      name: test-daemonset-container

Como te puede notar en la estructura anterior, el apiVersion, el tipo y los metadatos son campos requeridos en cada manifiesto de Kubernetes. Los campos específicos de DaemonSet entran bajo la sección de especificaciones: estos campos son obligatorios.

  • plantilla. Esta es la definición de pod para el Pod que debe desplegarse en todos los nodos. Una plantilla de pod en un DaemonSet debe tener su RestartPolicy configurada en "Always" y, por defecto, tomará "Always" si no te has especificado una RestartPolicy.
  • selector. El selector para los pods gestionados por el DaemonSet. Este valor debe ser una etiqueta especificada en la plantilla del pod. (En el ejemplo anterior, hemos usado el nombre: test-daemonset-container como selector.) Este valor está fijo y no puede cambiarse tras la creación inicial del DaemonSet. Cambiar este valor hará que los pods creados a través de ese DaemonSet queden huérfanos. Kubernetes ofrece dos formas de emparejar matchLabels y matchExpressions para crear selectores complejos.

Otros campos opcionales

  • template.spec.nodeSelector - Esto puede usarse para especificar un subconjunto de nodos que Crea el Pod que coincida con el selector especificado.
  • template.spec.affinity - Este campo puede configurarse para establecer la afinidad que ejecutaría el pod solo en nodos que coincidan con la afinidad configurada.

Creación de un conjunto de daemons

Ahora vamos a crear un DaemonSet de muestra. Aquí usaremos una imagen "fluentd-elasticsearch" que se ejecutará en cada nodo de un clúster Kubernetes. Cada pod recogerá logs y enviará los datos a ElasticSearch.

daemonset-example.yaml

    apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch-test
  namespace: default # Name Space
  labels:
    k8s-app: fluentd-logging
spec:
  selector: # Selector
    matchLabels: 
      name: fluentd-elasticsearch-test-deamonset
  template: # Pod Template
    metadata:
      labels:
        name: fluentd-elasticsearch-test-deamonset
    spec:
      tolerations: # Tolerations
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers: # Container Details
      - 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

Primero, Crea el DaemonSet usando el comando kubectl Crea y recuperemos la información del DaemonSet y el pod de la siguiente manera:

    kubectl create -f daemonset-example.yaml
Ejemplo de Demonstate
    kubectl get daemonset
kubectl
    kubectl get pod -o wide
Pod Wide

Como te puede Ve a partir de la salida anterior, nuestro DaemonSet ha sido desplegado con éxito. Dependiendo de los nodos disponibles en el clúster, escalará automáticamente para coincidir con el número de nodos o un subconjunto de nodos en la configuración. (Aquí, el número de nodos será uno ya que son ejecutando esto en un entorno de prueba con un solo clúster Kubernetes de nodo.)

Actualización de DaemonSets

Cuando se trata de actualizar DaemonSets, si se están cambiada la etiqueta de un nodo, DaemonSet añadirá automáticamente nuevos pods a nodos coincidentes mientras elimina pods de nodos que no coinciden. Podemos utilizar el comando "kubectl apply" para actualizar un DaemonSet, como se muestra a continuación.

Aplicar Demonstate

Son dos estrategias que se pueden seguir al actualizar DaemonSets:

  • La estrategia predeterminada en Kubernetes es que esto elimina los pods antiguos de DaemonSet y Crea automáticamente nuevos pods cuando se están actualizados una plantilla de DaemonSet.
  • Al usar esta opción, los nuevos pods DaemonSet son crean solo después de que un usuario elimine manualmente los pods antiguos de DaemonSet.

Estas estrategias pueden configurarse usando la opción spec.updateStrategy.type.

Eliminación de DaemonSets

Eliminar un DaemonSet están una tarea sencilla. Para ello, simplemente ejecuta el comando kubectl delete con el DaemonSet. Esto eliminaría el DaemonSet con todos los pods subyacentes que ha creado.

Eliminar Demonstate

Podemos utilizar la cascada=false flag en el comando kubectl delete para eliminar solo el DaemonSet sin eliminar los pods.

Comunicación con cápsulas creadas por DaemonSet

Son múltiples métodos para comunicarse con cápsulas creados por DaemonSets. Aquí son algunas opciones disponibles:

  • Push. De este modo, los pods pueden configurarse para enviar información a otros servicios (servicio de monitorización, base de datos estadística). Sin embargo, no reciben ningún dato.
  • NodeIP y puerto conocido. Los pods son accesibles a través de las IPs de los nodos usando hostPort. Los usuarios pueden entonces utilizar los puertos conocidos y la IP del nodo para comunicarse con los pods.
  • DNS. En este método, los usuarios pueden configurar un servicio headless con el mismo selector de pods para descubrir DaemonSet usando el recurso endpoint.
  • Servicio.  Para seleccionar un nodo aleatorio en un DaemonSet, que podemos utilizar para Crear un servicio con el mismo selector de pods.

Resumen de DaemonSet

En este artículo, hemos aprendido sobre los DaemonSets de Kubernetes. Estas configuraciones pueden facilitar fácilmente servicios de monitorización, almacenamiento o registro que pueden utilizarse para aumentar el rendimiento y la fiabilidad tanto del clúster Kubernetes como de los contenedores.

Lecturas relacionadas

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de ITOps y DevOps

¿Te interesa saber más de BMC?

El Brief están nuestro correo mensual sobre el mainframe y la orquestación empresarial: investigación, historias de clientes, noticias de productos, eventos.

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Tú te has suscrito a The Brief

El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.