Investigando a los Kubernetes desde dentro

publicado en: drivers | 0

Mientras trabajaban en uno de nuestros proyectos, los expertos de Apriorit tuvieron que sumergirse en las profundidades de Kubernetes y aprender a crear un nuevo componente de él. Nuestros desarrolladores adquirieron un profundo conocimiento de su infraestructura y la lógica detrás de varios componentes. La arquitectura de Kubernetes permite combinar hardware de varios proveedores y diferentes plataformas de nube en una sola aplicación.

Construir un proyecto con Kubernetes tiene varios desafíos ocultos. Hoy hablaremos de los componentes clave de Kubernetes y echaremos un vistazo al interior del marco. Este artículo será útil para los desarrolladores que planeen utilizar Kubernetes para desarrollar aplicaciones web.

¿Qué es Kubernetes?

Kubernetes es un marco de orquestación de contenedores para el despliegue, la gestión y el escalado automatizados de software. Fue creado originalmente por Google como un proyecto interno en 2014. Ahora, Kubernetes es un proyecto de código abierto mantenido por la Cloud Native Computing Foundation y distribuido bajo la licencia de Apache 2.0.

El marco permite gestionar los contenedores en máquinas separadas, asegurando así que un sistema mantenga el estado deseado, que se especifica con las declaraciones YAML. Todo lo que un desarrollador de sistemas necesita hacer es crear una declaración precisa del sistema y un grupo de Kubernetes siempre tratará de mantener el estado declarado.

Lee también:

Microservicio y seguridad de los contenedores: 10 mejores prácticas

Beneficios del uso de Kubernetes

Esta plataforma de contenedores está evolucionando rápidamente. Consideremos las principales ventajas de los Kubernetes:

  1. Es cómodo de usar. Para hacer que su sitio web se mantenga mientras el grupo de Kubernetes esté operativo, sólo tiene que hacerlo:
    • declarar un sitio web que incluye un contenedor con una aplicación de servidor, base de datos y almacenamiento de archivos
    • aplicar esta declaración del sitio web a un sistema de Kubernetes
  2. El propio hardware (nodos, bases de datos, sistemas de almacenamiento de archivos) puede estar ubicado en cualquier lugar . Por lo tanto, es posible reducir los costos alquilando varias piezas de hardware de diferentes proveedores y luego combinando el hardware en un clúster de Kubernetes.
  3. Es un proyecto de código abierto , así que puedes usarlo gratis e incluso contribuir a él. Todo el código fuente está disponible en GitHub, y la mayor parte está escrito en Go. Puedes crear una parte autónoma de Kubernetes y compartirla con la comunidad.

Tanto la AWS como los Kubernetes son herramientas para la creación de aplicaciones en la nube, pero como marco de trabajo, los Kubernetes superan a la AWS. De hecho, puede utilizar los Kubernetes como un programa shell para unir recursos informáticos de diferentes proveedores para cualquier servicio.

Los kubernetes pueden ser usados como un shell de programa

Documentación y comunidad de Kubernetes

Kubernetes es un marco relativamente nuevo y de rápido desarrollo. Aunque es emocionante ver cómo crece, sus constantes cambios hacen que sea más difícil de aprender.

La documentación oficial se genera automáticamente a partir del código fuente, y la documentación de la herramienta es básicamente un conjunto de comandos soportados. La documentación no oficial, a su vez, es a menudo demasiado abstracta o dedicada a un tema técnico en particular.

Cada recurso de Kubernetes debe tener una versión especificada en su definición:

                apiVersión: v1

Tengan en cuenta que esta no es una versión de Kubernetes sino una versión de la definición de recursos. En el momento de escribir este artículo, la última versión de Kubernetes es la 1.14, pero contiene muchos componentes sin terminar con las versiones v1beta1 o incluso v1alpha1. Como resultado, la instalación de ciertos componentes y la garantía de su compatibilidad con las diferentes versiones de Kubernetes puede ser un problema. Afortunadamente, los miembros de la comunidad de Kubernetes han desarrollado soluciones provisionales para solucionar algunos de estos problemas.

Lee también:

3 pasos para desplegar su sitio web en la nube usando AWS

Esto hace que Kubernetes sea una buena opción para las soluciones multi-nube. Repasemos sus principios y componentes clave.

Trabajando con Kubernetes

Hay cuatro etapas principales de trabajo con los Kubernetes:

  1. Creación de un cluster de Kubernetes
  2. Declarar una infraestructura
  3. Aplicación de la infraestructura
  4. Administración del cúmulo

Un cluster es un conjunto de nodos que alberga su entorno. Hay dos tipos de nodos: el Maestro y el trabajadores . El nodo Master ejecuta toda la funcionalidad de administración del clúster. Los nodos trabajadores ejecutan contenedores de trabajo, que incluyen partes de su servicio web. Si tiene al menos un nodo trabajador, el entorno se puede llamar un clúster. Un nuevo nodo del clúster se configura con kubeadm. Esta herramienta convierte una máquina en un nodo maestro o de trabajo.

Puedes crear un nodo con los roles de maestro y trabajador simultáneamente. Esto puede lograrse asignando un nodo principal con derechos para ejecutar contenedores de trabajo. Una infraestructura tan pequeña es útil para el desarrollo y las pruebas. Pero nunca se despliega en producción.

Una vaina es un conjunto de contenedores que funcionan en el mismo nodo. Una vaina consiste en uno o varios contenedores que están estrechamente acoplados.

Una declaración de infraestructura se escribe en uno o varios archivos YAML. Describe cómo debe ser su clúster para funcionar correctamente:

  • Número de contenedores
  • Roles de ejecución de contenedores
  • Mapas de configuración de contenedores
  • Credenciales para acceder a bases de datos y archivos
  • Y más

Echemos un vistazo a la descripción del entorno de Kubernetes-dashboard como ejemplo de un contenedor de apoyo para la gestión de un clúster con una interfaz web fácil de usar que muestra las estadísticas del clúster. La descripción declara:

  • Secreto – una ubicación de datos sensibles del grupo
  • ServiceAccount – una cuenta para ejecutar un servicio con un tablero de mandos
  • Rol – una lista de acciones que el tablero puede realizar
  • Despliegue – una entidad que controla el estado y la disponibilidad de los Pod
  • Servicio – un punto de entrada a un contenedor

La aplicación de la infraestructura a un clúster es tarea de un administrador. Normalmente se ejecuta con kubectl. Esta utilidad se instala en el nodo maestro junto con otros componentes de Kubernetes. Es la fachada de un servidor REST API que se ejecuta en uno de los contenedores del nodo Master.

Generalmente, instalar un entorno bien configurado es una tarea sencilla. Puedes hacerlo con el siguiente comando:

                kubectl create -f infrastructure.yaml

Un archivo de descripción del entorno puede almacenarse fuera de la red. A continuación, te explicamos cómo puedes instalar un tablero de mandos para tu clúster:

                kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

El Kubeadm y el kubectl también se utilizan para la administración de grupos. Kubeadm puede ser usado para cambiar, añadir y eliminar nodos. Kubectl se requiere para la administración del contenido de los nodos: cambiar, agregar y eliminar contenedores (o Pods) y sus componentes lógicos. Es importante recordar que kubectl separa el administrador del hardware. Con kubectl, un administrador trabaja con el entorno del contenedor, no con el hardware en el que está desplegado.

Puede encontrar una amplia introducción al marco de Kubernetes con casos de uso en la documentación oficial del proyecto.

Componentes clave de Kubernetes

Como hemos mencionado, cada grupo de Kubernetes contiene nodos maestros y trabajadores. Ambos tienen sus propios paquetes de componentes. Kubeadm ayuda a configurar un conjunto específico de componentes para un nodo objeto. Un agente demonio, kubelet, controla todos los componentes de cada nodo y registra su trabajo.

Para formar un clúster, necesita instalar los componentes de Kubernetes en el nodo Maestro usando kubeadm. Esta herramienta:

  • crea claves y certificados RSA para el cluster
  • descarga todos los contenedores necesarios de los depósitos
  • configura kubelet para monitorear los contenedores del nodo maestro y reiniciarlos si es necesario.

Los principales componentes del programa del nodo maestro son el servidor de la API y la base de datos etcd . Ambos se lanzan en contenedores, utilizan WebSockets para comunicarse entre sí y son partes lógicas de un cluster de Kubernetes.

El servidor API y la base de datos etcd son Pods, pero no se muestran en la lista de Pods. Están listados en el espacio de nombres del sistema kube por defecto. Para verlos, ejecuta este comando:

                kubectl get pods -n kube-system

Estos son Pods estáticos con archivos de definición YAML almacenados en el demonio kubelet. Si un contenedor se bloquea, kubelet lo reinicia inmediatamente.

Cuando el nodo maestro está configurado, se genera un token de seguridad. Necesitará este token para autentificar una máquina (nodo) cuando la integre en un grupo de nodos trabajadores. Cuando configuras un nodo trabajador con kubeadm, también ejecuta kubelet. En este caso, kubelet controla la condición de los nodos trabajadores en lugar de controlar la condición de los Pods estáticos.

Puedes administrar el clúster utilizando la API del servidor REST. Puedes enviar comandos al servidor de la API utilizando kubectl. Kubectl transforma su comando en una cadena de petición y una petición POST en el formato de un documento JSON con el recurso solicitado. Luego envía la solicitud al servidor de la API y emite el resultado.

El flujo de trabajo del servidor de la API y otros componentes del clúster es más complejo. En la siguiente sección, explicamos algunos aspectos básicos de estos procesos complejos.

Servidor API y kubeconfig

El servidor de la API es el corazón de un clúster. Su dirección IP se especifica en el archivo de configuración del nodo maestro (/etc/kubernetes/admin.conf). Normalmente, este documento se copia a ~/.kube/config y se denomina kubeconfig. Este archivo también contiene la autoridad de certificación y una lista de usuarios con acceso a esta configuración. Por defecto, se crea un perfil de administrador de clúster y se llama cluster-admin . Kubeadm también crea un usuario kubernetes-admin con los siguientes parámetros:

                ...usuarios:- nombre: kubernetes-adminuser:cliente-certificado-datos:...

Usando el archivo kubeconfig, una aplicación puede ejecutar comandos como un administrador. Por eso las aplicaciones administrativas (por ejemplo, kubectl), que son necesarias para que el clúster funcione pero que se almacenan fuera de él, utilizan los datos del archivo kubeconfig para autenticarse en el servidor de la API.

Si una aplicación que gestiona un clúster está almacenada en su interior, el acceso a los recursos del clúster debe configurarse con funciones específicas. Utilizando un rol de administrador, un Pod puede lanzarse con variables de entorno predefinidas y archivos de configuración montados. Estos archivos permiten a un Pod ejecutar comandos para crear/eliminar un determinado tipo de recurso, solicitar un certificado, etc.

El paquete clientcmd proporciona acceso a los datos de autenticación en el servidor de la API. Usando este paquete, puede crear una estructura de configuración de cliente. Luego, usando esta estructura y el resto del paquete, puede crear un objeto cliente REST para el servidor de la API. Una vez creado el objeto cliente, puedes usarlo para gestionar el clúster desde tu aplicación.

La siguiente figura ilustra cómo una aplicación carga la configuración.

Adición de aplicaciones de terceros

La posibilidad de incluir aplicaciones de terceros utilizando enlaces a GitHub o a cualquier otro repositorio es una característica única de Go.

Por ejemplo, para crear un objeto Pod en el código de su aplicación, puede incluir su descripción desde el repositorio k8s.io:

                importar "k8s.io/api/core/v1 "Entonces, puedes añadir este trozo de código:pod := v1.Pod {/// Tu definición aquí}

Puede añadir cualquier paquete de repositorio público (o privado, si tiene acceso a él) a su entorno de Kubernetes. Como resultado, puede construir su aplicación a partir de los paquetes de diferentes proyectos externos. Para gestionar las dependencias externas (descargando los paquetes ), puede utilizar la utilidad Dep.

base de datos etcd

Etcd es una base de datos de velocidad optimizada que almacena información en pares clave-valor. El nodo Maestro utiliza una instancia de esta base de datos para almacenar todo tipo de datos, desde configuraciones de Pod hasta registros. Etcd tiene una interfaz de red protegida. La base de datos tiene una arquitectura relativamente simple que asegura un rendimiento rápido y fiable. Etcd es uno de los componentes más importantes de un cluster de Kubernetes.

Nuestra experiencia con los Kubernetes

Mientras trabajaba en nuestro proyecto Kubernetes, nuestro equipo de desarrollo de Apriorit creó un controlador para supervisar los recursos personalizados. En Kubernetes, dichos recursos se llaman políticas . Los controladores de políticas se llaman para asegurar que un clúster funciona correctamente. Veamos qué funciones desempeñan.

Controladores de Kubernetes

Los controladores se encargan de mantener el estado deseado del cúmulo. Supervisan todos los cambios en los recursos del cúmulo de su propio tipo y comparan constantemente el estado observado con el deseado. Los controladores son implementaciones de recursos.

Los controladores estándar no cumplen necesariamente con las entidades básicas. Algunos de ellos pueden gestionar sólo una parte de una entidad descrita en la configuración de grupos. Por ejemplo, el campo ReplicaSet en la Despliegue dicta cuántos Pods con ciertos recursos debe contener un cluster, y los campos específicos de definición de contenedor especifican qué discos deben ser montados en un contenedor. Un Controlador de Replicación dedicado supervisa el número de Pods en un cluster. Un Controlador de Volumen se encarga de asignar los volúmenes de los contenedores.

La versión 1.9 y superior de Kubernetes permite a un administrador crear sus propios recursos y controladores. Puede utilizar un nuevo recurso si:

  • está registrado en un grupo
  • se ejecuta un controlador para monitorear el estado del nuevo recurso.

Un controlador puede utilizar cualquier paquete k8s y obtener cualquier derecho. Esta flexibilidad le permite crear un controlador para cualquier propósito. Por ejemplo, hay un controlador que informa de los cambios en el Pod a Slack.

Políticas de Kubernetes

Una política determina la forma final del recurso creado en un grupo. En el momento de escribir este artículo, la versión actual de Kubernetes sólo admite la implementación de políticas de mutación. De acuerdo con esta política, un administrador o una aplicación crea un recurso, y el controlador lo ajusta a la política. El siguiente paso será la implementación de una política de validación para evitar la creación de recursos que violen las políticas de validación.

Crear un recurso en Kubernetes lleva tiempo. Hay varias etapas escribiendo un comando a kubectl y escribiendo un nuevo recurso a etcd. El proceso incluye la etapa de mutación y validación. En esta etapa, la definición de un recurso se transmite a un webhook registrado para su procesamiento y/o verificación. Un webhook utiliza peticiones POST en un documento JSON. Este archivo debe contener una descripción completa del recurso, incluyendo los metadatos del objeto y de la solicitud.

El proceso de verificación de recursos con ganchos se llama Control de Admisión Dinámico. El controlador de admisión que creamos para nuestro proyecto utiliza este proceso para identificar y cambiar los nuevos recursos en la etapa en que se crea.

Conclusión

Construir un proyecto con Kubernetes hace que el proceso de desarrollo sea más rápido, más escalable y más flexible. Una vez configurado el sistema, se gestiona automáticamente y se cura a sí mismo si alguna parte se cae.

La configuración de una red requiere un conocimiento básico de Docker y un profundo conocimiento de la infraestructura de Kubernetes. Kubernetes utiliza un conjunto de CLIs y APIs para ejecutar comandos. En este artículo, hemos tratado la creación de un clúster, la escritura de descripciones de la infraestructura y el entorno, y el trabajo con el servidor de la API y la base de datos etcd.

¿Tiene en mente un ambicioso proyecto de Kubernetes? No dude en contactar con los expertos en desarrollo de software en la nube de Apriorit para empezar a trabajar en él!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *