kubectl não pode autenticar com o AWS EKS

2

Não consigo que kubectl autentique com a instância do EKS Kubernetes que meu colega de trabalho criou. Eu segui os documentação : o AWS CLI pode executar comandos aws eks (sou um administrador completo da AWS) e o heptio authenticatior está em meu caminho e pode gerar tokens.

Quando executo kubectl , recebo este erro:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.4", 
GitCommit:"5ca598b4ba5abb89bb773071ce452e33fb66339d", GitTreeState:"clean", 
BuildDate:"2018-06-06T15:22:13Z", GoVersion:"go1.9.6", Compiler:"gc", 
Platform:"darwin/amd64"}
error: You must be logged in to the server (the server has asked for the client
to provide credentials)

Aqui está o meu arquivo ~ / .kube / config. É o kubeconfig exato que meu colega de trabalho pode usar com sucesso.

apiVersion: v1
clusters:
- cluster:
    server: https://myinstance.sk1.us-east-1.eks.amazonaws.com
    certificate-authority-data: base64_cert                                                                                                                                                                                                   name: kubernetes                                                                                                                                                                                                                          contexts:                                                                                                                                                                                                                                   - context:                                                                                                                                                                                                                                      cluster: kubernetes                                                                                                                                                                                                                         user: aws                                                                                                                                                                                                                                 name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: heptio-authenticator-aws
      args:
        - "token"
        - "-i"
        - "dev-qa"
        # - "-r"
        # - "<role-arn>"
    
por spiffytech 11.06.2018 / 01:47

4 respostas

3

Eu precisava adicionar meu usuário do IAM à seção mapUsers do ConfigMap configmap/aws-auth , por esses documentos da AWS .

Você pode editar o configmap usando o mesmo usuário da AWS que criou inicialmente o cluster.

$ kubectl edit -n kube-system configmap/aws-auth

apiVersion: v1
data:
mapRoles: |
    - rolearn: arn:aws:iam::555555555555:role/devel-worker-nodes-NodeInstanceRole-74RF4UBDUKL6
    username: system:node:{{EC2PrivateDNSName}}
    groups:
        - system:bootstrappers
        - system:nodes
mapUsers: |
    - userarn: arn:aws:iam::555555555555:user/admin
    username: admin
    groups:
        - system:masters
    - userarn: arn:aws:iam::111122223333:user/ops-user
    username: ops-user
    groups:
        - system:masters
mapAccounts: |
    - "111122223333"
    
por 18.06.2018 / 15:19
0

Infelizmente, a AWS ainda não tem um comando como "gcloud container clusters get-credentials" do GKE, que cria a configuração do kubectl para você. Então, você precisa criar o arquivo de configuração do kubectl manualmente.

Como mencionado no documento criação de um kubeconfig para o Amazon EKS , você deve pegue duas coisas do cluster:

  1. Recupere o terminal para seu cluster. Use isso para o <endpoint-url> em seu arquivo kubeconfig.

    aws eks describe-cluster --cluster-name <cluster-name>  --query cluster.endpoint
    
  2. Recupere o certificateAuthority.data para seu cluster. Use isso para o <base64-encoded-ca-cert> em seu arquivo kubeconfig.

    aws eks describe-cluster --cluster-name <cluster-name>  --query cluster.certificateAuthority.data
    

Crie a pasta kubectl padrão se ela ainda não existir.

mkdir -p ~/.kube

Abra seu editor de texto favorito e cole o seguinte bloco de código kubeconfig nele.

apiVersion: v1
clusters:
- cluster:
    server: <endpoint-url>
    certificate-authority-data: <base64-encoded-ca-cert>
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: aws
  name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: heptio-authenticator-aws
      args:
        - "token"
        - "-i"
        - "<cluster-name>"
        # - "-r"
        # - "<role-arn>"
      # env:
        # - name: AWS_PROFILE
        #   value: "<aws-profile>"

Substitua o <endpoint-url> pelo URL do ponto de extremidade criado para o seu cluster. Substitua o <base64-encoded-ca-cert> pelo certificateAuthority.data que foi criado para seu cluster. Substitua o <cluster-name> pelo nome do seu cluster.

Salve o arquivo na pasta kubectl padrão, com o nome do cluster no nome do arquivo. Por exemplo, se o nome do cluster for devel, salve o arquivo em ~/.kube/config-devel .

Adicione esse caminho de arquivo à sua variável de ambiente KUBECONFIG para que kubectl saiba onde procurar sua configuração de cluster.

export KUBECONFIG=$KUBECONFIG:~/.kube/config-devel

(Opcional) Adicione a configuração ao seu arquivo de inicialização do shell para que ele seja configurado quando você abrir um shell.

Para shells Bash no macOS:

echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-devel' >> ~/.bash_profile

Para shells Bash no Linux:

echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-devel' >> ~/.bashrc

Teste sua configuração.

kubectl get svc

Saída:

NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   1m

Nota
Se você receber o erro "heptio-authenticator-aws": executable file not found in $PATH , seu kubectl não está configurado para o Amazon EKS. Para obter mais informações, consulte Configurar o kubectl para o Amazon EKS .

    
por 11.06.2018 / 12:17
0

Transmita suas variáveis de configuração da AWS de acordo com seu comando (ou defina-as como variáveis globais).

Exemplo:

AWS_PROFILE=profile_name kubectl get all
    
por 11.06.2018 / 15:17
0

Resolvi esse problema corrigindo o certificado codificado em base64 no arquivo kubeconfig que criei. A documentação é um pouco confusa porque diz usar o switch --cluster-name com o aws cli para o serviço EKS e para mim o switch --name funcionou. Isso imprimiu o valor de base64 para o cli e copiei o macarrão para o arquivo kubeconfig salvo e funcionou.

$ AWS_ACCESS_KEY_ID=[YOUR_ID_HERE] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_HERE] aws eks describe-cluster --name staging --query cluster.certificateAuthority.data
    
por 13.06.2018 / 02:00