Назад | Перейти на главную страницу

kubectl не может пройти аутентификацию с AWS EKS

Я не могу получить kubectl для аутентификации с помощью экземпляра EKS Kubernetes, созданного моим коллегой. Я следил в документация: интерфейс командной строки AWS может работать aws eks команд (я - полный администратор AWS), а аутентификатор heptio находится на моем пути и может генерировать токены.

Когда я бегу kubectl Я получаю такую ​​ошибку:

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

Вот мой файл ~ / .kube / config. Это тот самый kubeconfig, который мой коллега может успешно использовать.

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

Мне нужно было добавить моего пользователя IAM в mapUsers раздел ConfigMap configmap/aws-auth, на эти документы AWS.

Вы можете редактировать конфигурационную карту, используя того же пользователя AWS, который изначально создал кластер.

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

К сожалению, в AWS пока нет такой команды, как GKE «get-credentials кластеров контейнеров gcloud», которая создает для вас конфигурацию kubectl. Итак, вам нужно создать файл конфигурации kubectl вручную.

Как упоминалось в создание kubeconfig для Amazon EKS документ, вы должны получить от кластера две вещи:

  1. Получите конечную точку для вашего кластера. Используйте это для <endpoint-url> в вашем файле kubeconfig.

    aws eks describe-cluster --cluster-name <cluster-name>  --query cluster.endpoint
    
  2. Получите certificateAuthority.data для своего кластера. Используйте это для <base64-encoded-ca-cert> в вашем файле kubeconfig.

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

Создайте папку kubectl по умолчанию, если она еще не существует.

mkdir -p ~/.kube

Откройте свой любимый текстовый редактор и вставьте в него следующий блок кода kubeconfig.

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

Заменить <endpoint-url> с URL-адресом конечной точки, созданным для вашего кластера. Заменить <base64-encoded-ca-cert> с сертификатомAuthority.data, который был создан для вашего кластера. Заменить <cluster-name> с именем вашего кластера.

Сохраните файл в папке kubectl по умолчанию, указав имя кластера в имени файла. Например, если имя вашего кластера - devel, сохраните файл в ~/.kube/config-devel.

Добавьте этот путь к файлу в свой KUBECONFIG переменная окружения, чтобы kubectl знает, где искать конфигурацию вашего кластера.

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

(Необязательно) Добавьте конфигурацию в файл инициализации оболочки, чтобы она настраивалась при открытии оболочки.

Для оболочек Bash в macOS:

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

Для оболочек Bash в Linux:

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

Проверьте свою конфигурацию.

kubectl get svc

Вывод:

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

Заметка
Если вы получили ошибку "heptio-authenticator-aws": executable file not found in $PATHтогда твой kubectl не настроен для Amazon EKS. Для получения дополнительной информации см. Настройте kubectl для Amazon EKS.

Передайте переменные конфигурации AWS в строке с командой (или установите их как глобальные переменные).

Пример:

AWS_PROFILE=profile_name kubectl get all

Я решил эту проблему, исправив сертификат в кодировке base64 в созданном мной файле kubeconfig. Документация немного сбивает с толку, потому что в ней говорится об использовании переключателя --cluster-name с aws cli для службы EKS, а для меня сработал переключатель --name. Это напечатало значение base64 в cli, и я скопировал его в сохраненный файл kubeconfig, и он сработал.

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

Со временем все стало немного проще. Чтобы начать работу с Linux (или даже с WSL), вам необходимо:

  1. Установите AWS CLI и настройте действительные учетные данные AWS CLI (aws configure или например использовать AWS SSO для генерации учетных данных с ограниченным сроком действия на лету)
  2. Установите eksctl и kubectl
  3. Установите aws-iam-authentication

На этом этапе, предполагая, что у вас уже есть работающий кластер Kubernetes в вашей учетной записи AWS, вы можете сгенерировать / обновить конфигурацию kube в $ HOME / .kube / config с помощью этой одной команды:

aws eks update-kubeconfig --name test

куда test имя вашего кластера согласно Консоли AWS (или aws eks list-clusters).

Теперь вы можете запустить, например kubectl get svc без ошибок.