Fácil creación de operadores Kubernetes con shell-operator: progreso del proyecto en un año





Los operadores de Kubernetes son un mecanismo conveniente para ampliar las capacidades de esta plataforma de contenedores, que con razón ha ganado un amplio reconocimiento entre el entorno de los ingenieros de operaciones y sus simpatizantes. Hablamos sobre cómo están organizados y funcionan en el ya distante 2017. Y en abril del año pasado, presentamos el proyecto de operador de shell de código abierto , que simplificó enormemente el proceso de creación de operadores de Kubernetes.



Para esto, se desarrolló un marco que le permite ejecutar scripts arbitrarios (en Bash, Python, etc.) en caso de que ocurran ciertos eventos en el clúster K8s.



En el pasado, el operador de shell ha adquirido su base de usuarios (ver detalles al final del artículo) y, por supuesto, nuevas características. Con motivo del reciente lanzamientov1.0.0-beta.11 (sobre el estado beta, ver más abajo) decidimos hablar sobre lo que el proyecto ha llegado durante su existencia, desde el anuncio de la primera versión pública.



Sobre el dispositivo y el propósito



Pero comencemos con una breve explicación de cómo funciona el operador de shell y por qué, en principio, puede ser necesario.



El operador de shell se ejecuta en el pod del clúster de Kubernetes. Se presenta allí como:



  • Vaya a binario que se suscribe a eventos en la API de K8s y lanza ganchos (dándoles detalles sobre lo que sucedió);
  • un conjunto de ganchos, cada uno de los cuales es un script Bash, un script Python o cualquier otro archivo ejecutable.


Manos:



  • ellos mismos determinan qué eventos y para qué objetos necesitan;
  • realice las acciones necesarias en caso de que estos eventos ocurran en K8.


Por lo tanto, el operador de shell es una capa entre eventos en la API de Kubernetes y scripts para procesarlos.



imagen



¿Por qué se creó el operador de shell? Los operadores son el estándar para "hacer lo correcto" dentro de Kubernetes, pero desarrollarlos completamente (en Go usando el SDK apropiado ) no es fácil. La presencia de un marco tan simple como el operador de shell reduce significativamente el umbral para ingresar a esta área, lo que le permite resolver rápida y eficientemente pequeños problemas operativos * dentro del clúster. Y, igual de importante, hazlo de la manera correcta.



¿De qué tareas estamos hablando? En el repositorio del proyecto se pueden encontrar ejemplos listos para usar el operador de shell . En nosotros, en Flant, lo usamos como biblioteca(sí, eso también fue posible!) . Se convirtió en la base del operador de complemento , que gestiona componentes adicionales en Kubernetes.



NB : El anuncio de este proyecto de código abierto (addon-operator) se puede encontrar aquí . Y en el informe " Kubernetes expansivos y complementarios ", hablamos en detalle sobre las razones de su aparición, la relación con el operador de shell y los principios de operación.



Ahora sobre los principales cambios introducidos al operador de shell durante el año pasado.



Grandes innovaciones



En las primeras versiones del operador de shell, solo un objeto estaba disponible para el enlace, el asociado con el evento desde el clúster. La evolución de los ganchos utilizados dentro del operador de complemento dio como resultado que el gancho se suscribiera a un cambio de objeto, pero que llamara kubectlpara obtener una lista actualizada de otros objetos. Para eliminar llamadas innecesarias kubectly así acelerar el trabajo de los ganchos, se han implementado varias posibilidades para acceder a las listas actuales de objetos:



  • Sincronización + Modo de evento, cuando el gancho al inicio recibe una lista de objetos reales, y luego funciona con un solo objeto. Este modo está habilitado de forma predeterminada; podemos decir que el resultado es un análogo del bucle de reconciliación de operator-sdk.
  • snapshot', . (Snapshot’ Kubernetes, .)
  • snapshot'. , , , .
  • También se hizo posible monitorear el recurso , pero no reaccionar a sus cambios, es decir. "Acumular instantánea". Por ejemplo, un enlace puede reaccionar a los cambios en CustomResource y aún recibir el objeto ConfigMap real sin una llamada adicional kubectl. (Ver banderas executeHookOnSynchronizationy para más detalles executeHookOnEvent).


Otras innovaciones significativas:



  • Gracias a la transición al uso del cliente dinámico de Kubernetes en el operador de shell, fue posible suscribirse a cualquier existente kind(tipo de recurso en la API de Kubernetes), incluidos los recursos personalizados.
  • (. queue). endpoints.
  • .
  • « », namespace’ .
  • scraping' Prometheus'. .
  • , shell.




  • YAML- ( JSON).
  • JSON logrus (. LOG_TYPE ).
  • listen-address hostNetwork: true.
  • rate limit (qps, burst) Kubernetes API.
  • kube-server Kubernetes API.
  • .
  • jqFilter libjq-go, jq.
  • zombie reaper, SIGCHLD -, Bash-. — tini.
  • Se han implementado varias simplificaciones para conectar el operador de shell como una biblioteca.
  • Versión actualizada kubectl(de 1.13 a 1.17.4) e hizo un ensamblaje basado en alpine-3.11.


Estado y planes



El proyecto de operador de shell todavía está oficialmente en beta . A pesar de esto, como se señaló anteriormente, lo usamos muy intensamente como base para el operador de complemento , una herramienta que se usa constantemente en muchos (más de 100) grupos de K8.



Para una versión estable del operador de shell como proyecto público, planificamos (al menos):



  • agregar pruebas e2e ( # 63 ),
  • Implementar una construcción multi-arquitectónica ( # 184 ),
  • actualice client-go a 0.18.0, implemente contexty finalmente maneje el almacenamiento en caché de objetos en client-go ( # 188 ).


Reconocimiento de la comunidad



Con los años, hemos visto un claro interés de la comunidad en el operador de shell:





También nos complace anunciar que en la próxima conferencia virtual KubeCon + CloudNativeCon Europe 2020 , que se celebrará en agosto, habrá nuestro informe sobre el operador de shell. Los detalles se encuentran en el sitio web del evento .



Gracias por tu interés en el operador shell. Si tiene alguna pregunta, hágala aquí en los comentarios o en el canal tg @kubeoperator .



PD



Lea también en nuestro blog:






All Articles