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

Узлы кластера EKS переходят из состояния готовности в состояние NotReady примерно через 30 минут с ошибками авторизации.

Я использую 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, обнаружил эту проблему.

Что я пропустил?

Вот шаги, которые я выполнил, чтобы решить эту проблему ...

  1. Подключитесь к отказавшему экземпляру через SSH.

  2. Выполните "aws sts get-caller-identity"

  3. Обратите внимание на ARN пользователя, вероятно, это будет что-то вроде этого arn: aws: sts :: 999999999999: loaded-role / AmazonSSMRoleForInstancesQuickSetup / i-00000000000ffffff

Обратите внимание на роль здесь AmazonSSMRoleForInstancesQuickSetup, мне это кажется неправильным, но, как мне кажется, я строго следовал руководствам при создании кластера.

Проблемы на данный момент:

а) Почему эта роль используется для идентификации AWS?

б) Если это правильная роль, почему она сначала успешна, а терпит неудачу только через 30 минут после создания кластера?

c) Если это правильная роль, какие права доступа отсутствуют?

Лично мне кажется, что это неправильная роль, но я решил свою проблему, обратившись к пункту (c).

Продолжая шаги ...

  1. Если эту роль проверить через службу IAM в консоли AWS, можно увидеть, что у нее нет всех необходимых разрешений, по умолчанию у нее есть:
  • AmazonSSMManagedInstanceCore
  1. Если предположить, что эта роль является правильной для использования, тогда к ней необходимо добавить как минимум следующую политику:
  • AmazonEC2ContainerRegistryPowerUser

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

На этом этапе конфигурация безопасности AWS должна быть правильной, но это еще не конец истории.

  1. Kubernetes через процесс kubelet имеет свои собственные сопоставления ролей безопасности, которые необходимо учитывать - это сопоставление пользователей Kubernetes с пользователями IAM или ролями в 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.

  1. Измените конфигурационную карту:
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.

  1. Сохраните эту конфигурационную карту, и в конечном итоге кластер восстановит себя и будет готов отчет.

Вывод:

После выполнения всех этих шагов после создания кластера мои сбои аутентификации прекратились, и кластер снова начал сообщать об успешном статусе, очищая проверку работоспособности и возвращая узел в 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 из-за опечатки.