Configure kubectl para gerenciar dois namespaces com usuários diferentes em um mesmo cluster Kubernetes

1. Introdução

Esse artigo mostra como configurar o kubectl no computador local para gerenciar dois namespaces com usuários diferentes em um mesmo cluster Kubernetes. Esse procedimento assume que a configuração do cluster e do namespace no EKS, bem como a criação dos usuários IAM no AWS, já foi realizada.

Além disso, você precisará também instalar e configurar o kubectl e o AWS CLI no seu computador. Bom, se você já tem todas as ferramentas e pré-requisitos, então mãos à obra.

2. Configurar o AWS credentials 

O primeiro passo é adicionar os usuários IAM ao arquivo de credenciais do AWS. Normalmente esse arquivo fica em %userprofile%\.aws\credentials

Adicione os usuários conforme exemplificado abaixo:

[my-first-user]
aws_access_key_id = ACCESSKEYID01
aws_secret_access_key = somesharesecretacesskey
region=eu-central-1

[my-second-user]
aws_access_key_id = ACCESSKEYID02
aws_secret_access_key = anothersharesecretacesskey
region=eu-central-1

Os nomes entre “[ ]” são apelidos (alias) para os seus usuários do AWS. Você pode escolher o nome que melhor lhe convir.

Da mesma forma, a Access Key ID e Secret Access Key de cada usuário dependem do seu ambiente, portanto se você não tiver essas informações, verifique-as com o seu administrador do AWS.

Finalmente, a região depende de onde o cluster EKS foi configurado no seu ambiente. Novamente, verifique isso com o administrador do cluster e faça os ajustes necessários para o seu ambiente. 

3. Configurar o primeiro namespace no kubectl

Abra um novo prompt de comando e configure uma variável de ambiente para referir ao primeiro usuário AWS.

PS> $env:AWS_PROFILE="my-first-user"

Você pode executar o seguinte comando para verificar que o usuário foi configurado e assumido corretamente pelo prompt de comando. Se tudo estiver configurado corretamente você deve ver a Access Key ID do usuário que você configurou no arquivo credentials, bem como outras informações do usuário obtidas no AWS.

PS> aws sts get-caller-identity
{
  "UserId": "ACCESSKEYID01",
  "Account": "999999999999",
  "Arn": "arn:aws:iam::430423143424:user/my-eks-user-1"
}

Agora vamos adicionar o cluster EKS ao kubectl com o seguinte comando:

PS> aws eks update-kubeconfig --region eu-central-1 --name my-eks-cluster-name

Note que no comando acima o parâmetro --name deve referir ao nome do cluster no seu ambiente AWS. Neste caso não é necessário utilizar o ARN do cluster, apenas o nome é suficiente.

Execute o seguinte comando para verificar que o contexto foi adicionado no kubectl:

PS> kubectl config get-contexts

Você deve ver o contexto que acabou de adicionar. Note que o campo NAMESPACE ainda está em branco. Nós vamos agora modificar isso, e ajustar algumas configurações do contexto:

CURRENTNAMECLUSTERAUTHINFONAMESPACE
*arn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-namearn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-namearn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-name

Conforme comentamos, dado que há múltiplos namespaces configurados sob o mesmo cluster, vamos executar o comando abaixo para definir o nome do namespace a que esse contexto se refere. O nome do namespace já foi definido durante a configuração do cluster EKS, portanto, certifique-se do nome referente ao seu ambiente.

Além disso, vamos usar o parâmetro --user para definir um alias para o usuário que o kubectl utilizará para gerenciar esse contexto. 

PS> kubectl config set-context --current --namespace my-namespace1 --user my-eks-user-1

Agora, ao executar o comando kubectl config get-contexts, devemos ver as alterações que acabamos de executar:

CURRENTNAMECLUSTERAUTHINFONAMESPACE
*arn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-namearn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-namemy-eks-user-1 my-namespace1

Para facilitar o gerenciamento desse contexto no futuro, vamos também alterar o nome do contexto. Para isso, execute o seguinte comando:

PS> kubectl config rename-context arn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-name first-context

Os parâmetros utilizados nesse comando são o nome atual do contexto ( arn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-name ) e o nome desejado (ou seja, first-context). Ajuste esses nomes de acordo com sua necessidade.

Ótimo, agora ao executar kubectl config get-contexts novamente, as configurações do contexto devem ser parecidas com essa:

CURRENTNAMECLUSTERAUTHINFONAMESPACE
* first-contextarn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-namemy-eks-user-1 my-namespace1

4. Adicionar o segundo contexto

Para adicionar o segundo contexto, vamos basicamente repetir os passos que executamos para adicionar o primeiro contexto. Por isso, vou cobrir isso de mais resumidamente nessa seção. Configure a variável de ambiente referente ao segundo usuário AWS.

PS> $env:AWS_PROFILE="my-second-user"

Execute novamente o comando para adicionar o cluster EKS. Isso vai adicionar uma nova entrada no arquivo de configuração do kubectl.

PS> aws eks update-kubeconfig --region eu-central-1 --name my-eks-cluster-name

Updated context arn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-name in C:\Users\User1.kube\config

Modifique as configurações do contexto para definir o namespace e o alias do usuário que o kubectl utilizará para gerenciar esse contexto e, finalmente, renomeie o contexto:

PS> kubectl config set-context --current --namespace my-namespace2 --user my-eks-user-2

PS> kubectl config rename-context arn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-name second-context

Agora o comando kubectl config get-contexts deve mostrar os dois contextos configurados no seu ambiente:

CURRENTNAMECLUSTERAUTHINFONAMESPACE
* first-contextarn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-namemy-eks-user-1 my-namespace1
second-contextarn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-namemy-eks-user-2my-namespace2

5. Ajustar usuários no kubectl

O último passo é ajustar os usuários no arquivo de configuração do kubectl. O arquivo de configuração do kubectl contém os clusters, contextos e usuários configurados no kubectl. 

O arquivo de configuração do kubectl usa a sintaxe YAML, portanto tome muito cuidado com a identação das linhas. Normalmente o arquivo fica armazenado em %userprofile%\.kube\conf. Abra esse arquivo com um editor de texto como o Notepad ou Notepad++.

Conforme destacado na figura abaixo, o arquivo de configuração do kubectl tem três entradas principais: clusters, contexts e users.

A seção contexts: contém uma entrada para cada contexto que adicionamos nos passos 2 e 3. Além disso, cada entrada de contexto contém o nome do usuário correspondente que definimos nos passos 2 e 3.

A seção users: contém os usuários que utilizamos durante a configuração do cluster. É possível notar que essa seção contém apenas 1 usuário. Além disso, o nome do usuário definido na seção users: (“arn:aws:eks:eu-central-1:999999999999:cluster/my-eks-cluster-name”), difere dos nomes dos usuários que definimos nos passos anteriores (“my-eks-user-1” e “my-eks-user-2”).

Texto que mostra um arquivo de configuração do kubectl

O primeiro passo, portanto, é adicionar um novo usuário na seção users:. Conforme ilustrado abaixo, copie todo o conteúdo a partir da linha name: até a linha value: e cole no final do arquivo.

Em seguida, modifique o valor do parâmetro name: nos dois usuários para que correspondam ao nome dos usuários que definimos nos passos 2 e 3 (ou seja, my-eks-user-1 e my-eks-user-2). 

Finalmente, modique o valor do parâmetro value: dos usuários para que correspondam ao valor do alias dos usuários AWS definidos no arquivo %userprofile%\.aws\credentials, e que usamos nas variáveis de ambiente nos passos 2 e 3 (ou seja, my-first-user e my-second-user).

O arquivo deve ficar parecido com a imagem à esquerda:

Finalmente, volte ao prompt de comando e execute o seguinte comando para listar os recursos existentes no namespace:

PS> kubectl get pods