9 votes

kubectl ne peut pas s'authentifier avec AWS EKS

Je ne peux pas obtenir kubectl pour s'authentifier avec l'instance Kubernetes d'EKS que mon collègue a créée. J'ai suivi le site documentation : l'AWS CLI peut exécuter aws eks (je suis un administrateur complet AWS), et l'authentificateur heptio est dans mon chemin et peut générer des jetons.

Quand je cours kubectl Je reçois cette erreur :

$ 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)

Voici mon fichier ~/.kube/config. C'est exactement le même kubeconfig que mon collègue peut utiliser avec succès.

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>"

12voto

Yuval Points 1071

J'avais besoin d'ajouter mon utilisateur IAM à la base de données de l'entreprise. mapUsers de la ConfigMap configmap/aws-auth par ces documents AWS .

Vous pouvez modifier la carte de configuration en utilisant le même utilisateur AWS qui a initialement créé le 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"

3voto

VAS Points 360

Malheureusement, AWS ne dispose pas encore d'une commande comme "gcloud container clusters get-credentials" de GKE, qui crée la configuration kubectl pour vous. Vous devez donc créer le fichier de configuration kubectl manuellement.

Comme mentionné dans création d'un kubeconfig pour Amazon EKS vous devriez obtenir deux choses du cluster :

  1. Récupérer le point de terminaison pour votre cluster. Utilisez ceci pour le <endpoint-url> dans votre fichier kubeconfig.

    aws eks describe-cluster --cluster-name <cluster-name>  --query cluster.endpoint
  2. Récupérez le certificateAuthority.data pour votre cluster. Utilisez ceci pour le <base64-encoded-ca-cert> dans votre fichier kubeconfig.

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

Créez le dossier kubectl par défaut s'il n'existe pas déjà.

mkdir -p ~/.kube

Ouvrez votre éditeur de texte préféré et collez-y le bloc de code kubeconfig suivant.

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>"

Remplacer le <endpoint-url> avec l'URL du point de terminaison qui a été créé pour votre cluster. Remplacez le <base64-encoded-ca-cert> avec le certificateAuthority.data qui a été créé pour votre cluster. Remplacez le <cluster-name> avec le nom de votre cluster.

Enregistrez le fichier dans le dossier kubectl par défaut, avec le nom de votre cluster dans le nom du fichier. Par exemple, si votre nom de cluster est devel, enregistrez le fichier dans le dossier ~/.kube/config-devel .

Ajoutez ce chemin de fichier à votre KUBECONFIG afin que la variable d'environnement kubectl sait où chercher la configuration de votre cluster.

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

(Facultatif) Ajoutez la configuration à votre fichier d'initialisation Shell afin qu'elle soit configurée lorsque vous ouvrez un Shell.

Pour les shells Bash sur macOS :

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

Pour les shells Bash sur Linux :

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

Testez votre configuration.

kubectl get svc

Sortie :

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

Note
Si vous recevez l'erreur "heptio-authenticator-aws": executable file not found in $PATH alors votre kubectl n'est pas configuré pour Amazon EKS. Pour plus d'informations, voir Configurer kubectl pour Amazon EKS .

1voto

M Jensen Points 111

Les choses se sont un peu simplifiées avec le temps. Pour commencer à utiliser Linux (ou WSL), vous aurez besoin de :

  1. Installer le CLI d'AWS et configurer des informations d'identification AWS CLI valides ( aws configure ou, par exemple, utiliser AWS SSO pour générer à la volée des identifiants limités dans le temps)
  2. Installer eksctl et kubectl
  3. Installer aws-iam-authenticator

À ce stade, en supposant que vous avez déjà un cluster Kubernetes en cours d'exécution dans votre compte AWS, vous pouvez générer/mettre à jour la configuration kube dans $HOME/.kube/config avec cette seule commande :

aws eks update-kubeconfig --name test

test est le nom de votre cluster selon l'AWS Console (ou aws eks list-clusters ).

Vous pouvez maintenant exécuter par exemple kubectl get svc sans obtenir d'erreur.

0voto

getglad Points 101

Passez vos variables de configuration AWS en ligne avec votre commande (ou définissez-les comme variables globales).

Exemple :

AWS_PROFILE=profile_name kubectl get all

0voto

Brayton Stafford Points 101

J'ai résolu ce problème en fixant le certificat encodé en base64 dans le fichier kubeconfig que j'ai créé. La documentation est un peu confuse car elle dit d'utiliser le commutateur --cluster-name avec le cli aws pour le service EKS et pour moi le commutateur --name a fonctionné. Cela a imprimé la valeur base64 à la cli et je l'ai copiée dans le fichier kubeconfig sauvegardé et cela a fonctionné.

$ AWS_ACCESS_KEY_ID=[YOUR_ID_HERE] AWS_SECRET_ACCESS_KEY=[YOUR_SECRET_HERE] aws eks describe-cluster --name staging --query cluster.certificateAuthority.data

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X