Я использую eksctl для настройки кластера на EKS / AWS.
Следуя руководству в документации EKS, я использую значения по умолчанию практически для всего.
Кластер создан успешно, я обновляю конфигурацию Kubernetes из кластера и могу успешно запускать различные команды kubectl - например, «kubectl get nodes» показывает мне, что узлы находятся в состоянии «Готово».
Больше я ничего не трогаю, у меня чистый готовый кластер, работающий без каких-либо других изменений, и пока вроде бы все работает как положено. Никаких приложений к нему не развертываю, просто оставляю в покое.
Проблема в том, что через относительно короткий промежуток времени (примерно через 30 минут после создания кластера) узлы меняются с «Готово» на «Не готово» и никогда не восстанавливаются.
Журнал событий показывает это (я отредактировал IP):
LAST SEEN TYPE REASON OBJECT MESSAGE
22m Normal Starting node/ip-[x] Starting kubelet.
22m Normal NodeHasSufficientMemory node/ip-[x] Node ip-[x] status is now: NodeHasSufficientMemory
22m Normal NodeHasNoDiskPressure node/ip-[x] Node ip-[x] status is now: NodeHasNoDiskPressure
22m Normal NodeHasSufficientPID node/ip-[x] Node ip-[x] status is now: NodeHasSufficientPID
22m Normal NodeAllocatableEnforced node/ip-[x] Updated Node Allocatable limit across pods
22m Normal RegisteredNode node/ip-[x] Node ip-[x] event: Registered Node ip-[x] in Controller
22m Normal Starting node/ip-[x] Starting kube-proxy.
21m Normal NodeReady node/ip-[x] Node ip-[x] status is now: NodeReady
7m34s Normal NodeNotReady node/ip-[x] Node ip-[x] status is now: NodeNotReady
Те же события для другого узла в кластере.
Подключение к экземпляру и проверка / var / log / messages показывает это в то же время, когда узел переходит в NotReady:
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.259207 3896 kubelet_node_status.go:385] Error updating node status, will retry: error getting node "ip-[x]": Unauthorized
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.385044 3896 kubelet_node_status.go:385] Error updating node status, will retry: error getting node "ip-[x]": Unauthorized
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.621271 3896 reflector.go:270] object-"kube-system"/"aws-node-token-bdxwv": Failed to watch *v1.Secret: the server has asked for the client to provide credentials (get secrets)
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.621320 3896 reflector.go:270] object-"kube-system"/"coredns": Failed to watch *v1.ConfigMap: the server has asked for the client to provide credentials (get configmaps)
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.638850 3896 reflector.go:270] k8s.io/client-go/informers/factory.go:133: Failed to watch *v1beta1.RuntimeClass: the server has asked for the client to provide credentials (get runtimeclasses.node.k8s.io)
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.707074 3896 reflector.go:270] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:47: Failed to watch *v1.Pod: the server has asked for the client to provide credentials (get pods)
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.711386 3896 reflector.go:270] object-"kube-system"/"coredns-token-67fzd": Failed to watch *v1.Secret: the server has asked for the client to provide credentials (get secrets)
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.714899 3896 reflector.go:270] object-"kube-system"/"kube-proxy-config": Failed to watch *v1.ConfigMap: the server has asked for the client to provide credentials (get configmaps)
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.720884 3896 kubelet_node_status.go:385] Error updating node status, will retry: error getting node "ip-[x]": Unauthorized
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.868003 3896 kubelet_node_status.go:385] Error updating node status, will retry: error getting node "ip-[x]": Unauthorized
Mar 7 10:40:37 ip-[X] kubelet: E0307 10:40:37.868067 3896 controller.go:125] failed to ensure node lease exists, will retry in 200ms, error: Get https://[X]/apis/coordination.k8s.io/v1beta1/namespaces/kube-node-lease/leases/ip-[x]?timeout=10s: write tcp 192.168.91.167:50866->34.249.27.158:443: use of closed network connection
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.017157 3896 kubelet_node_status.go:385] Error updating node status, will retry: error getting node "ip-[x]": Unauthorized
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.017182 3896 kubelet_node_status.go:372] Unable to update node status: update node status exceeds retry count
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.200053 3896 controller.go:125] failed to ensure node lease exists, will retry in 400ms, error: Unauthorized
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.517193 3896 reflector.go:270] object-"kube-system"/"kube-proxy": Failed to watch *v1.ConfigMap: the server has asked for the client to provide credentials (get configmaps)
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.729756 3896 controller.go:125] failed to ensure node lease exists, will retry in 800ms, error: Unauthorized
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.752267 3896 reflector.go:126] object-"kube-system"/"aws-node-token-bdxwv": Failed to list *v1.Secret: Unauthorized
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.824988 3896 reflector.go:126] object-"kube-system"/"coredns": Failed to list *v1.ConfigMap: Unauthorized
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.899566 3896 reflector.go:126] k8s.io/client-go/informers/factory.go:133: Failed to list *v1beta1.RuntimeClass: Unauthorized
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.963756 3896 reflector.go:126] k8s.io/client-go/informers/factory.go:133: Failed to list *v1beta1.CSIDriver: Unauthorized
Mar 7 10:40:38 ip-[X] kubelet: E0307 10:40:38.963822 3896 reflector.go:126] object-"kube-system"/"kube-proxy-config": Failed to list *v1.ConfigMap: Unauthorized
Журналы CloudWatch для компонента аутентификатора показывают многие из этих сообщений:
time="2020-03-07T10:40:37Z" level=warning msg="access denied" arn="arn:aws:iam::[ACCOUNT_ID]]:role/AmazonSSMRoleForInstancesQuickSetup" client="127.0.0.1:50132" error="ARN is not mapped: arn:aws:iam::[ACCOUNT_ID]:role/amazonssmroleforinstancesquicksetup" method=POST path=/authenticate
Я подтвердил, что эта роль существует через консоль IAM.
Очевидно, что этот узел сообщает NotReady из-за этих сбоев аутентификации.
Это какой-то токен аутентификации, время ожидания которого истекло примерно через 30 минут, и если да, не должен ли автоматически запрашиваться новый токен? Или я должен что-то другое настроить?
Я был удивлен, что новый кластер, созданный eksctl, обнаружил эту проблему.
Что я пропустил?
Вот шаги, которые я выполнил, чтобы решить эту проблему ...
Подключитесь к отказавшему экземпляру через SSH.
Выполните "aws sts get-caller-identity"
Обратите внимание на ARN пользователя, вероятно, это будет что-то вроде этого arn: aws: sts :: 999999999999: loaded-role / AmazonSSMRoleForInstancesQuickSetup / i-00000000000ffffff
Обратите внимание на роль здесь AmazonSSMRoleForInstancesQuickSetup, мне это кажется неправильным, но, как мне кажется, я строго следовал руководствам при создании кластера.
Проблемы на данный момент:
а) Почему эта роль используется для идентификации AWS?
б) Если это правильная роль, почему она сначала успешна, а терпит неудачу только через 30 минут после создания кластера?
c) Если это правильная роль, какие права доступа отсутствуют?
Лично мне кажется, что это неправильная роль, но я решил свою проблему, обратившись к пункту (c).
Продолжая шаги ...
Прикрепите эту политику обычным способом, я допускаю, что это может предоставить больше привилегий, чем необходимо, но это на другой день.
На этом этапе конфигурация безопасности AWS должна быть правильной, но это еще не конец истории.
Эта конфигурация поддерживается путем редактирования карты конфигурации Kubernetes.
Отредактируйте конфигурационную карту с помощью «kubectl edit -n kube-system configmap / aws-auth».
Это конфигурация сразу после создания кластера, до внесения каких-либо изменений:
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::999999999999:role/eksctl-my-demo-nodegroup-my-demo-NodeInstanceRole-AAAAAAAAAAAAA
username: system:node:{{EC2PrivateDNSName}}
kind: ConfigMap
metadata:
[...whatever...]
Единственная роль, отображаемая здесь, - это роль экземпляра узла - эта роль была создана автоматически во время подготовки кластера через eksctl
.
apiVersion: v1
data:
mapRoles: |
- rolearn: arn:aws:iam::999999999999:role/eksctl-my-demo-nodegroup-my-demo-NodeInstanceRole-AAAAAAAAAAAAA
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
- rolearn: arn:aws:iam::999999999999:role/AmazonSSMRoleForInstancesQuickSetup
username: MyDemoEKSRole
groups:
- system:masters
- rolearn: arn:aws:iam::999999999999:role/MyDemoEKSRole
username: CodeBuild
groups:
- system:masters
- system:bootstrappers
- system:nodes
kind: ConfigMap
metadata:
[...whatever...]
Я сопоставил роль AmazonSSMRoleForInstancesQuickSetup как ведущую роль Kubernetes.
Я также нанес на карту MyDemoEKSRole
роль безопасности кластера, ранее созданная для подготовки кластера к различным ролям Kubernetes, для случая, когда Kubernetes вызывается конвейером CodeBuild.
Вывод:
После выполнения всех этих шагов после создания кластера мои сбои аутентификации прекратились, и кластер снова начал сообщать об успешном статусе, очищая проверку работоспособности и возвращая узел в Ready
положение дел.
Я открыто признаю, что это может быть не «правильный» способ решения моей проблемы, и мне определенно кажется, что я открыл путь безопасности больше, чем должен был, но это определенно сработало и решило мою проблему.
Как упоминалось вскоре после этого, мы перешли на Azure вместо AWS, поэтому я больше не пошел в этом направлении, но в итоге у меня получился полностью рабочий кластер без устаревших учетных данных.
Наивно полагаю, я ожидал, что инструменты создадут для меня рабочий кластер. Ни в одном найденном мной руководстве нигде не было упоминания об этой проблеме или этих шагах.
Похоже, ваша роль истекает.
Вы можете получить помощь от Amazon EKS Устранение неполадок раздел Unauthorized or Access Denied (kubectl)
.
Если вы получаете одну из следующих ошибок во время работы kubectl команды, тогда ваш kubectl неправильно настроен для Amazon EKS или учетные данные пользователя или роли IAM, которые вы используете, не сопоставлены с пользователем Kubernetes RBAC с достаточными разрешениями в вашем кластере Amazon EKS.
could not get token: AccessDenied: Access denied
error: You must be logged in to the server (Unauthorized)
error: the server doesn't have a resource type "svc"
Это может быть связано с тем, что кластер был создан с одним набором учетных данных AWS (от пользователя или роли IAM), и kubectl использует другой набор учетных данных.
При создании кластера Amazon EKS объект IAM (пользователь или роль), который создает кластер, добавляется в таблицу авторизации Kubernetes RBAC в качестве администратора (с
system:master
разрешения). Изначально только этот пользователь IAM может звонить на сервер Kubernetes API, используя kubectl. Для получения дополнительной информации см. Управление пользователями или ролями IAM для вашего кластера. Так же AWS IAM Authenticator для Kubernetes использует AWS SDK для Go для аутентификации в вашем кластере Amazon EKS. Если вы используете консоль для создания кластера, вы должны убедиться, что те же учетные данные пользователя IAM находятся в цепочке учетных данных AWS SDK при запуске kubectl команды в вашем кластере.Если вы устанавливаете и настраиваете интерфейс командной строки AWS, вы можете настроить учетные данные IAM для своего пользователя. Если интерфейс командной строки AWS настроен для вашего пользователя правильно, то AWS IAM Authenticator для Kubernetes также можно найти эти учетные данные. Для получения дополнительной информации см. Настройка AWS CLI в Руководство пользователя интерфейса командной строки AWS.
Если вы взяли на себя роль для создания кластера Amazon EKS, вы должны убедиться, что kubectl настроен на выполнение той же роли. Используйте следующую команду, чтобы обновить файл kubeconfig для использования роли IAM. Для получения дополнительной информации см. Создайте kubeconfig для Amazon EKS.
aws --region `region-code` eks update-kubeconfig --name `cluster_name` --role-arn arn:aws:iam::`aws_account_id`:role/`role_name
Чтобы сопоставить пользователя IAM с пользователем Kubernetes RBAC, см. Управление пользователями или ролями IAM для вашего кластера или смотреть видео о том, как отобразить пользователя.
Вы должны прочитать о Управление аутентификацией кластера для AWS и Создайте kubeconfig для Amazon EKS.
Имейте в виду, что вам следует использовать aws-iam-authenticator
процесс установки доступен Вот.
Когда вы развертываете группу узлов, вы должны предоставить роль группы узлов, как описано в документе (AWS-auth-cm.yaml)
Мои узлы перешли в NotReady с ошибками, как в вопросе выше, через ~ 7 минут после запуска, несмотря на то, что все модули выглядели нормально.
Причина: роль группы узлов не была такой же, как роль в этом yaml из-за опечатки.