Kapitan al tim贸n de Kubernetes


Conoce a Kapitan Le ayuda a aportar belleza y orden a su configuraci贸n de Kubernetes .


Kapitan se gana una reputaci贸n gracias a las cr铆ticas de los usuarios satisfechos y, por lo tanto, prescinde de una extensa documentaci贸n y un costoso marketing. Tenemos suficientes estrellas y un par de menciones de los bloggers y predicadores de Kubernetes. Kapitan incluso se convirti贸 en el protagonista de un cap铆tulo entero en el libro . Lo m谩s importante, atrajo la atenci贸n de varias compa帽铆as prometedoras, porque Kapitan, como nadie m谩s, es capaz de desentra帽ar la configuraci贸n vinculada al nudo marino .


En kubernetes.slack.com #kapitan logr贸 reunir una comunidad peque帽a pero dedicada (隆煤nete!), As铆 que estamos orgullosos de nuestro trabajo :)


Muchos todav铆a creen que Kapitan es una mezcla de jsonnet y jinja, pero se equivocan.
En esta publicaci贸n, te dir茅 c贸mo Kapitan gestiona los despliegues de Kubernetes, pero en general es capaz de m谩s que eso. Esto es importante: Kapitan es universal y no est谩 fijado en un Kubernetes. Kubernetes es simplemente uno de los muchos usos.


Esto no es una gu铆a (aunque prometo una gu铆a tambi茅n). Solo quiero decirle por qu茅 lo hicimos y qu茅 problemas con las implementaciones de configuraciones de Kubernetes deber铆a resolver.


Lo que no me gust贸


Comenc茅 a experimentar con Kubernetes en 2015 e inmediatamente me enamor茅.
Es cierto que hay varios inconvenientes que no quiero soportar:


  • Contexto Para m铆, este es uno de los conceptos m谩s dif铆ciles de entender Kubernetes , y uno de los m谩s peligrosos. El contexto se refiere al cliente, es dif铆cil de entender, se le llama confusamente y crea confusi贸n al ejecutar los comandos de kubectl . 隆Odio los contextos en kubectl!
  • Configuraci贸n anidada detallada (隆yaml!) . Tuve que sudar para descubrir cada nivel de configuraci贸n de YAML en el manifiesto. 驴Cu谩l es el punto de repetir etiquetas dos o tres veces en varios lugares?
  • Un desastre con equipos imperativos y declarativos . Se anima a los reci茅n llegados a Kubernetes a aprender por equipos imperativos, aunque est谩 claro que las personas normales no los usan. En mi opini贸n, es m谩s dif铆cil adaptar a Kubernetes a la estrategia de implementaci贸n adecuada para su empresa. Spoiler: No existe una 煤nica "estrategia correcta".
  • Configuraci贸n de tiempo de ejecuci贸n . Jesse Suen tiene raz贸n cuando aconseja no pasar los par谩metros de configuraci贸n a la l铆nea de comando del tim贸n (o kubectl y otros por el estilo). Con los par谩metros, el mismo comando se puede ejecutar de manera diferente cada vez.
  • Configuraci贸n de la aplicaci贸n Aprendimos a manejar los manifiestos de yaml en Kubernetes, somos geniales. Eso es justo debajo e Implementar: este es un recipiente vac铆o. Todav铆a tiene que hacer flotar la aplicaci贸n con toda su configuraci贸n.
  • Los desarrolladores quieren unas vacaciones , y el flujo de trabajo en Kubernetes todav铆a es un poco lento. Los fan谩ticos de Kubernetes est谩n obligando a todos a hacerlo all铆 mismo. 驴Es necesario? Obedecer Kelsey Hightower!
  • Operadores Tengo sentimientos encontrados por ellos, as铆 que por ahora deja este tema :) Solo puedo decir que a menudo se abusa de ellos.
  • Idempotencia . M谩s bien, su ausencia. Si sumamos todas las deficiencias anteriores, obtenemos flujos de trabajo insuficientemente idempotentes, lo cual es triste para Kubernetes.

Que hacer


Trat茅 de resolver estos problemas y arm茅 un peque帽o sistema de plantillas que usaba j2cli y un par de scripts bash para administrar las configuraciones de Kubernetes.


El sistema puso todo en el archivo environmentA.yaml y lo us贸 en la plantilla Jinja2. La implementaci贸n de aplicaciones de estilo microservicio desde varios componentes fue posible con un simple comando:


bin/apply.sh environments/environmentA.yaml 

Genial! Yaml ten铆a que ver con el despliegue. Es muy conveniente, porque podr铆a usar el mismo archivo como fuente de informaci贸n para otra cosa. Digamos por ... 隆 guiones bash !


Descubr铆 c贸mo importar valores de yaml a scripts para ejecutar comandos similares:


 bin/create_kafka_topics.sh environments/environmentA.yaml 

Y luego todo se sali贸 de control de una vez :


  • No pude hacer nada con la estructura en el archivo yaml. Era una mezcla de los mismos campos, valores, configuraci贸n confusa.
  • Nunca sabr谩 c贸mo comportarse la implementaci贸n en el entorno hasta que lo intente. A menudo, esto se debi贸 a cambios en las plantillas de jinja2 debido a un nuevo valor de inventario (por ejemplo, feature_X) que no funcion贸 en entornos donde esta funci贸n no est谩 definida.
  • El mismo problema con los scripts: si no lo intentas, no lo sabes.
  • A veces, Kubernetes cambi贸 tan r谩pido que me molest贸 cambiar constantemente los manifiestos para diferentes versiones, especialmente jugando con anotaciones a los valores.
  • Factor externo : el equipo de desarrollo cambi贸 de archivos de configuraci贸n a par谩metros de l铆nea de comando. Un cambio tan peque帽o nos confundi贸 todas las cartas, y tuvimos que pensar en una nueva soluci贸n.
  • Lo m谩s importante : 隆crear plantillas de yaml con Jinja (o plantillas Go) NO ES DIVERTIDO! Luego tuvimos un enigma: 鈥 驴Qu茅 parece texto, se lee como texto, huele a texto, pero no a texto? ". O, como Lee Briggs lo dijo acertadamente: 鈥 驴Por qu茅 demonios somos plantilla yaml? "

Kapitan: convertirse


Reunimos toda nuestra amarga experiencia y, junto con Ricardo Amaro, comenzamos a fantasear con un sistema de gesti贸n de configuraci贸n ideal. Entonces todav铆a no ten铆amos una imagen clara, pero sab铆amos que amamos y que no amamos.


Amor


  • Git
  • Patrones en general: datos / valores separados de patrones.
  • Valores separados para diferentes aspectos (aplicaci贸n, Kubernetes, tiempo de ejecuci贸n ...).
  • Enfoque orientado a objetos.
  • YAML simplificado como una interfaz donde ocultar la complejidad de Kubernetes.
  • Una comprensi贸n clara de lo que est谩 sucediendo y por qu茅.
  • Reutilizaci贸n de valores en diferentes componentes.
  • Y los scripts deber铆an tener acceso a los valores.

No nos gusta :


  • Contextos de Kubectl
  • Motores de plantillas de texto para crear yaml.
  • Conteo de sangr铆a: {{ toYaml .Values.resources | indent 10 }} {{ toYaml .Values.resources | indent 10 }} .
  • Magia: todo debe ser claro y claro. No hay trucos
  • Gesti贸n manual de contrase帽as y secretos de la aplicaci贸n.
  • Enfoque Tiller: Quer铆amos controlar el uso de manifiestos.
  • Enfoque Git-crypt: los secretos en el disco no est谩n encriptados.
  • Tuber铆a de plantilla directamente a kubectl.
  • Pasando opciones de l铆nea de comando.

Y luego sucedieron dos cosas :


  1. Descubrimos la jsonnet de Dave Cunningham para crear plantillas de yaml / json en un lenguaje orientado a objetos.
  2. Gustavo Buriola nos mostr贸 la reclasificaci贸n , y sin 茅l no habr铆amos ido muy lejos.

Ricardo Amaro se puso a trabajar y pronto todo el equipo se sent贸 en Kapitan: algunos trabajaron en la funcionalidad b谩sica, otros en su uso en nuestros proyectos internos. Gesti贸n de secretos, soporte gpg \ kms, funciones definidas por el usuario: ahora Kapitan es un producto completo que hace m谩s de lo prometido.


Quien es Kapitan?


Kapitan est谩 tratando de resolver todos (o casi todos) los problemas de los que habl茅.


Desde un punto de vista t茅cnico, Kapitan es muy simple:


  • Inventario : una colecci贸n jer谩rquica de valores que describe la implementaci贸n basada en yaml. Basado en reclases. Como hiera.
  • Motores de plantilla : ahora es Jinja2, Jsonnet, Kadet. Ellos hacen un inventario y crean archivos (yaml, json, documentaci贸n o scripts bash).
  • Secretos : secretos de plantillas, y Kapitan se ocupar谩 de ellos.

Estamos usando jsonnet para crear manifiestos y Jinja para hacer el resto.


A veces, las personas se quejan de que el archivo jsonnet es completamente diferente del mismo yaml, por lo que les resulta dif铆cil cambiar a jsonnet.

Intentamos resolver este problema con Kadet envolviendo yaml en Python. Tome su yaml favorito como base y agr茅guele Python.

隆Considera esto un exoesqueleto de Python para yaml! De alguna manera hablar茅 sobre esto.

En el flujo de trabajo, Kapitan muestra inmediatamente el personaje:


  • Libertad de elecci贸n : no imponemos ning煤n proceso de trabajo y tecnolog铆a, pero generalmente trabajamos en los principios que se describen a continuaci贸n. De hecho, Kapitan puede usarse como quieras. No es necesario que use git, no debe compilar archivos en 茅l, 隆e incluso puede hacerlo sin jsonnet! Haz lo que quieras.
  • GitOps hasta el hueso: todo en git, todo en una luz maestra que refleja nuestra intenci贸n.
  • Declarabilidad : Kapitan agradece la compilaci贸n de plantillas de manifiesto en representaciones espec铆ficas. Y compilas tus guiones.
  • Contexto controlado : utilizamos scripts compilados para simplificar nuestro trabajo, por ejemplo, al establecer contextos y configurar cl煤steres.
    Configuraci贸n de Kubernetes: compiled/target_A/setup/setup.sh
    Aplicar cambios: compiled/target_A/setup/apply.sh
  • Idempotencia : Kapitan le permite cambiar plantillas y herramientas de refactorizaci贸n de c贸digo. Los manifiestos y el c贸digo compilados no cambiar谩n sin su comando, por lo que no tiene nada que temer al refactorizar.
  • Causa y efecto : estamos a favor de un flujo de trabajo donde los cambios en el inventario o las plantillas y los archivos compilados se incluyen en una solicitud de fusi贸n. Por lo tanto, el revisor podr谩 evaluar sus cambios y sus consecuencias reales. Es bueno saber si un cambio en la plantilla afectar谩 a uno, dos o m谩s objetivos.
  • Y finalmente : Kapitan no est谩 apegado a Kubernetes. Simplemente crea archivos. El despliegue de cambios implic贸 kubectl . Solo damos un shell para que los comandos se ejecuten de manera consistente.

驴Lo necesito?


Dej茅moslo claro : probablemente no necesites Kapitan (todav铆a).


Pero todo depende de lo que intente hacer y de lo complicado que sea su sistema.


Kapitan es una poderosa herramienta de inversi贸n. 脷selo en escenarios complejos donde tiene que implementar un mont贸n de aplicaciones en un mont贸n de cl煤steres.


Si tiene aplicaciones est谩ndar, solo est谩 aprendiendo Kubernetes o ya est谩 satisfecho con su flujo de trabajo, entonces Helm o su alternativa actual funcionar谩n.


Me imagino a Helm como apto para Kubernetes , y Kapitan es algo as铆 como Puppet .


En la pr贸xima publicaci贸n dar茅 ejemplos espec铆ficos y describir茅 en detalle el inventario. Escriba sobre lo que quiere saber o con lo que est谩 de acuerdo / en desacuerdo en esta publicaci贸n.


Gracias a Jacek Gruzewski .

Source: https://habr.com/ru/post/442844/


All Articles