Creación de un cluster en EKS (II)
Creación del cluster
Creación de claves de EC2
Elastic Kubernetes Service
permite acceder por SSH a las instancias de EC2 creadas al crear el cluster, pero para ello es necesario asociarles un par de claves pública/privada. En realidad, funciona igual que al crear cualquier instancia normal y corriente de EC2.
La clave debe existir previamente a la creación del cluster y ser usada al crearlo. Si no se hace así, no se podrá acceder nunca a las instancias de los nodos.
El par de claves no está ligado a ningún recurso en particular – y se puede usar en varios, de hecho. Para crearlo, hay que seguir estas instrucciones.
Básicamente se trata de:
- Entrar en la consola de EC2
- Ir a
Network & Security / Key Pairs / Create pair
- Darle un nombre significativo y clarificador
- Elegir el formato:
pem
(preferible) oppk
- Y exportarlo
El formato no es problema, porque se puede convertir el fichero de uno a otro, con herramientas como PuttyGen.
Crear el cluster
Tan sencillo como definir un YAML con su configuración:
apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: mycluster region: eu-west-1 version: "1.15" managedNodeGroups: - name: mng-1 instanceType: m5.large desiredCapacity: 1 minSize: 1 maxSize: 3 ssh: publicKeyName: 'k8s-key' # El nombre de la key creada antes iam: withAddonPolicies: autoScaler: true
Hay muchísimos ejemplos de configuraciones de clusters en el repositorio de ekstcl
en GitHub.
Y para crearlo:
eksctl create cluster -f k8s-cluster.yaml
El resultado será algo como esto:
[ℹ] eksctl version 0.15.0 [ℹ] using region eu-west-1 [ℹ] setting availability zones to [eu-west-1b eu-west-1a eu-west-1c] [ℹ] subnets for eu-west-1b - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ] subnets for eu-west-1a - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ] subnets for eu-west-1c - public:192.168.64.0/19 private:192.168.160.0/19 [ℹ] using EC2 key pair "k8s-key" [ℹ] using Kubernetes version 1.15 [ℹ] creating EKS cluster "mycluster" in "eu-west-1" region with managed nodes [ℹ] 1 nodegroup (mng-1) was included (based on the include/exclude rules) [ℹ] will create a CloudFormation stack for cluster itself and 0 nodegroup stack(s) [ℹ] will create a CloudFormation stack for cluster itself and 1 managed nodegroup stack(s) [ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=eu-west-1 --cluster=mycluster' [ℹ] CloudWatch logging will not be enabled for cluster "mycluster" in "eu-west-1" [ℹ] you can enable it with 'eksctl utils update-cluster-logging --region=eu-west-1 --cluster=mycluster' [ℹ] Kubernetes API endpoint access will use default of {publicAccess=true, privateAccess=false} for cluster "mycluster" in "eu-west-1" [ℹ] 2 sequential tasks: { create cluster control plane "mycluster", create managed nodegroup "mng-1" } [ℹ] building cluster stack "eksctl-mycluster-cluster" [ℹ] deploying stack "eksctl-mycluster-cluster" [ℹ] building managed nodegroup stack "eksctl-mycluster-nodegroup-mng-1" [ℹ] deploying stack "eksctl-mycluster-nodegroup-mng-1" [✔] all EKS cluster resources for "mycluster" have been created [✔] saved kubeconfig as "C:\Users\alpinazo/.kube/config" [ℹ] nodegroup "mng-1" has 1 node(s) [ℹ] node "ip-192-168-xxx-xxx.eu-west-1.compute.internal" is ready [ℹ] waiting for at least 1 node(s) to become ready in "mng-1" [ℹ] nodegroup "mng-1" has 1 node(s) [ℹ] node "ip-192-168-xxx-xxx.eu-west-1.compute.internal" is ready [ℹ] kubectl command should work with "C:\Users\alpinazo/.kube/config", try 'kubectl get nodes' [✔] EKS cluster "mycluster" in "eu-west-1" region is ready
Administración del cluster
Conectar con el cluster tras haberlo creado
La configuración local de kubectl se guarda en el fichero C:\Users\<usuario>\.kube\config
(Windows) o en ~/.kube/.config
(Unix).
La creación del cluster con eksctl habrá creado un modificado la configuración local de Kubenetes, para añadir el acceso al nuevo cluster; y kubectl queda configurado ya para acceder por defecto al cluster de EKS.
Se puede ver cómo se ha añadido el nuevo cluster a la lista de los configurados:
$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO docker-desktop docker-desktop docker-desktop docker-for-desktop docker-desktop docker-desktop * myuser@mycluster.eu-west-1.eksctl.io mycluster.eu-west-1.eksctl.io myuser@mycluster.eu-west-1.eksctl.io
Y se puede cambiar de contexto para conectar con otro cluster, por ejemplo el docker-desktop que tuviéramos en local.
Obviamente, cuando queramos trabajar con el que hemos creado en EKS, cambiaremos el contexto para conectarnos a él:
Conectar con un cluster ya existente
Si se trata de conectar con un EKS que ya fue creado anteriormente desde un lugar diferente a nuestro local – como el local de otra persona o desde la consola web de EKS – hay que descargar a la configuración local las credenciales de ese cluster.
Por suerte es algo muy fácil de hacer con AWS CLI:
aws eks --region region update-kubeconfig --name cluster_name
AWS CLI debe estar configurado con las credenciales del dueño del cluster.
Autoescalado del cluster
El ASG
(Auto Scaling Group) – gestiona el escalado del propio cluster. Es decir, es el responsable de que se añadan más nodos al cluster, cuando ya no haya recursos suficientes para crear más pods.
El primer paso fue configurar el cluster para soportar autoscalado con eksctl, como se indicó en su YAML, definiendo que los nodos fueran gestionados.
Pero ahora hay que crear el ASG para el cluster y hay que hacerlo a mano, siguiendo las instrucciones, en la sección Deploy the Cluster Autoscaler
.
Primero se despliegue el autoscaler en el cluster:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
Luego se le añade la anotación safe-to-evict
:
kubectl -n kube-system annotate deployment.apps/cluster-autoscaler cluster-autoscaler.kubernetes.io/safe-to-evict="false"
Después se edita el despliegue del autoscaler para adecuarlo a nuestro cluster:
kubectl -n kube-system edit deployment.apps/cluster-autoscaler
Ese comando abrirá nuestro editor de texto por defecto con el contenido del yaml del despliegue del autoscaler.
Tenemos que reemplazar el texto <YOUR CLUSTER NAME>
por el nombre de nuestro cluster. Y justo debajo, añadir las líneas:
--balance-similar-node-groups --skip-nodes-with-system-pods=false
Conviene ver el ejemplo en la documentación de Amazon EKS.
Servidor de métricas
Para que puedan autoescalar, es necesario instalar Metrics Server
, que recoge métricas de consumo de CPU y memoria de cada pod. Éstas son usadas posteriormente para contrastarlas con las definiciones de los límites de recursos definidos en los despliegues de los pods.