Ошибка kubectl get nodes: Вы должны войти на сервер (неавторизовано) — как исправить

Ошибка kubectl get nodes: Вы должны войти на сервер (неавторизовано) — как исправить

Без изменений в инфраструктуре Если я выполню любую команду kubectl, например:

kubectl get nodes

Я получаю сообщение об ошибке

You must be logged in to the server (Unauthorized) 

Кластер Kubernetes работал нормально, и я не вносил в него никаких изменений... Есть идеи, как это отладить? У kubectl нет флага отладки -vv od для предоставления дополнительной информации.

Если я попробую

kubectl version

Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0",
(...) 
error: You must be logged in to the server (the server has asked for the client to provide credentials)

решение1

В моем случае проблема началась после обновления сертификатов Kubernates, из-за чего ~/.kube/configв существующих ключах и значениях сертификатов появились устаревшие значения.

Решением было заменитьценности client-certificate-dataи client-key-dataв файле ~/.kube/configсо значениями из обновленного файла с /etc/kubernetes/kubelet.confтем же именем.

решение2

Вы можете скопировать client-certificate-dataи client-key-dataиз /etc/kubernetes/admin.confв свой ~/.kube/configфайл из более поздних версий Kubernetes. Смотретьэтот ответдля определения срока действия ваших сертификатов.

решение3

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

У меня есть отдельный пользователь для подключения к моему кластеру k8s (это обычный кластер в экземплярах EC2). Я создал пользователя arunlal с ограниченным доступом, добавив ClusterRoleBindings.

Если при запуске API для кластера (в моем случае Kubectl) возникает следующая ошибка:

error: You must be logged in to the server (Unauthorized)

Действуйте в следующем порядке.

- Сначала проверьте сертификат, используемый в вашем файле конфигурации (локальный клиент)

У меня была отдельная конфигурация на моей локальной системе, потому что основная конфигурация содержала сведения о других учетных данных кластера k8s и okd. Поэтому я создал вторую конфигурацию на своем ноутбуке (/Users/arunlal/.kube/config_two). В этом случае у меня есть следующие псевдонимы:

alias kctl="kubectl --kubeconfig=/Users/arunlal/.kube/config_two"

- Из этого файла вы получите сертификат, который мы используем.

[[email protected]~] cat /Users/arunlal/.kube/config_two| grep -A 5 пользователей
пользователи:
- имя: арунлал
  пользователь:
    клиентский сертификат: /Users/arunlal/.arunlal-keys/arunlal.crt
    клиентский ключ: /Users/arunlal/.arunlal-keys/arunlal.key

- После добавления сертификата в конфигурацию клиента вы можете проверить его действительность с помощью команды openssl.

    [[email protected]~] openssl x509 -noout -dates -in /Users/arunlal/.arunlal-keys/arunlal.crt
    notBefore=22 июня 23:43:22 2021 GMT
    notAfter=30 сентября 2021 23:43:22 GMT

- Подтвердите истечение срока действия

При создании пользователя я передал дни как 5, в этом и была проблема. Как я создал пользователя?

openssl genrsa -out arunlal.key 2048
openssl req -new -key arunlal.key -out arunlal.csr -subj "/CN=arunlal/O=crybit"
openssl x509 -req -in arunlal.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out arunlal.crt -days 5
kubectl config set-credentials arunlal --client-certificate=/root/arunlal-keys/arunlal.crt  --client-key=/root/arunlal-keys/arunlal.key

- Чтобы исправить, я пересоздал сертификат с большим количеством дней.

openssl x509 -req -in arunlal.csr -CA /etc/kubernetes/pki/ca.crt
-CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out arunlal.crt -days 100

- Это нам нужно запустить из кластера k8s.

- Заменил сертификат локально.

Изменен /Users/arunlal/.arunlal-keys/arunlal.crt с новым сертификатом.

Надеюсь, это кому-то поможет. Спасибо!

~ Арун

решение4

Сертификат kubeconfig мог измениться. Если вы развернули кластер с помощью terraform. Выполните terraform apply, чтобы сгенерировать новый файл kubeconfig.

Связанный контент