Kubernetes: Operador vs. Controller
Introducción
Los términos Kubernetes Operator y Kubernetes Controller a menudo se usan indistintamente o se malinterpretan, lo que lleva a confusión entre desarrolladores y operadores por igual. Si bien ambos son fundamentales para la extensibilidad y las capacidades de automatización de Kubernetes, cumplen propósitos distintos.
En este artículo, aclararé las diferencias entre estos dos patrones, destacaré sus casos de uso y proporcionaré ejemplos actualizados para ayudarte a comprender mejor sus roles en los entornos de Kubernetes modernos.
Kubernetes Controllers
Los Kubernetes Controllers son la columna vertebral de su modelo declarativo. Implementan un bucle de control (control loop), un concepto tomado de los sistemas de control industrial, donde monitorean continuamente el estado del clúster y lo reconcilian con el estado deseado definido en las especificaciones de recursos.
Consejo
Un bucle de control es el bloque de construcción fundamental de los sistemas de control industrial.
Consiste en todos los componentes físicos y funciones de control necesarios para ajustar automáticamente el valor de una variable de proceso medida (PV) para que sea igual al valor de un punto de ajuste deseado (SP).
Un Kubernetes Controller es un bucle de control que monitorea el estado de los recursos del clúster y toma las medidas necesarias para llevarlos a un estado deseado. Según la documentación de Kubernetes, los controladores siguen este patrón:
- Observar el estado actual de los recursos del clúster.
- Compararlo con el estado deseado definido en la especificación de un objeto de Kubernetes.
- Actuar para reconciliar las diferencias, si es necesario.
Ejemplos de Controladores integrados en Kubernetes
- Controlador ReplicaSet: Asegura que el número de Pods coincida con las réplicas deseadas especificadas en un ReplicaSet.
- Controlador StatefulSet: Gestiona aplicaciones con estado asegurando un despliegue y escalado ordenado.
- Controlador DaemonSet: Garantiza que un Pod se ejecute en todos (o nodos específicos) de un clúster.
Casos de uso personalizados
Los Controllers no se limitan a los recursos integrados de Kubernetes. Los desarrolladores pueden crear Controllers personalizados para necesidades específicas:
- Controlador de Anotaciones: Asegura que todos los Pods tengan una anotación con un valor específico.
El controlador monitorea los recursos tipo Pod y agrega automáticamente la anotación a todos los Pods al crearse o modificarse.
Por ejemplo, el controlador podría agregar automáticamente la anotación
controlled-by: dumb
a todos los Pods. - Controlador de Seguridad de Servicios: Elimina cualquier recurso de tipo Service que sea de tipo
NodePort
. El controlador monitorea los recursos de tipo Service y elimina cualquier Service creado o modificado para ser de tipoNodePort
.
Estos ejemplos demuestran que el ámbito principal de un Controller es hacer cumplir un estado deseado, independientemente de si implica lógica integrada o personalizada.
Kubernetes Operators
Un Operador de Kubernetes es un controlador especializado que extiende las APIs de Kubernetes utilizando Custom Resource Definitions (CRDs) para gestionar aplicaciones complejas. El término fue acuñado por CoreOS y desde entonces ha evolucionado hasta convertirse en un patrón fundamental en Kubernetes.
Los Operadores esencialmente actúan como "operadores humanos" codificados en software. Automatizan tareas que tradicionalmente requerirían intervención manual por parte de un administrador.
Principales características de un Operator
- Utiliza el controller-pattern para reconciliar el estado.
- Extiende la API de Kubernetes con CRDs para introducir nuevos tipos de recursos.
- Codifica conocimientos operativos para automatizar tareas como copias de seguridad, actualizaciones y escalado.
- Gestiona una única aplicación y su ciclo de vida. A diferencia de los controladores genéricos, los Operadores son específicos de la aplicación y se centran en gestionar una única aplicación o componente.
Ejemplos de Operadores
- Strimzi Operator: Gestiona clústeres de Apache Kafka en Kubernetes.
- Prometheus Operator: Implementa y gestiona instancias de monitorización de Prometheus.
- PostgreSQL Operator: Automatiza el despliegue y la gestión de bases de datos PostgreSQL.
Los Operadores se crean comúnmente utilizando el Operator SDK y se despliegan con el Operator Lifecycle Manager (OLM).
Cuándo usar un Controller vs. un Operator
Un Controller básico puede ser suficiente si:
- Tu automatización solo requiere observar recursos integrados de Kubernetes.
- Tu lógica no requiere una nueva abstracción de la API de Kubernetes.
Utiliza un Operator cuando:
- Necesitas introducir un nuevo tipo de recurso específico para tu aplicación.
- La aplicación requiere conocimientos operativos específicos del dominio, como actualizaciones, escalado y manejo de fallos.
- Quieres proporcionar a los usuarios una experiencia nativa de Kubernetes para gestionar la aplicación.
Conclusión
Todos los Operadores son Controllers, pero no todos los controladores son Operadores. Los Controllers se centran en hacer cumplir comportamientos nativos de Kubernetes, mientras que los Operadores extienden Kubernetes para gestionar aplicaciones complejas con conocimientos específicos del dominio.
Si bien los controladores pueden escribirse en cualquier lenguaje, el uso de frameworks como el Operator SDK simplifica el desarrollo y reduce el código repetitivo. Entender cuándo usar un Controller frente a un Operador puede ayudar a los desarrolladores a construir mejores soluciones de automatización para las cargas de trabajo de Kubernetes.