¿Cómo crear un entorno de desarrollo local para Kubernetes?

115

Kubernetes parece tener que ver con la implementación de contenedores en una nube de clústeres. Lo que no parece tocar son los entornos de desarrollo y puesta en escena (o similares).

Durante el desarrollo, desea estar lo más cerca posible del entorno de producción con algunos cambios importantes:

  • Implementado localmente (o al menos en algún lugar donde usted y solo usted pueda acceder )
  • Use el último código fuente en la actualización de la página (suponiendo que sea un sitio web; idealmente, la página se actualizará automáticamente al guardar el archivo local, lo que se puede hacer si monta el código fuente y usa algunas cosas como Yeoman ).

De manera similar, es posible que desee un entorno no público para la integración continua .

¿Kubernetes admite este tipo de entorno de desarrollo o es algo que uno tiene que construir, esperando que durante la producción siga funcionando?

Wernight
fuente
Eche un vistazo a Openshift Origin. Es la próxima versión de Openshift y está construida sobre Kubernetes. Se ejecuta de forma independiente en un contenedor Docker.
Mark O'Connor
@ MarkO'Connor Estaba más buscando implementar también en Google Cloud, pero esas son más soluciones de implementación. Si tiene una solución con OpenShift Origin que permite el desarrollo local (principalmente la recarga del archivo local más reciente), compártala como respuesta, me interesaría.
Wernight
¿Has encontrado una solución a esto? Tengo kubernetes ejecutándose sobre mesos en mi clúster de desarrollo local. Estoy planeando crear microservicios en marcha que se implementarán en contenedores en kubernetes. Me encantaría poder guardar mis cambios y hacer que automáticamente construya el binario y reinicie los pods. Realmente no he tenido un cambio para probarlo, pero creo que construir el binario en el vms y luego relanzar el pod puede ser un poco lento.
F21
2
@ F21 Ha pasado más de un año desde que se publicó esto. ¿Existe algún buen flujo de trabajo de desarrollo local con kubernetes?
Jatin
Puede ver la microk8sinstalación liviana de k8s para su máquina local. He publicado la respuesta para lo mismo, cómo instalarlo. Su instalación solo toma alrededor de un minuto.
Prafull Ladha

Respuestas:

67

Actualización (2016-07-15)

Con el lanzamiento de Kubernetes 1.3, Minikube es ahora la forma recomendada de ejecutar Kubernetes en su máquina local para el desarrollo.


Puede ejecutar Kubernetes localmente a través de Docker . Una vez que tenga un nodo en ejecución, puede iniciar un pod que tiene un servidor web simple y monta un volumen desde su máquina host. Cuando acceda al servidor web, leerá el volumen y, si ha cambiado el archivo en su disco local, puede ofrecer la última versión.

Robert Bailey
fuente
3
Los documentos dicen que ya no es el método recomendado y que "Minikube es el método recomendado para ejecutar Kubernetes en su máquina local".
Jatin
No creo que minikube sea adecuado para desarrollar k8s, ¿verdad?
harryz
Depende de lo que estés desarrollando. Hay muchas partes de k8s en las que es razonable usar minikube para el desarrollo. Si está trabajando en políticas de seguridad de redes de pod o complementos CNI, no tendría mucho sentido.
Robert Bailey
1
El enlace "Kubernetes localmente a través de Docker" está roto. ¿Alguien tiene una actualización?
Pwnosaurus
1
Minikube reemplazó la configuración de la ventana acoplable local hace un tiempo y posteriormente se eliminó la documentación de la versión de la ventana acoplable local. ¿Minikube funciona para sus necesidades? También puede usar kubeadm dentro de una máquina virtual para crear una instancia de un clúster de nodo único local.
Robert Bailey
9

Hemos estado trabajando en una herramienta para hacer esto. La idea básica es que tiene un clúster de Kubernetes remoto, efectivamente un entorno de prueba, y luego ejecuta el código localmente y se transfiere al clúster remoto. Obtiene acceso transparente a la red, copia de variables de entorno, acceso a volúmenes ... lo más cerca posible del entorno remoto, pero con su código ejecutándose localmente y bajo su control total.

Entonces puedes hacer desarrollo en vivo, digamos. Documentos en http://telepresence.io

Itamar
fuente
5

El tipo de "recarga en caliente" es algo que tenemos planes de agregar, pero no es tan fácil como podría ser hoy. Sin embargo, si se siente aventurero, puede usar rsync con docker exec, kubectl exec u osc exec (todos hacen lo mismo aproximadamente) para sincronizar un directorio local en un contenedor cada vez que cambia. Puede usar rsync con kubectl u osc exec así:

# rsync using osc as netcat
$ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder
Clayton
fuente
La recarga en caliente en sí misma es y debe ser manejada por el marco web que usa, aquí el yeoman generalmente lo configura. Lo que falta es cómo habilitarlo. Requiere un volumen local para ser montado. Si el answser de @ Robert funciona, debería ser una solución válida.
Wernight
4

Otro gran punto de partida es esta configuración de Vagrant , especialmente. si su sistema operativo host es Windows. Las ventajas obvias son

  • configuración rápida e indolora
  • fácil de destruir / recrear la máquina
  • límite implícito de recursos
  • capacidad para probar el escalado horizontal creando múltiples nodos

Las desventajas: necesitas mucha RAM y VirtualBox es VirtualBox ... para bien o para mal.

Una ventaja / desventaja mixta es la asignación de archivos a través de NFS. En nuestra configuración, creamos dos conjuntos de definiciones de RC: uno que simplemente descarga una imagen de la ventana acoplable de nuestros servidores de aplicaciones; la otra con 7 líneas adicionales que configuran el mapeo de archivos desde HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes pod; sobrescribiendo el código fuente de la imagen de Docker.

La desventaja de esto es el caché de archivos NFS: con él, es problemático, sin él, es problemáticamente lento. Incluso la configuración mount_options: 'nolock,vers=3,udp,noac'no elimina por completo los problemas de almacenamiento en caché, pero funciona la mayor parte del tiempo. Algunas tareas de Gulp que se ejecutan en un contenedor pueden tardar 5 minutos cuando tardan 8 segundos en el sistema operativo host. Parece ser un buen compromiso mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'.

En cuanto a la recarga automática de código, eso es específico del lenguaje, pero estamos contentos con el devserver de Django para Python y Nodemon para Node.js. Para los proyectos frontend, por supuesto, puede hacer mucho con algo como gulp + browserSync + watch, pero para muchos desarrolladores no es difícil servir desde Apache y simplemente hacer una actualización dura tradicional.

Conservamos 4 conjuntos de archivos yaml para Kubernetes. Dev, "devstable", etapa, prod. Las diferencias entre esos son

  • variables env que establecen explícitamente el entorno (dev / stage / prod)
  • número de réplicas
  • devstable, stage, prod usa imágenes de Docker
  • dev usa imágenes de la ventana acoplable y asigna la carpeta NFS con el código fuente sobre ellas.

Es muy útil crear muchos alias de bash y autocompletar; puedo escribir rec usersy funcionará kubectl delete -f ... ; kubectl create -f .... Si quiero que comience toda la configuración, escribo recfoy recrea una docena de servicios, extrayendo las últimas imágenes de la ventana acoplable, importando el último volcado de base de datos de Staging env y limpiando los archivos antiguos de Docker para ahorrar espacio.

analítico
fuente
4

Acabo de empezar con Skaffold

Es realmente útil aplicar cambios en el código automáticamente a un clúster local.

Para implementar un clúster local, la mejor manera es Minikube o simplemente Docker para Mac y Windows, ambos incluyen una interfaz de Kubernetes.

Ignacio Millán
fuente
2

Tener un buen circuito de retroalimentación de desarrollo local es un tema de rápido desarrollo en el ecosistema de Kubernetes.

Desglosando esta pregunta, hay algunas herramientas que creo que apoyan bien este objetivo.

Docker para Mac Kubernetes

Docker para Mac Kubernetes ( Docker Desktop es el nombre genérico de plataforma cruzada) proporciona una excelente opción para el desarrollo local. Para la virtualización, utiliza HyperKit, que se basa en el marco nativo de Hypervisor en macOS en lugar de VirtualBox.

La función de Kubernetes se lanzó por primera vez como beta en el canal de borde en enero de 2018 y ha recorrido un largo camino desde que se convirtió en un Kubernetes certificado en abril de 2018 y se graduó en el canal estable en julio de 2018 .

En mi experiencia, es mucho más fácil trabajar con Minikube, particularmente en macOS, y especialmente cuando se trata de problemas como RBAC, Helm, hipervisor, registro privado, etc.

Timón

En cuanto a distribuir su código y extraer actualizaciones localmente, Helm es una de las opciones más populares. Puede publicar sus aplicaciones a través de CI / CD como gráficos de Helm (y también las imágenes subyacentes de Docker a las que hacen referencia). Luego, puede extraer estos gráficos de su registro de gráficos de Helm localmente y actualizarlos en su clúster local.

Borrador azul

También puede usar una herramienta como Azure Draft para realizar implementaciones locales simples y generar gráficos de Helm básicos a partir de plantillas de idiomas comunes, como paquetes de construcción, para automatizar esa pieza del rompecabezas.

Skaffold

Skaffold es como Azure Draft pero más maduro, de alcance mucho más amplio y creado por Google. Tiene una arquitectura muy conectable. Creo que en el futuro más personas lo usarán para el desarrollo de aplicaciones locales para Kubernetes.

Si ha utilizado React, pienso en Skaffold como " Crear una aplicación React para Kubernetes".

Kompose o Compose en Kubernetes

Docker Compose , aunque no está relacionado con Kubernetes, es una alternativa que algunas empresas utilizan para proporcionar un entorno de desarrollo local simple, fácil y portátil análogo al entorno de Kubernetes que ejecutan en producción. Sin embargo, seguir esta ruta significa divergir sus configuraciones de producción y desarrollo local.

Kompose es un convertidor de Docker Compose a Kubernetes. Esta podría ser una ruta útil para alguien que ya esté ejecutando sus aplicaciones como colecciones de contenedores localmente.

Compose on Kubernetes es una oferta de código abierto recientemente (diciembre de 2018) de Docker que permite implementar archivos de Docker Compose directamente en un clúster de Kubernetes a través de un controlador personalizado.

Taylor Edmiston
fuente
1

Kubespary es útil para configurar clústeres locales. Principalmente, utilicé un clúster basado en vagabundos en una máquina local.

Configuración de Kubespray Puede modificar estas variables para tener la versión de kubernetes deseada.

LADRAR
fuente
1

La desventaja de usar minkubees que genera otra máquina virtual sobre su máquina. Además, con las últimasminikube versión, requiere como mínimo tener 2 CPU y 2GB de RAM de su sistema, lo que lo hace bastante pesado si no tiene el sistema con suficientes recursos.

Esta es la razón por la que me microk8scambié para el desarrollo en kubernetes y me encanta. microk8sadmite DNS, almacenamiento local, tablero, istio, ingreso y muchos más, todo lo que necesita para probar sus microservicios.

Está diseñado para ser una instalación ascendente de Kubernetes rápida y ligera aislada de su entorno local. Este aislamiento se logra empaquetando todos los binarios para Kubernetes, Docker.io, iptables y CNI en un solo paquete instantáneo.

Se puede instalar un clúster de kubernetes de un solo nodo en un minuto con un solo comando:

snap install microk8s --classic

Asegúrese de que su sistema no tenga ningún servicio Docker o Kubelet en ejecución. Microk8sinstalará todos los servicios requeridos automáticamente.

Eche un vistazo al siguiente enlace para habilitar otros complementos microk8s.

https://github.com/ubuntu/microk8s

Puede verificar el estado usando:

velotio@velotio-ThinkPad-E470:~/PycharmProjects/k8sClient$ microk8s.status
microk8s is running
addons:
ingress: disabled
dns: disabled
metrics-server: disabled
istio: disabled
gpu: disabled
storage: disabled
dashboard: disabled
registry: disabled
Prafull Ladha
fuente
> Asegúrese de que su sistema no tenga ningún servicio Docker o Kubelet en ejecución. Pero ya tengo Docker instalado localmente y estoy ejecutando contenedores además de Kubernetes. ¿Eso significa que no puedo instalar microk8s localmente?
Attila Szeremi
1

Eche un vistazo a https://github.com/okteto/okteto y Okteto Cloud . La propuesta de valor es tener la experiencia de desarrollo clásica que trabajar localmente, antes de Docker, donde puede tener recargas en caliente, compilaciones incrementales, depuradores ... pero todos sus cambios locales se sincronizan inmediatamente con un contenedor remoto. Los contenedores remotos le brindan acceso a la velocidad de la nube, permiten un nuevo nivel de colaboración e integran el desarrollo en un entorno similar a la producción. Además, elimina la carga de las instalaciones locales.

Pablo Chico de Guzman
fuente
0

Como lo especificó anteriormente Robert, minikube es el camino a seguir.

Aquí hay una guía rápida para comenzar con minikube. Los pasos generales son:

  • Instalar minikube

  • Cree un clúster de minikube (en una máquina virtual que puede ser VirtualBox o Docker para Mac o HyperV en el caso de Windows)

  • Cree una imagen de Docker de su archivo de aplicación (usando Dockerfile)

  • Ejecute la imagen creando una implementación

  • Cree un servicio que exponga su aplicación para que pueda acceder a ella.

Saty
fuente
0

Esta es la forma en que hice una configuración local para Kubernetes en Windows 10: -

  • Usar Docker Desktop

  • Habilite Kubernetes en la opción de configuración de Docker Desktop

  • En Docker Desktop, el recurso predeterminado asignado para la memoria es de 2 GB, por lo que para usar Kubernetes con Docker Desktop, aumente la memoria.

  • Instale kubectl como cliente para comunicarse con el clúster de Kubernetes

  • Ejecute el comando kubectl config get-contexts para obtener el clúster disponible

  • Ejecute el comando kubectl config use-context docker-desktop para usar el escritorio docker

  • Cree una imagen de Docker de su aplicación

  • Escriba un archivo YAML (método descriptivo para crear su implementación en Kubernetes) apuntando a la imagen creada en el clúster de pasos anterior

  • Exponga un servicio de tipo puerto de nodo para cada una de sus implementaciones para que esté disponible para el mundo exterior

Shivani
fuente