AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1005978
Accepted
caprica
caprica
Asked: 2020-03-08 03:11:41 +0800 CST2020-03-08 03:11:41 +0800 CST 2020-03-08 03:11:41 +0800 CST

EKS 集群节点在授权失败大约 30 分钟后从 Ready 变为 NotReady

  • 772

我正在使用 eksctl 在 EKS/AWS 上设置集群。

按照 EKS 文档中的指南,我对几乎所有内容都使用默认值。

集群创建成功,我从集群更新了 Kubernetes 配置,我可以成功运行各种 kubectl 命令——例如“kubectl get nodes”显示节点处于“就绪”状态。

我没有碰任何其他东西,我有一个开箱即用的干净集群,没有进行任何其他更改,到目前为止,一切似乎都按预期工作。我不向它部署任何应用程序,我只是不理会它。

问题是在一段相对较短的时间后(大约在集群创建后 30 分钟),节点从“Ready”变为“NotReady”并且它永远不会恢复。

事件日志显示了这一点(我编辑了 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 创建的新集群会显示此问题。

我错过了什么?

kubernetes amazon-eks
  • 3 3 个回答
  • 4276 Views

3 个回答

  • Voted
  1. Best Answer
    caprica
    2020-08-13T08:14:41+08:002020-08-13T08:14:41+08:00

    这些是我为解决此问题而采取的步骤...

    1. 通过 SSH 连接到失败的实例。

    2. 执行“aws sts get-caller-identity”

    3. 注意用户的 ARN,它可能类似于 arn:aws:sts::999999999999:assumed-role/AmazonSSMRoleForInstancesQuickSetup/i-00000000000ffffff

    请注意这里的角色是 AmazonSSMRoleForInstancesQuickSetup,这对我来说似乎是错误的 - 但我相信我在创建集群时遵循了这封信的指南。

    到目前为止的问题:

    a) 为什么此角色用于 AWS 身份?

    b) 如果这是正确的角色,为什么一开始它会成功,而在集群创建后 30 分钟才失败?

    c) 如果这是正确的角色,缺少哪些访问权限?

    就个人而言,这对我来说感觉是错误的角色,但我通过解决 (c) 点解决了我的问题。

    继续步骤...

    1. 如果通过 AWS 控制台中的 IAM 服务检查此角色,可以看出它没有所有必需的权限,默认情况下它具有:
    • AmazonSSMManagedInstanceCore
    1. 假设这个角色是正确的角色,那么它至少需要添加以下策略:
    • AmazonEC2ContainerRegistryPowerUser

    以通常的方式附加该策略,我承认这可能会授予比需要更多的特权,但那是另一天。

    此时,AWS 安全配置现在应该是正确的,但这并不是故事的结束。

    1. Kubernetes 通过 kubelet 流程有自己的安全角色映射需要考虑——这是将 Kubernetes 用户映射到 AWS 上的 IAM 用户或角色。

    通过编辑 Kubernetes configmap 来维护此配置。

    使用“kubectl edit -n kube-system configmap/aws-auth”编辑 configmap。

    这是创建集群后立即进行任何更改之前的配置:

    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在 CodeBuild 管道调用 Kubernetes 的情况下,我还将之前为集群供应创建的集群安全角色映射到各种 Kubernetes 角色。

    1. 保存此配置映射,最终集群将自行修复并准备好报告。

    结论:

    执行完所有这些集群创建后步骤后,我的身份验证失败停止,集群开始再次报告成功状态,清除运行状况检查并将节点返回到Ready状态。

    我坦率地承认,这可能不是解决我的问题的“正确”方式,而且绝对感觉我打开了安全方式比我应该拥有的更多,但它确实有效并解决了我的问题。

    正如不久之后提到的,我们迁移到 Azure 而不是 AWS,所以我再也没有采取过这种做法——但我最终得到了一个完全正常工作的集群,不再有任何过期的凭证。

    我天真地认为我希望这些工具能够为我创建一个工作集群。在我找到的任何指南中都没有提到这个问题或这些步骤。

    • 2
  2. Crou
    2020-03-10T05:09:10+08:002020-03-10T05:09:10+08:00

    您的角色似乎即将到期。

    您可以从Amazon EKS 故障排除部分获得帮助Unauthorized or Access Denied (kubectl)。

    如果您在运行kubectl 命令 时收到以下错误之一 ,则您的kubectl 没有为 Amazon EKS 正确配置,或者您使用的 IAM 用户或角色凭证未映射到您的 Amazon EKS 集群中具有足够权限的 Kubernetes RBAC 用户.

    • 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 实体(用户或角色)将作为管理员(具有 system:master 权限)添加到 Kubernetes RBAC 授权表中。最初,只有该 IAM 用户可以使用 kubectl调用 Kubernetes API 服务器。有关更多信息,请参阅 管理集群的用户或 IAM 角色。此外, 适用于 Kubernetes 的 AWS IAM Authenticator 使用适用于 Go 的 AWS 开发工具包对您的 Amazon EKS 集群进行身份验证。如果您使用控制台创建集群,当您在集群上运行kubectl 命令时,您必须确保相同的 IAM 用户凭证位于 AWS 开发工具包凭证链中 。

    如果您安装和配置 AWS CLI,您可以为您的用户配置 IAM 凭证。如果为您的用户正确配置了 AWS CLI,则 适用于 Kubernetes 的 AWS IAM Authenticator 也可以找到这些凭证。有关更多信息,请参阅 AWS 命令​​行界面用户指南 中的 配置 AWS CLI。

    如果您代入了创建 Amazon EKS 集群的角色,则必须确保将 kubectl 配置为代入相同的角色。使用以下命令更新您的 kubeconfig 文件以使用 IAM 角色。有关更多信息,请参阅 为 Amazon EKS 创建 kubeconfig。

    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管理集群身份验证和为 Amazon EKS 创建 kubeconfig 的信息。

    请记住,您应该使用此处aws-iam-authenticator提供的安装过程。

    • 1
  3. Putnik
    2020-08-22T04:38:11+08:002020-08-22T04:38:11+08:00

    部署节点组时,您必须授予一个节点组角色,如文档(aws-auth-cm.yaml)中所述

    尽管所有 pod 看起来都正常,但在启动后约 7 分钟后,我的节点进入 NotReady 并出现上述问题中的错误。

    原因:由于输入错误,节点组的角色与该 yaml 中的角色不同。

    • 1

相关问题

  • 无法通过 Docker 在本地运行 Hyperkube (kubernetes)

  • 跨 Kubernetes 分散工作负载

  • Kubernetes升级回滚机器类型

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve