Como criar um cluster kubernetes EKS na AWS com eksctl

Introdução

Após o último post sobre Kubernetes criando um cluster localmente, continuaremos a saga, mas agora criando um cluster Kubernetes na AWS, em um cenário um pouco mais próxima da realidade. Para criar um cluster kubernetes na AWS utilizaremos uma ferramenta chamada eksctl.

eksctl é uma ferramenta CLI simples para criar e gerenciar clusters no EKS – serviço Kubernetes gerenciado da Amazon para EC2. Está escrito em Go, usa CloudFormation, foi criado pela Weaveworks e aceita contribuições da comunidade.

Instalando o eksctl

Linux

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# for ARM systems, set ARCH to: `arm64`, `armv6` or `armv7`
ARCH=amd64
PLATFORM=$(uname -s)_$ARCH

curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz"

# (Optional) Verify checksum
curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check

tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz

sudo mv /tmp/eksctl /usr/local/bin

Windows e Mac

1
choco install eksctl

https://eksctl.io/installation/#for-windows

1
2
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl

https://eksctl.io/installation/#for-macos

Vamos testar se está tudo funcionando:

1
2
3
4
➜ eksctl info
eksctl version: 0.167.0
kubectl version: v1.28.2
OS: linux

Com a ferramenta eksctl precisamos também que as credenciais da AWS já estejam configuradas, a partir dai podemos começar a utilizar a ferramenta. Temos duas formas que criar um cluster EKS, utilizando somente a linha de comando, passando todos os parâmetros necessários ou com um arquivo YAML de configuração para definirmos como queremos criar o nosso cluster.

Criando cluster via linha de comando

Primeiro podemos testar se já temos algum cluster criado:

1
2
➜ eksctl get cluster                
No clusters found

Como podemos ver ainda não temos nenhum cluster criado. Vamos então criar um cluster simples utilizando a linha de comando:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
➜ eksctl create cluster
[]  using region us-west-2
[]  setting availability zones to [us-west-2a us-west-2c us-west-2b]
[]  subnets for us-west-2a - public:192.168.0.0/19 private:192.168.96.0/19
[]  subnets for us-west-2c - public:192.168.32.0/19 private:192.168.128.0/19
[]  subnets for us-west-2b - public:192.168.64.0/19 private:192.168.160.0/19
[]  nodegroup "ng-98b3b83a" will use "ami-05ecac759c81e0b0c" [AmazonLinux2/1.11]
[]  creating EKS cluster "floral-unicorn-1540567338" in "us-west-2" region
[]  will create 2 separate CloudFormation stacks for cluster itself and the initial nodegroup
[]  if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=us-west-2 --cluster=floral-unicorn-1540567338'
[]  2 sequential tasks: { create cluster control plane "floral-unicorn-1540567338", create nodegroup "ng-98b3b83a" }
[]  building cluster stack "eksctl-floral-unicorn-1540567338-cluster"
[]  deploying stack "eksctl-floral-unicorn-1540567338-cluster"
[]  building nodegroup stack "eksctl-floral-unicorn-1540567338-nodegroup-ng-98b3b83a"
[]  --nodes-min=2 was set automatically for nodegroup ng-98b3b83a
[]  --nodes-max=2 was set automatically for nodegroup ng-98b3b83a
[]  deploying stack "eksctl-floral-unicorn-1540567338-nodegroup-ng-98b3b83a"
[]  all EKS cluster resource for "floral-unicorn-1540567338" had been created
[]  saved kubeconfig as "~/.kube/config"
[]  adding role "arn:aws:iam::376248598259:role/eksctl-ridiculous-sculpture-15547-NodeInstanceRole-1F3IHNVD03Z74" to auth ConfigMap
[]  nodegroup "ng-98b3b83a" has 1 node(s)
[]  node "ip-192-168-64-220.us-west-2.compute.internal" is not ready
[]  waiting for at least 2 node(s) to become ready in "ng-98b3b83a"
[]  nodegroup "ng-98b3b83a" has 2 node(s)
[]  node "ip-192-168-64-220.us-west-2.compute.internal" is ready
[]  node "ip-192-168-8-135.us-west-2.compute.internal" is ready
[]  kubectl command should work with "~/.kube/config", try 'kubectl get nodes'
[]  EKS cluster "floral-unicorn-1540567338" in "us-west-2" region is ready

Como não passamos nenhum parâmetro o cluster será criado com os valores padrões:

  • Nome gerado automaticamente
  • Dois worker nodes de tamanho m5.large
  • Usa o AWS EKS AMI oficial
  • Regiãous-west-2
  • Uma VPC dedicada

Podemos também personalizar nosso cluster personalizando os parâmetros passados, como, por exemplo, personalizar nome, quantidade de nós do cluster e especificar a versão do kubernetes utilizada.

1
eksctl create cluster --name=cluster-dev --nodes=4 --version=1.28

Para saber quais parâmetros que podemos utilizar, podemos usar o comando abaixo:

1
➜ eksctl create cluster --help

Criando cluster via arquivo de configuração

Outra forma de criar um cluster é utilizando um arquivo de configuração. Eu acredito ser a maneira ideal, pois podemos compartilhar o arquivo ou manter-lô em um repositório como o github, por exemplo. No nosso exemplo estamos criando um cluster na região us-east-1 com dois node groups de tamanhos e capacidades diferentes. Daremos o nome para o arquivo de cluster.yaml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: basic-cluster
  region: us-east-1

nodeGroups:
  - name: ng-1
    instanceType: m5.large
    desiredCapacity: 10
  - name: ng-2
    instanceType: m5.xlarge
    desiredCapacity: 2

Para criar o cluster só precisamos apontar o arquivo de configuração que criamos na etapa anterior:

1
eksctl create cluster -f cluster.yaml

Gerenciando o cluster

Após o cluster ser criado já podemos gerenciar o mesmo usando kubectl ou qualquer ferramenta que prefira. Primeiro vamos conferir o cluster criado:

1
2
3
➜ eksctl get cluster                                               
NAME		REGION		EKSCTL CREATED
cluster-dev	us-east-1	True

No console da AWS:

Console AWS

Realizando algumas validações com alguns comandos no kubectl:

1
2
3
4
5
6
7
8
9
➜ kubectl get nodes
NAME                             STATUS   ROLES    AGE    VERSION
ip-192-168-42-117.ec2.internal   Ready    <none>   106s   v1.28.5-eks-5e0fdde
➜ kubectl get pods -A
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   aws-node-626mv             2/2     Running   0          2m13s
kube-system   coredns-86969bccb4-sxgkp   1/1     Running   0          8m6s
kube-system   coredns-86969bccb4-xc5gh   1/1     Running   0          8m6s
kube-system   kube-proxy-lttsv           1/1     Running   0          2m13s

Deletando cluster

Caso seu cluster seja somente para testes e não queira gastar deixando ele ligado por muito tempo, podemos deletar o cluster com o comando abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
➜ eksctl delete cluster cluster-dev                    
2024-02-07 08:54:36 []  deleting EKS cluster "cluster-dev"
2024-02-07 08:54:38 []  will drain 0 unmanaged nodegroup(s) in cluster "cluster-dev"
2024-02-07 08:54:38 []  starting parallel draining, max in-flight of 1
2024-02-07 08:54:39 []  deleted 0 Fargate profile(s)
2024-02-07 08:54:40 []  kubeconfig has been updated
2024-02-07 08:54:40 []  cleaning up AWS load balancers created by Kubernetes objects of Kind Service or Ingress
2024-02-07 08:54:43 []  
2 sequential tasks: { delete nodegroup "ng-3bc9974c", delete cluster control plane "cluster-dev" [async] 
}
2024-02-07 08:54:43 []  will delete stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 08:54:43 []  waiting for stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c" to get deleted
2024-02-07 08:54:44 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 08:55:14 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 08:55:56 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 08:57:36 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 08:59:09 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 08:59:48 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 09:01:29 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 09:02:01 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 09:03:24 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 09:04:44 []  waiting for CloudFormation stack "eksctl-cluster-dev-nodegroup-ng-3bc9974c"
2024-02-07 09:04:44 []  will delete stack "eksctl-cluster-dev-cluster"
2024-02-07 09:04:45 []  all cluster resources were deleted

Para mais configurações podemos acessar a documentação oficial https://eksctl.io/getting-started/

0%