Elastic Kubernetes Service (EKS) es un servicio de Kubernetes administrado que está alojado en AWS.
La razón principal para usar EKS es eliminar la carga de administrar pods, nodos, etc. Ejecutar Kubernetes en AWS actualmente requiere una gran cantidad de experiencia técnica y, a menudo, queda fuera del control de muchas organizaciones. Con EKS, la infraestructura requerida es administrada por el equipo "interno" de Amazon, lo que deja a los usuarios con un motor de Kubernetes completamente administrado que se puede usar a través de una API o herramientas estándar de kubectl.
EKS admitirá todas las funciones de Kubernetes, incluidos espacios de nombres, configuraciones de seguridad, cuotas y tolerancias de recursos, estrategias de implementación, escaladores automáticos y más. EKS le permitirá ejecutar su propio plano de control, pero también se integra con AWS IAM para que pueda mantener su propio control de acceso a la API.
EKS se creó sobre la solución "Kubernetes como servicio" existente de Amazon llamada Elastic Container Service for Kubernetes (EKS) es un servicio administrado por AWS que simplifica la implementación, la administración y el funcionamiento de los clústeres de Kubernetes en la nube de AWS.
Si está ejecutando Kubernetes en AWS, es responsable de administrar el plano de control (es decir, nodos maestros y nodos trabajadores). También debe asegurarse de que el servidor API sea altamente disponible y tolerante a fallas, etc.
EKS le quitó la carga de administrar el plano de control; al hacerlo, ahora puede concentrarse en ejecutar sus cargas de trabajo de Kubernetes. Se usa más comúnmente para aplicaciones sin estado, como microservicios, ya que Amazon (EKS) administra el plano de control.
En esta guía, aprenderemos a crear un clúster de Kubernetes en AWS con EKS. Aprenderá a crear un usuario administrativo para su clúster de Kubernetes. También aprenderá a implementar una aplicación en el clúster. Finalmente, probará su clúster para asegurarse de que todo funcione correctamente.
¡Empecemos!
Requisitos
- Una cuenta de AWS.
- El artículo asume que está familiarizado con Kubernetes y AWS. Si no es así, tómese un tiempo para revisar la documentación de ambos antes de comenzar esta guía.
Creación de un usuario administrador con permisos
Comencemos con la creación de un usuario administrador para su clúster.
1. Inicie sesión en su consola de AWS y vaya a IAM. Haga clic en Usuarios> Añadir usuarios.
2. En la siguiente pantalla, proporcione un nombre de usuario como admin . Seleccione Clave de acceso - Acceso programático. Haga clic en Siguiente :Permisos
3. En la siguiente pantalla, selecciona Adjuntar políticas existentes directamente. . Haga clic en Acceso de administrador . Haga clic en Siguiente :Etiquetas .
El Acceso de administrador La política es una política integrada con Amazon Elastic Container Service (ECS). Proporciona acceso completo a todos los recursos de ECS y todas las acciones en la consola de ECS. El principal beneficio de esta política es que no necesitamos crear ni administrar un usuario adicional con privilegios adicionales para acceder al servicio de AWS EKS.
Su usuario administrador puede crear instancias de EC2, pilas de CloudFormation, depósitos de S3, etc. Debe tener mucho cuidado con quién otorga este tipo de acceso.
3. En la siguiente pantalla, haz clic en Siguiente :Revisión
4. En la siguiente pantalla, haz clic en Crear usuario .
5. En la siguiente pantalla, obtendrá un Éxito verde mensaje. El ID de la clave de acceso y
Claves de acceso secretas también se muestran en esta pantalla. Necesitará estas claves para configurar sus herramientas CLI más adelante, así que anote estas claves en otro lugar.
Creando una Instancia EC2
Ahora que ha creado el usuario administrativo, creemos una instancia EC2 para usarla como su nodo principal de Kubernetes.
1. Escriba EC2 en el cuadro de búsqueda. Haga clic en el enlace EC2. Haga clic en Iniciar instancia .
2. Seleccione la AMI de Amazon Linux 2 (HVM) para su instancia EC2. Usaremos esta AMI de Amazon Linux para facilitar la instalación de Kubernetes y otras herramientas necesarias más adelante, como:kubectl!, docker, etc.
3. En la siguiente pantalla, haga clic en Siguiente :Configurar instancia Detalles .
3. En la siguiente pantalla, habilite la Asignación automática de IP pública opción. Dado que el servidor está dentro de una subred privada, no se podrá acceder a él desde el exterior. Puede dar a sus servidores direcciones IP públicas asociando una dirección IP elástica con la instancia. Al hacer esto, su EC2 y ELK son accesibles. Haga clic en Siguiente :Almacenamiento .
3. En la siguiente pantalla, haga clic en Siguiente:Agregar etiquetas> Siguiente:Configurar grupo de seguridad .
4. En la siguiente pantalla, haga clic en Revisar y ejecutar> Lanzamiento .
5. Aparecerá un cuadro de diálogo de par de claves. Presiona Crear un nuevo par de claves . Asígnele un nombre, luego descargue y almacene el archivo .pem en una ubicación segura. Haz clic en Iniciar instancia .
Configurando las Herramientas de Línea de Comandos
Ahora que ha creado una instancia EC2, necesita instalar el cliente para ella. En términos de AWS, un cliente es una herramienta de línea de comandos que le permite administrar objetos en la nube. En esta sección, aprenderá a configurar las herramientas de la interfaz de línea de comandos (CLI).
1. Navegue a su tablero EC2. Debería ver su nueva instancia EC2 ejecutándose. De lo contrario, su instancia podría iniciarse por primera vez, esperar 5 minutos y volver a intentarlo. Una vez que su instancia se esté ejecutando, haga clic en Conectar .
2. En la siguiente pantalla, haga clic en Conectar .
Será llevado a una sesión SSH interactiva en su navegador. SSH le permite conectarse y operar de forma segura en un servidor remoto. La sesión SSH interactiva nos permitirá instalar las herramientas de línea de comandos para EKS y Kubernetes directamente en su instancia EC2.
Una vez que inicie sesión en la sesión SSH, lo primero que deberá hacer es verificar su versión de aws-cli. Esto es para asegurarse de que está utilizando la última versión de AWS CLI. La CLI de AWS se utiliza para configurar, administrar y trabajar con su clúster.
Si su versión está desactualizada, es posible que encuentre algunos problemas y errores durante el proceso de creación del clúster. Si su versión es anterior a la 2.0, deberá actualizarla.
3. Ejecute el siguiente comando para verificar su versión de CLI.
aws --version
Como puede ver en el resultado a continuación, estamos ejecutando la versión 1.18.147 de aws-cli , que está muy desactualizado. Actualicemos la CLI a la última versión disponible, que es v2+ al momento de escribir esto.
4. Ejecute el siguiente comando para descargar la última versión disponible de AWS CLI en su instancia EC2. curl descargará su archivo desde la URL dada, -o le dará el nombre que elija, y "awscli-exe-linux-x86_64.zip" es el archivo que se descargará
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
5. Una vez que termine de descargarse, ejecute el siguiente comando para extraer el contenido de su archivo descargado al directorio actual.
unzip awscliv2.zip
6. A continuación, ejecute el comando which aws para configurar su enlace para la última versión de AWS CLI. Este comando le permitirá saber en qué parte de la RUTA de su entorno se puede encontrar, para que pueda ejecutarlo desde cualquier directorio.
which aws
Como puede ver en el siguiente resultado, la AWS CLI desactualizada se encuentra en /usr/bin/aws .
7. Ahora necesita configurar su aws-cli ejecutando un comando de actualización con algunos parámetros. El primer parámetro ./aws/install nos ayudará a instalar AWS CLI en el directorio actual. El segundo parámetro --bin-dir indica en qué parte de la RUTA de su entorno se ubicará la CLI de AWS, y el tercer parámetro --install-dir es una ruta relativa a bin-dir. Este comando asegurará que todas sus rutas estén actualizadas.
sudo ./aws/install --bin-dir /usr/bin --install-dir /usr/bin/aws-cli --update
8. Vuelva a ejecutar el comando aws --version para asegurarse de que está utilizando la última versión.
aws --version
Debería ver la versión de la CLI de AWS actualmente instalada. Como puede ver en el resultado a continuación, ahora estamos usando la versión 2.4.7 de AWS CLI. Esta es la última versión y no le dará ningún problema mientras configura los siguientes pasos.
9. Ahora que su entorno está configurado correctamente, es hora de que configure con qué cuenta de AWS desea comunicarse a través de la CLI de AWS. Ejecute el siguiente comando para enumerar las variables de entorno de su cuenta actualmente configuradas con el alias que desea usar junto con ellas.
aws configure
Esto le mostrará todas las variables de entorno de su cuenta de AWS que están configuradas actualmente. Debería ver algo como esto en la salida a continuación. Debe establecer algunos parámetros de configuración para que la CLI de AWS se comunique con las cuentas necesarias. Ejecute el siguiente comando, que lo llevará a través de un asistente de configuración para configurar su cuenta de AWS.
- ID de clave de acceso de AWS [Ninguna]:ingrese la clave de acceso de AWS que anotó anteriormente.
- Clave de acceso secreta de AWS [Ninguna]:ingrese la clave de acceso secreta de AWS que anotó anteriormente.
- También debe especificar el nombre de la región predeterminada donde estará su clúster de EKS. Debe elegir una región de AWS en la que estará el clúster de EKS que desee y que esté más cerca de usted. En este tutorial, elegimos us-east-1 debido a su ubicación geográfica cerca de nosotros y su facilidad de uso para los próximos pasos del tutorial.
- Formato de salida predeterminado [Ninguno]:ingrese json como su formato de salida predeterminado porque nos será muy útil para ver los archivos de configuración más adelante.
Ahora que ha configurado sus herramientas de AWS CLI. Es hora de configurar la herramienta CLI de Kubernetes llamada kubectl en su entorno para que pueda interactuar con su clúster de EKS.
Kubectl es la interfaz de línea de comandos para Kubernetes. Con Kubectl, puede administrar aplicaciones que se ejecutan en clústeres de Kubernetes. Kubectl no está instalado de forma predeterminada en los sistemas Linux y MacOS. Puede instalar Kubectl en otros sistemas siguiendo las instrucciones del sitio web de Kubernetes.
10. Ejecute el siguiente comando para descargar el binario kubectl. Un binario es un archivo de computadora con la extensión ".bin", que es ejecutable solo en ciertos tipos de computadoras. Es una manera fácil para que diferentes tipos de computadoras compartan archivos. Usamos el binario kubectl porque el binario kubectl es independiente de la plataforma. Funcionará en cualquier sistema que pueda ejecutar un sistema operativo similar a Unix, incluidos Linux y Mac OS.
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.16.8/2020-04-16/bin/linux/amd64/kubectl
11. Ejecute el siguiente comando chmod para hacer ejecutable el binario kubectl. El comando chmod es un comando de Unix y Linux que se utiliza para cambiar los permisos de acceso a archivos o directorios. El comando chmod de Linux usa el sistema de numeración octal para especificar los permisos para cada usuario. Kubectl ahora se puede usar en su máquina local.
chmod +x ./kubectl
12. Ejecute el siguiente comando para crear un directorio kubectl en su carpeta $HOME/bin y copie el binario kubectl en él. El comando mkdir -p $HOME/bin crea un subdirectorio bin dentro de su directorio de inicio. El comando mkdir se usa para crear nuevos directorios o carpetas. La opción -p le dice al comando mkdir que cree automáticamente los directorios principales necesarios para el nuevo directorio. $HOME/bin es una variable de entorno que almacena la ruta del directorio de inicio. Cada usuario de Linux tiene el directorio $HOME/bin en su sistema de archivos. La construcción &&se denomina operador AND lógico. Se utiliza para agrupar comandos de modo que se pueda ejecutar más de un comando a la vez. La construcción &&no es necesaria para que este comando funcione, pero está ahí como práctica recomendada.
El comando cp ./kubectl $HOME/bin/kubectl copia el archivo binario kubectl local en su directorio kubectl y cambia el nombre del archivo a kubectl. Finalmente, el comando de exportación hace lo que dice:exporta una variable de entorno a la memoria del shell para que pueda ser utilizada por cualquier programa que se ejecute desde este shell. En nuestro caso, necesitamos decirle a kubectl dónde está nuestro directorio kubectl para que pueda encontrar el binario kubectl.
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
13. Ejecute el siguiente comando de versión de kubectl para verificar que kubectl esté instalado correctamente. El comando kubectl version --short --client genera una versión abreviada de la versión kubectl en una respuesta de la API REST de Kubernetes legible por humanos y bien formateada. La opción --client permite que kubectl imprima la versión formateada de la respuesta de la API REST de Kubernetes, que es consistente en todas las versiones.
La opción --short le dice a kubectl que proporcione información básica en un formato compacto con un lugar decimal para los flotantes y un formato de tiempo abreviado que es el mismo que --format. Debería ver una salida como la siguiente. Este resultado nos dice que hemos instalado correctamente kubectl y que está usando la versión correcta.
Lo último que debe hacer en esta sección es configurar la herramienta eksctl cli para usar su clúster de Amazon EKS. La herramienta eksctl cli es una interfaz de línea de comandos que puede administrar clústeres de Amazon EKS. Puede generar credenciales de clúster, actualizar la especificación del clúster, crear o eliminar nodos trabajadores y realizar muchas otras tareas.
14. Ejecute los siguientes comandos para instalar la herramienta eksctl cli y verifique su versión.
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp && sudo mv /tmp/eksctl /usr/bin
eksctl version
Aprovisionar un clúster de EKS
Ahora que tiene su EC2 y las herramientas de AWS CLI, ahora puede aprovisionar su primer clúster de EKS.
1. Ejecute el siguiente comando eksctl create cluster para aprovisionar un clúster llamado dev en la región us-east-1 con un nodo principal y tres principales.
eksctl create cluster --name dev --version 1.21 --region us-east-1 --nodegroup-name standard-workers --node-type t3.micro --nodes 3 --nodes-min 1 --nodes-max 4 --managed
El comando eksctl create cluster crea un EKS Cluster en la región us-east-1 usando los valores predeterminados recomendados por Amazon para esta configuración específica y pasa todos los argumentos entre comillas ( " ) o como variables (${ } ) según corresponda.
El parámetro de nombre se usa para definir el nombre de este clúster de EKS y es solo una etiqueta amigable para su conveniencia. version es la versión que desea que use el clúster, para este ejemplo, nos ceñiremos a Kubernetes v1.21.2, pero no dude en explorar otras opciones también.
nodegroup-name es el nombre de un grupo de nodos que este clúster debe usar para administrar los nodos trabajadores. En este ejemplo, lo mantendrá simple y solo usará trabajadores estándar, lo que significa que sus nodos trabajadores tendrán una vCPU y 3 GB de memoria de forma predeterminada.
nodos es el número total de nodos trabajadores principales que desea en su clúster. En este ejemplo, se solicitan tres nodos. nodes-min y nodes-max controlan la cantidad mínima y máxima de nodos permitidos en su clúster. En este ejemplo, se crearán al menos uno pero no más de cuatro nodos trabajadores.
2. Puede navegar a su consola de CloudFormation para monitorear el progreso del aprovisionamiento.
Como se muestra a continuación, puede ver que se está creando su pila de desarrollo.
3. Haga clic en el hipervínculo de la pila de desarrollo> Evento. Verá una lista de eventos relacionados con el proceso de creación. Espere a que se complete el proceso de aprovisionamiento (esto puede demorar hasta 15 minutos según sus circunstancias específicas) y verifique el estado de la pila en la consola de CloudFormation.
4. Después de esperar a que la pila termine de aprovisionarse, navegue a su consola de CloudFormation, verá el estado de su pila de desarrollo CREATE_COMPLETE.
Ahora, navegue a su consola EC2. Verá un nodo principal y tres nodos principales en el panel de EC2. Este resultado confirma que ha configurado correctamente el clúster de EKS.
5. Ejecute el siguiente comando eksctl para obtener los detalles del clúster de desarrollo, como el ID del clúster y la región.
eksctl get cluster
6. Ejecute el siguiente comando aws eks update para obtener las credenciales del nodo de trabajo remoto. Este comando debe ejecutarse en cualquier computadora que desee conectar al clúster. Descarga las credenciales de su kubectl para acceder a EKS Kubernetes Cluster de forma remota, sin utilizar las claves de acceso de AWS Access.
aws eks update-kubeconfig --name dev --region us-east-1
Implementar su aplicación en el clúster de EKS
Ahora que tiene su EKS Cluster aprovisionado. Implementemos su primera aplicación en su EKS Cluster. En esta sección, aprenderá cómo implementar un servidor web nginx junto con un balanceador de carga como una aplicación de muestra.
1. Ejecute el siguiente comando para instalar git en su sistema. Necesitará git para clonar el código del servidor web nginx de GitHub.
sudo yum install -y git
2. Ejecute el comando git clone a continuación para clonar el código del servidor web nginx de github a su directorio actual.
git clone https://github.com/ata-aws-iam/htf-elk.git
3. Ejecute el comando cd htf-elk para cambiar el directorio de trabajo al directorio de archivos de configuración de nginx.
cd htf-elk
4. Ejecute el comando ls para enumerar los archivos en el directorio actual.
ls
Verá los siguientes archivos presentes en su directorio nginx.
5. Ejecute el comando cat a continuación para abrir el archivo nginx-deployment.yaml y verá los siguientes contenidos presentes en ese archivo.
cat nginx-deployment.yaml
- apiVersion:apps/v1 es la API principal de Kubernetes
- tipo:la implementación es el tipo de recurso que se creará para este archivo. En una implementación, se crea un pod por contenedor.
- metadatos:especifica los valores de metadatos que se utilizarán al crear un objeto
- nombre:nginx-deployment es el nombre o la etiqueta de esta implementación. Si no tiene ningún valor, el nombre de la implementación se toma del nombre del directorio.
- etiquetas:proporciona etiquetas para la aplicación. En este caso, se utilizará para el enrutamiento de servicios a través de Elastic Load Balancing (ELB)
- env:dev describe una variable de entorno definida por un valor de cadena. Así es como puede proporcionar datos de configuración dinámica a su contenedor.
- spec:es donde define cuántas réplicas crear. Puede especificar las propiedades en las que desea que se base cada réplica.
- réplicas:3 creará tres replicantes de este pod en su clúster. Estos se distribuirán en los nodos trabajadores disponibles que coincidan con el selector de etiquetas.
- containerPort:80 asignará un puerto del contenedor a un puerto en el host. En este caso, asignará el puerto 80 del contenedor al puerto 30000 de su máquina local.
6. Ejecute el siguiente comando cat para abrir el archivo de servicio nginx-svc.yaml. Verá los siguientes contenidos presentes en ese archivo.
cat nginx-svc.yaml
7. Ejecute el comando kubectl apply a continuación para crear el servicio nginx en su clúster de Kubernetes. El clúster de EKS tardará unos minutos en aprovisionar ELB para este servicio.
kubectl apply -f ./nginx-svc.yaml
8. Ejecute el servicio kubectl get a continuación para obtener detalles sobre el servicio nginx que acaba de crear.
kubectl get service
Obtendrá el siguiente resultado. ClusterIP es la IP interna de kubernetes asignada a este servicio. El nombre de LoadBalancer ELB es un identificador único para este servicio. Creará automáticamente un ELB en AWS y aprovisionará un punto final público para este servicio al que pueden acceder los servicios de su elección, como un navegador web (nombre de dominio) o clientes de API. Es accesible a través de una dirección IP de su elección.
El ELB del equilibrador de carga con el nombre a6f8c3cf0fe3a468d8828db6059ef05e-953361268.us-east-1.elb.amazonaws.com tiene el puerto 32406, que se asignará al puerto 80 del contenedor. Anote el nombre de host DNS del ELB del equilibrador de carga de la salida; lo necesitará para acceder al servicio más adelante.
9. Ejecute el comando kubectl apply a continuación para aplicar la implementación para su clúster.
kubectl apply -f ./nginx-deployment.yaml
10. Ejecute la implementación de kubectl get para obtener los detalles sobre la implementación de nginx que acaba de crear.
kubectl get deployment
11. Ejecute el siguiente comando para acceder a su aplicación nginx a través del balanceador de carga. Verá la página de bienvenida de nginx en su terminal/consola, que confirma que su aplicación nginx funciona como se esperaba. Reemplace
curl "<LOAD_BALANCER_DNS_HOSTNAME>"
12. También puede acceder a su aplicación nginx a través del navegador copiando y pegando el nombre de host DNS del equilibrador de carga en el navegador.
Verificación de la función de alta disponibilidad (HA) para su clúster
Ahora que ha creado su clúster con éxito, puede probar la función HA para asegurarse de que funciona como se esperaba.
Kubernetes admite implementaciones de múltiples nodos con el uso de controladores especiales que funcionan en conjunto para crear y administrar pods o servicios replicados. Algunos de estos controladores son Implementaciones, ReplicationController, Job y DaemonSet.
Se utiliza un controlador de implementación para controlar la replicación en el pod o nivel de servicio. Cuando su pod se quede sin recursos, eliminará todos los pods de ese controlador de replicación (excepto el que se ejecuta en el nodo principal) y creará nuevas réplicas de este pod. Esto lo ayudará a obtener un tiempo de actividad muy alto en todas sus aplicaciones.
1. Navegue a su panel de EC2 y detenga los tres nodos trabajadores.
2. Ejecute el siguiente comando para verificar el estado de sus pods. Obtendrá diferentes estados:Terminando , Corriendo y Pendiente para todas tus vainas. Porque una vez que detenga todos los nodos de trabajo, EKS intentará reiniciar todos los nodos de trabajo y los pods nuevamente. También puede ver algunos nodos nuevos, que puede identificar por su edad (50s ).
kubectl get pod
Lleva algún tiempo arrancar la nueva instancia EC2 y los pods. Una vez que se hayan iniciado todos los nodos trabajadores, verá que todas las instancias EC2 nuevas vuelven a En ejecución. estado.
3. Vuelva a ejecutar el servicio de obtención de kubectl. Puede ver que ESK creará un nuevo servicio nginx y un nuevo nombre de DNS para su balanceador de carga.
kubectl get service
Copie y pegue el nuevo DNS en su navegador. Volverá a recibir la bienvenida de la página de Nginx. Este resultado confirma que su HA funciona según lo previsto.
Conclusión
En este artículo, aprendió a configurar su clúster de EKS. También verificó que la característica de alta disponibilidad funciona al detener todos sus nodos trabajadores y verificar el estado de sus pods. Ahora debería poder crear y administrar clústeres de EKS mediante kubectl.