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
kubectl get daemonset
kubectl get pod -o 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.
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.
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
Guía Kubernetes
- ¿Qué es Kubernetes (K8s)? Un tutorial básico de Kubernetes
- Mejores prácticas de Kubernetes para mejorar la eficiencia del clúster
- Mejores Prácticas: Cómo Diseñar Aplicaciones para Kubernetes
- Kubernetes Pods: Una introducción
- Kubernetes ReplicaSets: Una breve introducción
- Despliegues de Kubernetes completamente explicados
- Cómo utilizar y gestionar los DaemonSets de Kubernetes
- Cómo funcionan los servicios de Kubernetes
- Uso de Kubernetes Port, TargetPort y NodePort
- Creación y uso de ConfigMaps en Kubernetes
- Introducción a Kubernetes Secrets
- Fundamentos de las redes de Kubernetes
- Explicación de Kubernetes Ingress
- Introducción a las Listas de Helm de Kubernetes
- ¿Qué están el patrón de operador Kubernetes?
- Despliegue de PostgreSQL como un StatefulSet en Kubernetes
- Definición de Recursos Personalizados (CRDs) de Kubernetes Explicada
- 3 Patrones Kubernetes para aplicaciones nativas en la nube
- Explicación de los recursos de cómputo de Kubernetes
- Kubernetes Security for DevOps Pipelines
- Uso de spinnaker con Kubernetes para entrega continua
- Multi-Clústeres Kubernetes: Cómo y por qué utilizarlos
- Monitorización de Kubernetes: Una guía completa
- Kubernetes vs Docker: Una comparación rápida
- Kubernetes vs Docker Swarm: Comparando herramientas de orquestación de contenedores
- Kubernetes vs OpenShift: ¿Cuál es la diferencia?
- Certificaciones Kubernetes: Cómo y por qué Obtén la certificación
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.