Guía para entender y desplegar Kubernetes en AWS Services

El mundo de los servidores y servicios cloud vive una pequeña gran revolución desde que en 2013 Google presentara su tecnología de código abierto que todos conocemos como Kubernetes. Desde entonces, ríos de tinta han corrido mientras Kubernetes AWS se hacía más y más popular haciendo la vida mucho más fácil para todas aquellas personas que trabajan desarrollando aplicaciones basadas en contenedores Docker, permitiendo orquestar la gestión de múltiples desarrollos simultáneamente en un mismo proyecto a gran escala.

Kubernetes es actualmente una de las tecnologías de moda y cuenta con un notable éxito con el respaldo de compañías como Google, IBM, Red Hat, etc, además de una más que activa comunidad de usuarios. Comenzar a usar Kubernetes es el siguiente paso lógico si ya trabajas con Docker o si tienes experiencia en el despliegue de aplicaciones basadas en contenedores.

Hablando en plata. Cuando coordinar y administrar docker se vuelve una tarea de titanes, Kubernetes facilita el proceso de modo que podemos trabajar invirtiendo nuestros recursos en lo realmente importante.

Cómo funciona Kubernetes

Kubernetes de arquitectura no es difícil de entender. Todo es cuestión de familiarizarse con sus conceptos y abstracciones. La mayoría de estas nos resultan conocidas pues son variaciones de las nociones existentes y familiares, pero otras son específicas de Kubernetes.

  • Clusters Kubernetes: Un clúster se refiere al grupo de máquinas que ejecutan Kubernetes y los contenedores administrados por él.

  • Kubernetes nodos y pods: Cada clúster contiene a su vez los  nodos de Kubernetes. Estos nodos pueden ser máquinas físicas o máquinas virtuales. Kubernetes se encarga de la implementación en ese nivel. Los nodos ejecutan pods, los objetos de Kubernetes más básicos que se pueden crear o administrar. Cada Pod representa una única instancia de una aplicación o proceso en ejecución en Kubernetes, y consta de uno o más contenedores.

  • Servicios de Kubernetes: Debido a que los pods viven y mueren según sea necesario, necesitamos una abstracción diferente para lidiar con el ciclo de vida de la aplicación. Un servicio en Kubernetes describe cómo se puede acceder a un grupo determinado de pods (u otros objetos de Kubernetes) a través de la red.

  • Kubernetes Ingress: Ingress es una API que administra el acceso externo a los servicios de un clúster, generalmente a través de HTTP.

Panel de Kubernetes: Se trata de un  panel de control basado en web con la que nos permite implementar y solucionar problemas de aplicaciones y administrar los recursos del clúster.

Ventajas de Kubernetes

  • Kubernetes maximiza el uso de los recursos disponibles ahorrando tiempo y trabajo en nuestra administración diaria.

  • Kubernetes facilita el despliegue de aplicaciones preconfiguradas con Helm. Helm es esencialmente un administrador de paquetes para Kubernetes. Su función es la de ahorrar tiempo en la instalación y configuración de paquetes..

  • Kubernetes simplifica la gestión del almacenamiento y otros recursos relacionados con las aplicaciones.  Kubernetes proporciona abstracciones para permitir que los contenedores y las aplicaciones se ocupen del almacenamiento de la misma manera desacoplada que otros recursos.

  • Las aplicaciones de Kubernetes pueden ejecutarse en entornos multinube o híbridos. Kubernetes permite el despliegue de nuestras soluciones tanto en la nube como en entornos híbridos en prácticamente cualquier combinación posible. Por ejemplo conjuntamente en un entorno formado por nubes públicas o privadas

AWS Services y Kubernetes

Tal como comentamos, Kubernetes es una tecnología basada en código abierto y está disponible de muchas formas. Por eso es tan fácil encontrar abundante documentación como perderse en un mar de tutoriales. Y es que la flexibilidad de Kubernetes y en especial la que podemos encontrar en Amazon Web Services, hace posible que podamos desde cero, descargar el código fuente nosotros mismos, descargar una distribución Docker comercialmente respaldada de proveedores como IBM, CANONICAL o Red Hat (las ediciones más recientes de Docker vienen con Kubernetes incluido como paquete) y armar así nuestra propia nube privada o directamente contratar el servicio a golpe de click en AWS.

En este artículo, proporcionamos instrucciones paso a paso para varias formas comunes de configurar un clúster de Kubernetes en AWS aunque si me preguntas por una buena opción para comenzar deberíamos recomendar su despliegue como servicio dado que se traduce en un importante ahorro de costes en mantenimiento y al disponer de la potencia y alta disponibilidad que ofrece AWS.

Implementación de Kubernetes en AWS con Kops

Kops es una herramienta de gran utilidad  para instalar, actualizar y operar clústeres de Kubernetes de alta disponibilidad en AWS y otras plataformas en la nube mediante línea de comandos. Kops es capaz, además, de generar plantillas que podemos usar en Terraform con soporte para múltiples complementos personalizados de Kubernetes.

Lo cierto es que es una herramienta altamente recomendable si ya tienes cierta experiencia previa trabajando con Kubernetes porque ahorra una gran cantidad de trabajo. Pero vamos pero veamos cómo sería el proceso con más detalle.

Requisitos previos

Eso sí, antes de continuar, debemos asegurarnos de haber instalado las herramientas kubectl, kops y AWS cli. y de disponer de los permisos necesarios para que kops funcione correctamente:

Configurando AWS CLI con las credenciales de usuario ejecutando:

# aws configure

Crea un bucket de S3 dedicado para el almacenamiento del estado del clúster. El bucket S3 es un contenedor de objetos (archivos) almacenados en S3.

A este depósito lo llamaremos my-cluster-state:

# aws s3api create-bucket --bucket my-cluster-state

Es importante no olvidarse de  activar el control de versiones del depósito para poder recuperarlo más tarde o volver a un estado anterior en caso de falla:

# aws s3api put-bucket-versioning --bucket my-cluster-state --versioning-configuration Estado = Habilitado

Configuración DNS. Podemos optar por usar un DNS público o privado. Teniendo en cuenta que para el DNS público, necesitaremos un dominio o subdominio de nivel superior válido para crear el clúster. Esto es un requisito imprescindible, para entendernos, los nodos requieren DNS para descubrir el maestro y el maestro para descubrir todos los servidores. En otras palabras, sin dominio y DNS no hay cluster posible. Por suerte, en AWS, para crear un dominio cuyo registrador no sea AWS podemos crear una zona alojada en  AWS  Route 53 y cambie los registros del servidor de nombres en su registrador en consecuencia.

En este ejemplo, usaremos un DNS privado simple para crear un clúster basado en chismes. El único requisito para configurar esto es que el nombre de nuestro clúster termine con k8s.local.

Crear el clúster de Kubernetes

Todos los comandos de kops a continuación que incluyen la opción --yes se pueden ejecutar primero sin ella para mostrar qué cambios se llevarían a cabo (por ejemplo, qué recursos de AWS se crearán o destruirán cuando se ejecute el comando con la opción --yes).

Por ejemplo, con el siguiente comando crearemos un clúster 1 maestro (una instancia m3.medium) y 2 nodos (dos instancias t2.medium) en la zona de disponibilidad us-west-2a:

# kops create cluster \ --name my-cluster.k8s.local \ --zones
us-west-2a \ --dns private \ --master-size=m3.medium \ 
--master-count=1 \ --node-size=t2.medium \ --node-count=2 \ --state 
s3://my-cluster-state \ --yes

Seguro que te has fijado que algunos parámetros cuentan con valores predeterminados: --master-size, --master-count, --node-size y --node-count.

Aunque para este ejemplo hemos utilizado los valores predeterminados, estos podemos modificarlos a medida. En nuestro ejemplo, el resultado sería el mismo si no hubiéramos especificado esas opciones pero mejor ponerlo todo para que sirva de referencia en el futuro.

Así, tras ejecutar el comando, observaremos que kops acaba de crear un nodo maestro en cada zona de disponibilidad especificada, por lo que la opción: --zones us-west-2a, us-west-2b daría como resultado 2 nodos maestros, uno en cada una de las dos zonas.

El proceso de creación lleva algo de tiempo. Un clúster no es lo mismo que levantar una simple máquina virtual y lleva algo más de tiempo para que todas las instancias necesarias puedan iniciarse. Pero si te quedas con la duda de si todo ha ido bien, Kops proporciona un comando para verificar el estado del clúster y verificar que esté listo:

# kops validate cluster --state=s3://my-cluster-state Using cluster from kubectl context: my-cluster.k8s.local

Si todo ha ido bien, el output será algo similar al siguiente:

Validating cluster my-cluster.k8s.local INSTANCE GROUPS NAME ROLE MACHINETYPE MIN MAX SUBNETS master-us-west-2a Master m3.medium 1 1 us-west-2a nodes Node t2.medium 2 2 us-west-2a 
NODE STATUS NAME ROLE READY ip-172-20-32-203.us-west-2.compute.internal 
node True ip-172-20-36-109.us-west-2.compute.internal 
node True ip-172-20-61-137.us-west-2.compute.internal master True Your cluster my-cluster.k8s.local is ready

Si algo no ha salido bien o necesitamos  realizar algunos cambios en el clúster, podemos usar las opciones edit y update:

# kops edit cluster my-cluster.k8s.local
# kops update cluster my-cluster.k8s.local --yes

Actualizando nuestro clúster con Kops:

Kops también podemos actualizar un clúster existente (maestro y nodos) a la última versión recomendada de Kubernetes sin tener que especificar la versión exacta. Veamos algunos ejemplos:

  1. Para actualizar Kubernetes:

    # kops upgrade cluster \ --name $NAME \ --state s3://my-cluster-state \ --yes
  2. Actualizando el almacén de estado para que coincida con el estado del clúster.

    # kops update cluster \ --name my-cluster.k8s.local \ --state s3://my-cluster-state \ --yes
  3. Lanzar una actualización progresiva:

    # kops rolling-update cluster \ --name my-cluster.k8s.local \ --state s3://my-cluster-state \ --yes

Esto realizará actualizaciones en todas las instancias del clúster, primero el maestro y luego los trabajadores.

Eliminar el clúster

Para destruir un clúster existente que usamos para experimentar o realizar pruebas, por ejemplo, podemos ejecutar:

Y hasta aquí con Kops. Si te has quedado con el gusanillo de saber más. En AWS disponemos de un excelente artículo donde se detallan esta y otra información.

Uso del servicio administrado de Kubernetes EKS

Amazon Elastic Container Service para Kubernetes (EKS) es un servicio totalmente administrado que se encarga de toda la configuración y creación del clúster, lo que garantiza la compatibilidad con varias zonas de disponibilidad en todos los clústeres y el reemplazo automático de las instancias en mal estado (nodos maestros o de trabajo). También parchea y actualiza los clústeres a la última versión recomendada de Kubernetes sin requerir ninguna intervención.

Si bien EKS proporciona niveles similares de integración con otros servicios de Amazon como ECS, se basa en el modelo de orquestación abierta de Kubernetes en lugar de en un modelo específico de AWS. Gracias a esto, EKS ofrece un SLA de disponibilidad del 99,95%.

Algunas de sus ventajas y características son:

Aprovisionamiento y configuración

  • Plano de control administrado EKS administra automáticamente la disponibilidad en todas las zonas de disponibilidad y la escalabilidad de los componentes de capa de persistencia de la API de Kubernetes y etcd para cada clúster.

  • Grupos de nodo administrados EKS permite utilizar nodos administrados mediante la integración perfecta con Amazon EC2 Auto Scaling y la capacidad de utilizar instancias Spot, Arm e Inf (Neuron).

  • AWS Fargate es un servicio para ejecutar contenedores sin servidor (serverless). Fargate elimina la necesidad de elegir un tipo de instancia, actualizar y administrar máquinas virtuales (EC2) y escalar la capacidad del clúster, centrándose únicamente en ejecutar sus contenedores.

  • Consola y eksctl. AWS ofrece dos formas nativas de administrar y aprovisionar el clúster EKS. A través de la consola de AWS, se puede administrar, ver y solucionar problemas en un solo lugar centralizado. También podemos utilizar eksctl, una herramienta de línea de comandos (CLI) de código abierto para simplificar las operaciones de clúster, incluida la administración de nodos, el aprovisionamiento de infraestructura y los complementos.

  • Complementos administrados (Add-ons) Todos los complementos disponibles a través de la API de EKS son validados por AWS y se pueden agregar en el momento de aprovisionamiento del clúster o posterior.

Actualizar

  • Control de versiones del plano de control. Amazon EKS proporciona una forma prescriptiva de actualizar el Plano de control, el proceso de actualización consiste en que Amazon EKS lanza nuevos nodos del servidor API con la versión actualizada de Kubernetes para reemplazar los nodos existentes, ya que es un servicio gestionado,

  • Actualizar grupos de nodos administrados. El uso de grupos de nodos administrados es una forma de automatizar el aprovisionamiento y la administración del ciclo de vida de los nodos. Al utilizar Amazon EKS, los nodos son  actualizados automáticamente

  • Actualizar grupos de nodos auto gestionados (Self-managed Node Groups)

Seguridad

  • OpenID Connect es un protocolo de autenticación basado en OAuth 2.0. Amazon EKS permite utilizar un proveedor de identidad OIDC público como Amazon o su propio proveedor de identidad.

IAM Roles para cuentas de servicio (service accounts)Cuando se lanzó Amazon EKS, no había una forma nativa de asociar roles con objetos Kubernetes. Ahora se puede asociar un IAM Role a una cuenta de servicio de Kubernetes

Auditoría

Amazon EKS está integrado con AWS CloudTrail, un servicio que proporciona un registro de las acciones realizadas por un usuario, rol o servicio de AWS en Amazon EKS. CloudTrail captura todas las llamadas API de servicio de Amazon EKS como eventos, incluidas las llamadas a la consola de Amazon EKS, llamadas de código desde los clientes CLI y operaciones sobre la API de Amazon EKS.

Redes

  • API server público y privado. De forma predeterminada, EKS crea un API Server público con integración con AWS IAM y RBAC nativo de Kubernetes. Para restringir el acceso solo a través de un Amazon VPC , el clúster le permite habilitar el acceso privado.

  • CNI VPC. AWS admite de forma nativa el complemento CNI VPC de código abierto que permite a los pods tener direcciones IP dentro del rango de su VPC y la capacidad de utilizar de manera transparente los recursos de seguridad y red que AWS proporciona.

Nube híbrida

Amazon EKS Anywhere  permite crear y poner en funcionamiento clústeres EKS en su propio centro de datos y con las mismas herramientas que EKS en AWS. La distribución utilizada por Amazon EKS es EKS Distro , que está disponible en forma de código abierto en GitHub.

Lo cierto es que con Amazon EKS todo son ventajas y se resume el proceso de creación de nuestro cluster en un mero “point and click” en donde podemos definir múltiples parámetros de una manera cómoda y segura.

Lanzando de Kubernetes en EC2 con Rancher

Rancher es una plataforma de gestión de contenedores completa que facilita la implementación de Kubernetes y contenedores. Rancher es compatible de forma nativa con Kubernetes y permite a los usuarios controlar sus funciones a través de una interfaz de usuario simple, que incluye actualizaciones a la última versión estable. Se integra con LDAP, AD y GitHub para la autenticación. Rancher también proporciona un catálogo de aplicaciones con más de 90 aplicaciones populares de Docker.

Requisitos previos

Configuración de Rancher en AWS

Rancher (la aplicación) se ejecuta en RancherOS, que está disponible como una imagen de máquina de Amazon (AMI) y, por lo tanto, se puede implementar en cualquier instancia EC2.

Crear instancia de RancherOS en EC2

Después de instalar y configurar la herramienta AWS CLI, el siguiente paso resulta en crear una instancia EC2 usando RancherOS AMI:

$ aws ec2 run-instances --image-id ami-12db887d --count 1
 --instance-type t2.micro --key-name my-key-pair --security-groups 
my-sg

Esto creará una nueva instancia t2.micro EC2 con RancherOS en la región de AWS ap-south-1.

Iniciando Rancher Server

Tras un tiempo de espera ya podremos iniciar nuestro servidor. El siguiente paso será conectar con nuestro usuario mediante SSH al servidor e iniciar Rancher mediante el siguiente comando:

$ sudo docker  run  --name rancher-server -d 
--restart=unless-stopped \ 
  -p 8080:8080 rancher/server:stable

Esto puede tardar unos minutos. Una vez hecho esto, se puede acceder a la interfaz de usuario en el puerto 8080 de la instancia EC2.

Tras este paso conviene securizar un poco el entorno dado que por defecto cualquiera puede acceder a la interfaz de usuario y la API de Rancher, se recomienda configurar el control de acceso.

Creación de un clúster de Kubernetes a través de Rancher en AWS

Configurando la plantilla del entorno de Kubernetes

Un entorno en Rancher es una entidad lógica para compartir implementaciones y recursos con diferentes conjuntos de usuarios. La manera de crear y configurar estos entornos es mediante plantillas. Pero no te preocupes ya que el catálogo de aplicaciones de Rancher incluye plantillas para Kubernetes que se pueden seleccionar y modificar para configurar, entre otras: deshabilitar complementos (Rancher instala por defecto: Helm, Dashboard y SkyDNS), habilitar copias de seguridad y seleccionar el proveedor de nube para administrar balanceadores de carga, nodos y rutas de red.

Creando nuestro clúster de Kubernetes

Tal como comentamos, con Rancher agregar un entorno de Kubernetes es solo cuestión de seleccionar la plantilla configurada adecuadamente para nuestro caso de uso e ingresar el nombre del clúster. Si el control de acceso está activado, podemos incluso agregar miembros y seleccionar su función de membresía.

Agregando hosts al clúster

Ahora necesitamos agregar al menos un host al entorno de Kubernetes recién creado. En este caso, los hosts serán instancias AWS EC2 creadas previamente.

Una vez que se haya agregado el primer host, Rancher iniciará automáticamente la implementación de la infraestructura (maestra), incluidos los servicios de Kubernetes (es decir, kubelet, etcd, kube-proxy, etc.).

Nota: Los hosts que se usarán como nodos de Kubernetes requerirán que los puertos TCP 10250 y 10255 estén abiertos para kubectl. Asegúrese de revisar la lista completa de requisitos de Rancher para los anfitriones.

Implementación de aplicaciones en el clúster de Kubernetes

Una vez que el clúster está listo, ya podemos implementar nuestras aplicaciones en contenedores utilizando el catálogo de aplicaciones disponible en Rancher o kubectl.

Conclusión:

Y llegamos al final del artículo. Aquí hemos visto las tres formas más populares de desplegar nuestro clúster Kubernetes en AWS. Quizá la más sencilla es usando EKS (Elastic Container Service) que nos ofrece Amazon pero no es la única. Utilizando herramientas de implementación como Kops o Rancher podemos lograr ese grado de personalización deseado y acelerar nuestra implementación hacia los límites que queramos alcanzar.