Consejos y trucos de Kubernetes: sobre desarrollo local y telepresencia



Cada vez se nos pregunta m谩s sobre el desarrollo de microservicios en Kubernetes. Los desarrolladores, especialmente los idiomas interpretados, desean corregir r谩pidamente el c贸digo en su IDE favorito y sin esperar a que la compilaci贸n / implementaci贸n vea el resultado, simplemente presionando F5. Y cuando se trataba de la aplicaci贸n monol铆tica, fue suficiente para aumentar localmente la base de datos y el servidor web (en Docker, VirtualBox ...), despu茅s de lo cual, disfrute inmediatamente del desarrollo. Con el corte de los monolitos en microservicios y el advenimiento de Kubernetes, con la aparici贸n de dependencias entre s铆, las cosas se complicaron un poco . Cuanto m谩s de estos microservicios, m谩s problemas. Para volver a disfrutar del desarrollo, debe levantar m谩s de uno o dos contenedores Docker, y a veces incluso m谩s de una docena ... En general, todo esto puede llevar mucho tiempo, porque tambi茅n necesita mantenerlo actualizado.

En diferentes momentos, probamos diferentes soluciones al problema. Y comenzar茅 con las soluciones acumuladas o simplemente "muletas".

1. muletas


La mayor铆a de los IDE tienen la capacidad de editar c贸digo directamente en el servidor usando FTP / SFTP. Este camino es muy obvio e inmediatamente decidimos usarlo. Su esencia es la siguiente:

  1. En el pod para entornos de desarrollo (desarrollo / revisi贸n), se lanza un contenedor adicional con acceso a trav茅s de SSH y reenv铆a la clave SSH p煤blica del desarrollador que confirmar谩 / implementar谩 la aplicaci贸n.
  2. En la etapa de inicio (dentro del contenedor de prepare-app ) transferimos el c贸digo a emptyDir para tener acceso al c贸digo desde los contenedores con la aplicaci贸n y el servidor SSH.



Para una mejor comprensi贸n de la implementaci贸n t茅cnica de dicho esquema, dar茅 fragmentos de las configuraciones de YAML involucradas en Kubernetes.

Configuraciones


1.1. valores.yaml


 ssh_pub_key: vasya.pupkin: <ssh public key in base64> 

Aqu铆 vasya.pupkin es el valor de la variable ${GITLAB_USER_LOGIN} .

1.2. despliegue.yaml


 ... {{ if eq .Values.global.debug "yes" }} volumes: - name: ssh-pub-key secret: defaultMode: 0600 secretName: {{ .Chart.Name }}-ssh-pub-key - name: app-data emptyDir: {} initContainers: - name: prepare-app {{ tuple "backend" . | include "werf_container_image" | indent 8 }} volumeMounts: - name: app-data mountPath: /app-data command: ["bash", "-c", "cp -ar /app/* /app-data/" ] {{ end }} containers: {{ if eq .Values.global.debug "yes" }} - name: ssh image: corbinu/ssh-server volumeMounts: - name: ssh-pub-key readOnly: true mountPath: /root/.ssh/authorized_keys subPath: authorized_keys - name: app-data mountPath: /app ports: - name: ssh containerPort: 22 protocol: TCP {{ end }} - name: backend volumeMounts: {{ if eq .Values.global.debug "yes" }} - name: app-data mountPath: /app {{ end }} command: ["/usr/sbin/php-fpm7.2", "--fpm-config", "/etc/php/7.2/php-fpm.conf", "-F"] ... 

1.3. secret.yaml


 {{ if eq .Values.global.debug "yes" }} apiVersion: v1 kind: Secret metadata: name: {{ .Chart.Name }}-ssh-pub-key type: Opaque data: authorized_keys: "{{ first (pluck .Values.global.username .Values.ssh_pub_key) }}" {{ end }} 

Toque final


Despu茅s de eso, solo queda pasar las variables necesarias a gitlab-ci.yml :

 dev: stage: deploy script: - type multiwerf && source <(multiwerf use 1.0 beta) - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose) - werf deploy --namespace ${CI_PROJECT_NAME}-stage --set "global.env=stage" --set "global.git_rev=${CI_COMMIT_SHA}" --set "global.debug=yes" --set "global.username=${GITLAB_USER_LOGIN}" tags: - build 

Voila: el desarrollador que lanz贸 la implementaci贸n puede conectarse utilizando el nombre del servicio ( ya le dijimos c贸mo emitir acceso al cl煤ster de forma segura) desde su escritorio a trav茅s de SFTP y editar el c贸digo sin esperar a que se entregue al cl煤ster.

Esta es una soluci贸n completamente funcional, pero desde el punto de vista de la implementaci贸n tiene desventajas obvias:

  • la necesidad de refinar el diagrama de Helm, lo que complica a煤n m谩s su lectura;
  • Solo uno que haya implementado el servicio puede usarlo;
  • debe recordar sincronizarlo con el directorio local con el c贸digo y confirmar en Git.

2. Telepresencia


El proyecto de telepresencia se conoce desde hace bastante tiempo, pero en la pr谩ctica lo intent贸 con nosotros, como dicen, "no lleg贸 a nuestras manos". Sin embargo, la demanda ha hecho su trabajo y ahora nos complace compartir experiencias que pueden ser 煤tiles para los lectores de nuestro blog, especialmente porque todav铆a no hab铆a otros materiales sobre Telepresencia en el centro.

En resumen, no fue tan aterrador. Todas las acciones que requieren ejecuci贸n por parte del desarrollador, las colocamos en el archivo de texto del Helm-chart, llamado NOTES.txt . Por lo tanto, el desarrollador despu茅s de implementar el servicio en Kubernetes ve las instrucciones para iniciar el entorno de desarrollo local en el registro de trabajo de GitLab:

 !!!   ,   Kubernetes !!! *   * *       VPN * *     kubectl ( https://kubernetes.io/docs/tasks/tools/install-kubectl/ ) * *  config-  kubectl (  ~/.kube/config) * *     telepresence ( https://www.telepresence.io/reference/install ) * *    Docker * *    reporter     https://gitlab.site.com/group/app * *    registry  /  GitLab (  ): ######################################################################### docker login registry.site.com ######################################################################### *   ######################################################################### telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name }}:backend --mount=/tmp/app --docker-run -v `pwd`:/app -v /tmp/app/var/run/secrets:/var/run/secrets -ti registry.site.com/group/app/backend:v8 ######################################################################### 


No nos detendremos en los pasos descritos en este manual ... excepto el 煤ltimo. 驴Qu茅 sucede durante el lanzamiento de Telepresence?

Trabajar con telepresencia


Al inicio (mediante el 煤ltimo comando especificado en las instrucciones anteriores) establecemos:

  • espacio de nombres (espacio de nombres) en el que se inicia el microservicio;
  • los nombres de la implementaci贸n y el contenedor que queremos penetrar.

Los argumentos restantes son opcionales. Si nuestro servicio interact煤a con la API de Kubernetes y se crea una cuenta de servicio para ello, necesitamos montar los certificados / tokens en nuestro escritorio. Para hacer esto, use la opci贸n --mount=true (o --mount=/dst_path ), que montar谩 la ra铆z (/) desde el contenedor en Kubernetes a nuestro escritorio. Despu茅s de eso, podemos (dependiendo del sistema operativo y la forma en que se inicia la aplicaci贸n) usar las "claves" del cl煤ster.

Primero, considere la opci贸n de inicio de aplicaciones m谩s vers谩til: en el contenedor Docker. Para hacer esto, use el --docker-run y monte el directorio con el c贸digo en el contenedor: -v `pwd`:/app

Tenga en cuenta que esto implica comenzar desde el directorio con el proyecto. El c贸digo de la aplicaci贸n se montar谩 en el directorio /app en el contenedor.

Siguiente: -v /tmp/app/var/run/secrets:/var/run/secrets - para montar el directorio con el certificado / token en el contenedor.

Finalmente, esta opci贸n es seguida por la imagen en la que se iniciar谩 la aplicaci贸n. NB : 隆Al construir una imagen, debe especificar CMD o ENTRYPOINT !

驴Qu茅 pasar谩 despu茅s?

  • En Kubernetes, para la implementaci贸n especificada, el n煤mero de r茅plicas se cambiar谩 a 0. En su lugar, se lanzar谩 una nueva implementaci贸n, con el contenedor de fondo reemplazado.
  • En el escritorio, se iniciar谩n 2 contenedores: el primero, con Telepresencia (enviar谩 solicitudes de proxy a / para Kubernetes), el segundo, con la aplicaci贸n en desarrollo.
  • Si exec'nitsya est谩 en el contenedor con la aplicaci贸n, tendremos acceso a todas las variables ENV pasadas por Helm durante la implementaci贸n, as铆 como a todos los servicios disponibles. Todo lo que queda es editar el c贸digo en su IDE favorito y disfrutar del resultado.
  • Al final del trabajo, es suficiente simplemente cerrar el terminal donde se est谩 ejecutando Telepresence (finalizar la sesi贸n usando Ctrl + C), los contenedores Docker se detendr谩n en el escritorio y todo volver谩 a su estado original en Kubernetes. Todo lo que queda es comprometerse, emitir el MR y pasarlo a revisi贸n / fusi贸n / ... (dependiendo de sus flujos de trabajo).

Si no queremos ejecutar la aplicaci贸n en un contenedor Docker, por ejemplo, no la desarrollamos en PHP, sino en Go, y a煤n la recopilamos localmente, lanzar Telepresence ser谩 a煤n m谩s f谩cil:

 telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name }}:backend --mount=true 

Si la aplicaci贸n accede a la API de Kubernetes, deber谩 montar el directorio con las claves . Para Linux, hay una utilidad de prueba :

 proot -b $TELEPRESENCE_ROOT/var/run/secrets/:/var/run/secrets bash 

Despu茅s de iniciar Telepresence sin la opci贸n --docker-run , todas las variables de entorno estar谩n disponibles en el terminal actual, por lo que debe iniciar la aplicaci贸n en 茅l.

Nota : cuando utilice, por ejemplo, PHP, debe recordar desactivar varios op_cache, apc y otros aceleradores para el desarrollo; de lo contrario, editar el c贸digo no producir谩 el resultado deseado.

Resumen


El desarrollo local con Kubernetes es un problema cuya necesidad de soluci贸n est谩 creciendo en proporci贸n a la difusi贸n de esta plataforma. Despu茅s de haber recibido solicitudes relevantes de los desarrolladores (de nuestros clientes), comenzamos a resolverlas con los primeros medios disponibles, que, sin embargo, no demostraron su val铆a a larga distancia. Afortunadamente, esto se ha vuelto obvio no solo ahora y no solo para nosotros, por lo tanto, ya han aparecido medios m谩s adecuados en el mundo, y Telepresence es el m谩s famoso de ellos (por cierto, todav铆a hay un skaffold de Google). Nuestra experiencia en su uso no es tan buena, pero ya da razones para recomendar "colegas". 隆Pru茅belo!

PS


Otros del ciclo de consejos y trucos de K8s:

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


All Articles