Carlos Andrés Moreno Jimenez
Andres Moreno Cuesta
Alfredo Olmedo
Miguel Angel Mercado Tirado
🚨 ¡Alerta de Cobro en AWS! 🚨
⚠️ AWS te cobrará al menos 0.10 USD por el control plane de EKS, aunque lo borres rápido.
💸 Si lanzas nodos EC2, balanceadores de carga o almacenamiento, también pueden generarse cargos adicionales.
🆓 Si quieres evitar costos, usa GKE gratis o Kubernetes local (Minikube, KIND). 🚀
Si estás intentando eliminar tu clúster de AWS con el comando eksctl delete cluster --name k8s-cluster y te aparece este error, quizás la configuración de tu AWS CLI esté apuntando a una región diferente a aquella en la que fue creado el clúster.
Puedes verificar la región actual con el comando aws configure get region y, si es necesario, reconfigurarla con aws configure.
Configuración de Kubernetes en EKS (AWS)
Elastic Kubernetes Service (EKS) en AWS permite desplegar y gestionar clústeres de Kubernetes de manera sencilla, mientras AWS se encarga de la gestión del plano de control.
Prerrequisitos
aws configure.eks:CreateClustereks:CreateNodegroupec2:CreateVpc1. Crear un Clúster EKS
Opción 1: Usando eksctl (Recomendado para simplicidad)
eksctl es una herramienta que facilita la configuración de EKS.
Comando para crear el clúster:eksctl create cluster \ --name my-eks-cluster \ --region us-west-2 \ --nodegroup-name standard-workers \ --node-type t3.medium \ --nodes 2 \ --nodes-min 1 \ --nodes-max 3 \ --managed
--name: Nombre del clúster.--region: Región donde se desplegará.--node-type: Tipo de instancia EC2 para los nodos.--nodes: Número de nodos iniciales.--managed: AWS gestiona los nodos.Verifica el clúster:eksctl get cluster
Opción 2: Usando la consola de AWS
2. Configurar el Contexto de Kubectl
Una vez que el clúster esté creado, configura kubectl para interactuar con él.
Obtener el archivo kubeconfig:aws eks update-kubeconfig --region us-west-2 --name my-eks-cluster
Verificar la conexión:kubectl get nodes
3. Desplegar una Aplicación en el Clúster
Crear un Deployment:apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Guarda este archivo como nginx-deployment.yaml y aplícalo:kubectl apply -f nginx-deployment.yaml
Exponer la Aplicación:apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
Guarda este archivo como nginx-service.yaml y aplícalo:kubectl apply -f nginx-service.yaml
Verificar la Aplicación: Encuentra la dirección IP del LoadBalancer:kubectl get service nginx-service Abre la IP en tu navegador para acceder a la aplicación.
4. Configurar Autoescalado (HPA)
Habilitar el escalado automático:
Habilitar HPA para la aplicación:kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=5
Verificar HPA:kubectl get hpa
5. Monitoreo con CloudWatch
EKS está integrado con CloudWatch para monitorear métricas, logs y alertas:
Habilitar logging:
Visualizar los logs:
6. Limpieza de Recursos
Para evitar costos innecesarios, elimina los recursos creados al finalizar las pruebas:
Eliminar el clúster con eksctl:eksctl delete cluster --name my-eks-cluster
Verifica que todos los recursos han sido eliminados:aws eks list-clusters
Esta guía te permite configurar un clúster EKS en AWS, desplegar aplicaciones, habilitar escalado automático y monitorear el rendimiento. EKS es ideal para proyectos que requieren alta disponibilidad, escalabilidad y una integración profunda con servicios de AWS.
Política necesaria para correr el cluster de EKS
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EKSFullAccess", "Effect": "Allow", "Action": [ "eks:*", "eks:Describe*", "eks:List*" ], "Resource": "*" }, { "Sid": "EC2FullAccess", "Effect": "Allow", "Action": [ "ec2:*" ], "Resource": "*" }, { "Sid": "IAMFullAccess", "Effect": "Allow", "Action": [ "iam:CreateRole", "iam:DeleteRole", "iam:AttachRolePolicy", "iam:DetachRolePolicy", "iam:GetRole", "iam:ListRolePolicies", "iam:PassRole", "iam:TagRole", "iam:CreateServiceLinkedRole", "iam:GetOpenIDConnectProvider", "iam:CreateOpenIDConnectProvider", "iam:DeleteOpenIDConnectProvider", "iam:ListOpenIDConnectProviders" ], "Resource": "*" }, { "Sid": "CloudFormationFullAccess", "Effect": "Allow", "Action": [ "cloudformation:*" ], "Resource": "*" }, { "Sid": "CloudWatchAndLogsFullAccess", "Effect": "Allow", "Action": [ "logs:*", "cloudwatch:*" ], "Resource": "*" }, { "Sid": "VPCFullAccess", "Effect": "Allow", "Action": [ "ec2:Describe*", "ec2:CreateSecurityGroup", "ec2:DeleteSecurityGroup", "ec2:AuthorizeSecurityGroupIngress", "ec2:RevokeSecurityGroupIngress", "ec2:AuthorizeSecurityGroupEgress", "ec2:RevokeSecurityGroupEgress", "ec2:CreateVpc", "ec2:DeleteVpc", "ec2:CreateSubnetwork", "ec2:DeleteSubnetwork", "ec2:CreateRouteTable", "ec2:DeleteRouteTable" ], "Resource": "*" }, { "Sid": "S3FullAccess", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": "*" }, { "Sid": "AutoScalingFullAccess", "Effect": "Allow", "Action": [ "autoscaling:*" ], "Resource": "*" }, { "Sid": "ElasticLoadBalancingFullAccess", "Effect": "Allow", "Action": [ "elasticloadbalancing:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:ListAttachedRolePolicies", "Resource": "*" } ] } ```{ 	"Version": "2012-10-17", 	"Statement": \[ 	 { 	 "Sid": "EKSFullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "eks:\*", 	 "eks:Describe\*", 	 "eks:List\*" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "EC2FullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "ec2:\*" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "IAMFullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "iam:CreateRole", 	 "iam:DeleteRole", 	 "iam:AttachRolePolicy", 	 "iam:DetachRolePolicy", 	 "iam:GetRole", 	 "iam:ListRolePolicies", 	 "iam:PassRole", 	 "iam:TagRole", 	 "iam:CreateServiceLinkedRole", 	 "iam:GetOpenIDConnectProvider", 	 "iam:CreateOpenIDConnectProvider", 	 "iam:DeleteOpenIDConnectProvider", 	 "iam:ListOpenIDConnectProviders" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "CloudFormationFullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "cloudformation:\*" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "CloudWatchAndLogsFullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "logs:\*", 	 "cloudwatch:\*" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "VPCFullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "ec2:Describe\*", 	 "ec2:CreateSecurityGroup", 	 "ec2:DeleteSecurityGroup", 	 "ec2:AuthorizeSecurityGroupIngress", 	 "ec2:RevokeSecurityGroupIngress", 	 "ec2:AuthorizeSecurityGroupEgress", 	 "ec2:RevokeSecurityGroupEgress", 	 "ec2:CreateVpc", 	 "ec2:DeleteVpc", 	 "ec2:CreateSubnetwork", 	 "ec2:DeleteSubnetwork", 	 "ec2:CreateRouteTable", 	 "ec2:DeleteRouteTable" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "S3FullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "s3:\*" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "AutoScalingFullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "autoscaling:\*" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Sid": "ElasticLoadBalancingFullAccess", 	 "Effect": "Allow", 	 "Action": \[ 	 "elasticloadbalancing:\*" 	 ], 	 "Resource": "\*" 	 }, 	 { 	 "Effect": "Allow", 	 "Action": "iam:ListAttachedRolePolicies", 	 "Resource": "\*" 	 } 	] }