%20%E2%80%94%20%D0%BA%D0%B0%D0%BA%20%D0%B8%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C.png)
Без изменений в инфраструктуре Если я выполню любую команду 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.