Я не могу получить 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 документ, вы должны получить от кластера две вещи:
Получите конечную точку для вашего кластера. Используйте это для <endpoint-url>
в вашем файле kubeconfig.
aws eks describe-cluster --cluster-name <cluster-name> --query cluster.endpoint
Получите 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), вам необходимо:
aws configure
или например использовать AWS SSO для генерации учетных данных с ограниченным сроком действия на лету)На этом этапе, предполагая, что у вас уже есть работающий кластер Kubernetes в вашей учетной записи AWS, вы можете сгенерировать / обновить конфигурацию kube в $ HOME / .kube / config с помощью этой одной команды:
aws eks update-kubeconfig --name test
куда test
имя вашего кластера согласно Консоли AWS (или aws eks list-clusters
).
Теперь вы можете запустить, например kubectl get svc
без ошибок.