Resolvi ajudar a comunidade a usar o serviço de Cluster Kubernetes (EKS) da AWS, para quem ainda tem dúvidas. O Kurbenetes, nada mais é, do que um orquestrador para os seus containers. No cenário no qual precisamos criar aplicações e remover aplicações em containers, ele encurta bastante o nosso tempo e permite um gerenciamento bem legal para ambientes pequenos ou até mesmo para aqueles gigantescos.
Os binários usados para gerenciar o Cluster Kubernetes são desenvolvidos na linguagem Go da Google. Sendo assim, é só baixar do repositório da AWS, dar permissão de execução e copiar ou mover para a pasta /usr/local/bin/, conforme coloquei abaixo, para não ter a necessidade de mencionar no PATH do seu sistema.
Instalando o AWS CLI
Uma maneira rápida para não perder tempo é seguir a documentação da AWS.
Instalando o Kubectl e o AWS-IAM-Authenticator
O Kubectl é que o binário responsável por gerenciar seu Cluster Kubernetes. Já o AWS-IAM-Autenticator é uma ferramenta que usa as suas credenciais no IAM para autenticar no cluster Kubernetes (EKS) na AWS.
Recomendo seguir os passos apresentados aqui e caso precise ainda de uma melhor compreensão, coloquei logo abaixo uma forma de você vai baixar e dar permissão de execução aos binários Kubectl e AWS-IAM-Authenticator, para Linux:
$ curl -o kubectl
$ chmod +x kubectl
$ curl -o aws-iam-authenticator
$ chmod +x aws-iam-authenticator
$ mv kubectl aws-iam-authenticator /usr/local/bin
Para se certificar que tudo está funcionando, abra outra aba no seu terminal e digite:
1 2 |
$ kubectl help $ aws-iam-authenticator help |
Caso apareça o comportamento da maneira esperada, que é mostrar as opções e argumentos dos binários, continue com o passo a passo abaixo. Agora se perceber algum erro, como por exemplo:
1 2 3 |
“Invalid choice: 'eks', maybe you meant: *es” |
Se você tiver mais de um AWS CLI instalado na sua máquina, use o apt-get remove AWS CLI e também o pip uninstal AWS CLI. No meu caso, eu tinha mais de um AWS CLI instalado na máquina, daí ocorria o erro mencionado acima.
Partindo para a AWS
Criando uma função (role) no IAM
Crie uma função (role) no IAM para que o Kubernetes possa assumir e criar recursos da AWS. Novamente, a documentação para consulta está aqui.
Segue um passo a passo de como criar a função de serviço do Amazon EKS:
- Abra o console do IAM;
- Escolha Roles (Funções) e, em seguida, Create Role (Criar função);
- Escolha EKS na lista de serviços e, em seguida, Allows Amazon EKS to manage your clusters on your behalf (permitir que o Amazon EKS gerencie os clusters em seu nome) para o seu caso de uso e depois Next: Permissions (próximo: permissões);
- Selecione Próximo: revisão;
- Em Role name (nome da função), digite um nome para a função, como eksServiceRole e escolha Create role (criar função). Pronto, a ARN dessa função vai ser necessária na criação do seu Cluster (assunto mais para a frente). ARN é abreviação de Amazon Resource Name e se parece com algo assim: arn:aws:iam::111111111111:role/eksServiceRole.
Criando policies para o seu usuário que vai administrar o EKS
Apesar de ser o passo mais fácil, é preciso seguir as boas práticas e não apenas o uso de uma policy com o conteúdo abaixo, assim como conceder a esse usuário acesso à permissão iam:PassRole. Clique aqui para ter acesso à documentação e para entender como fica.
Esse é o conteúdo da policy chamada AmazonEKSAdminPolicy e que vou anexar ao usuário criado:
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:*" ], "Resource": "*" } ] } |
Adicionei a policy acima pensando que estava tudo bem, tudo certo, mas deu errado. rs
Errei ao criar o Cluster:
1 2 3 |
An error occurred (AccessDeniedException) when calling the CreateCluster operation: User: arn:aws:iam::111111111111:user/test is not authorized to perform:iam:PassRole on resource: arn:aws:iam::111111111111:role/eksServiceRole |
Então, após a correta compreensão da documentação, descobri o caminho das pedras para resolver o caso: na verdade, precisava adicionar mais uma policy no meu usuário para executar a role ‘eksServiceRole’, criada anteriormente. Em outra palavras, permissão iam:PassRole.
Exemplo da policy:
1 2 3 4 5 6 7 8 9 10 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::111111111111:role/eksServiceRole" } ] } |
Se quiser, você vai poder criar uma nova VPC com o template disponibilizado na documentação, senão pode usar a VPC existente. Se optar por isto, faça o seguinte:
- Crie suas subnets e as acrescente a uma rota (route-table) para a Internet por meio de um igw (internet gateway), o que vai fazer com as subnets se tornem públicas;
- Crie um SG (security group) com uma nomenclatura que curta e que o faça lembrar qual vai ser o Control Plane. Não é preciso criar qualquer regra, o template usado no cloudformation para a criação dos nós do Cluster vai ficar responsável por criar todas as regras necessárias informadas na documentação. O que vai ser ajustado para você.
Já para criar a VPC com o template do cloudformation, siga os passos a seguir:
- Abra o console do AWS CloudFormation;
- Na barra de navegação, selecione uma região que seja compatível com o Amazon EKS.
Nota: ele está disponível nas seguintes regiões até o momento da criação deste artigo: Oeste dos EUA (Oregon, us-west-2) e Leste dos EUA (Norte da Virgínia, us-east-1); - Selecione Create stack;
- Em Choose a template, selecione Specify an Amazon S3 template URL;
- Cole esta URL na área de texto e selecione Next:
- Na página Specify Details, preencha os parâmetros conforme necessário e, em seguida, escolha Next: Stack name: escreva um nome para a pilha do AWS CloudFormation, como por exemplo, ‘eks-vpc’; VpcBlock: escolha um intervalo de CIDR para a VPC. Você pode manter o valor padrão; Subnet01Block: escolha um intervalo de CIDR para a sub-rede 1. Você pode manter o valor padrão; Subnet02Block: escolha um intervalo de CIDR para a sub-rede 2. Você pode manter o valor padrão; Subnet03Block: escolha um intervalo de CIDR para a sub-rede 3. Você pode manter o valor padrão;
- Se quiser, na página Options, marque os recursos da pilha e escolha Next;
- Na página Revisão, selecione Criar;
- Quando a pilha estiver criada, selecione-a no console e escolha Outputs;
- Guarde o valor de SecurityGroups para o security group criado. Você vai precisar dele ao criar seu Cluster do EKS. Esse security group é aplicado às interfaces de rede elástica, entre contas que são criadas em suas sub-redes que permitem que o plano de controle do Amazon EKS se comunique com os nós de operador;
- Guarde o VpcId para as sub-redes que foram criadas. Você vai precisar disso ao executar o modelo do grupo de nós de operador;
- Guarde os SubnetIds para as sub-redes que foram criadas. Você vai precisar disso ao criar o seu Cluster do EKS. Essas são as sub-redes nas quais os nós de operador são executados.
Depois de criar o Cluster EKS, finalmente, lembre-se de que os parâmetros aqui nada mais são do que os IDs da VPC e subnets que você criou com o template usado no cloudformation nos passos anteriores com o AWS CLI:
# aws eks create-cluster –name meu-cluster –role-arn arn:aws:iam::111111111111:role/eksServiceRole –resources-vpc-config subnetIds=subnet-0ee1049b877a5a513,subnet-014589d6ea6757dfc,subnet-0068e1e015dcf4548,securityGroupIds=sg-0f6ae1ed2bf922665
Partindo do princípio que você já tem toda a sua AWS CLI configurada, senão não chegaria até aqui (rs), crie agora o diretório oculto .kube na sua home: digite o comando abaixo para ele gerar o arquivo config dentro do diretório ~/.kube, com todas as confs de seu Cluster no EKS:
1 |
# aws eks update-kubeconfig --name nome-do-cluster |
O conteúdo do arquivo é esse:
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 29 30 31 32 33 34 35 36 37 38 39 40 |
apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc 0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNE1Ea3lPREF5TlRReE4xb1hEVEk0TURre U5UQXlOVFF4TjFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQl FBRGdnRVBBRENDQVFvQ2dnRUJBSnZhCnZtWkphQTdqUithODJqcFhZKzFIK2szU0ZKaDNpd0tYMVFkN0M4UWhMNDQ 0TE5sR3p2bFhGbTh2TlhOaUtoREYKVkNNdEVKYml1VDlCWm1sNW9UbzJsUG10SDlzV1hSajF2eTBEVDhjd1MxdVJHN lNuOGpCYW1PdU5ZNEV6WTFCNQpJODZJb2xPMHJmZDBsaWh2aEdqaTZDdFZhVXM3bDFaWmNsLzR1NWM3UjliSjZZci9 BOHJmVTRMZmkxWmZGTXdqClcxQy9nVEw2dUdZbkkrQURLVUdZY3o3LzZiZm5SQmhVL1ZuYkNrQzhvcklmdDdDc05GT m5vL2g4R0RYYzVTcEcKeEtCaDFQZklwU2NqaFVqb0ZaSnhBcldmNU9OVkx6dlVhQU9ZNmQ0c2VEelJUOE9Ea3dueGQ rR0NZdTExdFJyQQpDdlRQZ21xNnMrMDQzWkxVR0hzQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R 0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGV0dCcmNid2owNlk0c0JtTWE4bEk 3OEV0cjQKWERiVFRmTkx0N08zaVJSMFlxT1R4TDhhWXZEU3Jtd1hsbVdCZW4xMStzMmpjUjBtU0FNTUREV1RLdEhoc HJSMgp2MHAyUlZFNUtmOXh1OUJmdWE3TFg3QUI0S3JUelJMOUFNRWlDelNlNWw0RVFYVzZQZXYwSzFSVFdxMlR5VkV jCkNKclNpY2VpKzF6blprY2xIYndkRWQzVW9pRjNNemRoTXNKd0poNE5qL2cyQVErNGNFNDZLNjRCdDNuVGhTWEEKe DVKOG1BcnUwR3pNQmloMzJUeTBIR2xsZjhnZW8xcGtVRzkzV1lSMFMxbW0vcVZYUm11V3QxamRJZFkvYUlSZAphVkJ SRjhyWGtlRVdyaGJ5T1haQTkwTnp2aHhhOEtSVTZ3UTAxUnR5eWg4TG16czZQTE5OMHFSbGJoOD0KLS0tLS1FTkQgQ 0VSVElGSUNBVEUtLS0tLQo= server: https://c11ccc1c1c1c1c1c1c1c1c1c1c1c1c1c.yl4.us-east-1.eks.amazonaws.com name: arn:aws:eks:us-east-1:1111111111111:cluster/meu-cluster contexts: - context: cluster: arn:aws:eks:us-east-1:1111111111111 :cluster/meu-cluster user: arn:aws:eks:us-east-1:1111111111111 :cluster/meu-cluster name: arn:aws:eks:us-east-1:1111111111111 :cluster/meu-cluster current-context: arn:aws:eks:us-east-1:1111111111111 :cluster/meu-cluster kind: Config preferences: {} users: - name: arn:aws:eks:us-east-1:1111111111111 :cluster/meu-cluster user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 args: - token - -i - meu-cluster command: aws-iam-authenticator |
Teste a configuração:
1 2 3 |
# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 7m |
Agora crie um template no cloudformation que vai gerar as suas AMIs e security group necessários para a comunicação entre os seus nós. Além de a instalação automática do Amazon VPC CNI, plugin que permite ao Kubernetes receber endereços IP nativos da VPC, dando a eles acesso e segurança à rede. Siga este procedimento.
Após seguir os passos acima, dê continuidade com esta documentação.
Obrigado pela leitura! Qualquer pergunta ou comentário, escreva abaixo.
—
Aqui na Concrete, o capítulo de DevOps é o motor para a agilidade dos times, responsável por pensar estrategicamente na estrutura e arquitetura final, garantindo a qualidade. Justamente por automatizar processos e melhorar o desempenho do time de desenvolvimento, nossos “DevOps” trabalham desde o início da criação dos produtos, implementando processos de integração e entrega contínua, utilizando servidores de CI, repositórios de código, scripts de automatização e relatórios. Quer trabalhar com os melhores? Só vem! concrete.com.br/vagas