EKS-来自服务器的错误(禁止):禁止命名空间:用户“arn::x/xx”无法在集群范围的 API 组“”中列出资源“命名空间”

问题描述 投票:0回答:1

遇到

来自服务器的错误(禁止):禁止命名空间:用户“arn:aws:iam::xxxxx:user/xx”无法在集群范围内的 API 组“”中列出资源“命名空间”

尝试时

kubectl get ns

这个我试过了

我的 terraform 可以访问 ARN(如下所示)

manage_aws_auth_configmap = true

aws_auth_users = [
  {
    userarn  = "arn:aws:iam::xxxxx:root"
    username = "root"
    groups   = ["system:masters"]
  },
  {
    userarn  = "arn:aws:iam::xxxxx:user"
    username = "xx"
    groups   = ["system:masters"]
  },
]

aws_auth_accounts = [
  "xxxxx"
]

我还通过在亚马逊云 shell 上运行此命令来验证集群是否具有 ConfigMap

apiVersion: v1
data:
  mapAccounts: |
    - "xxxxx"
  mapRoles: |
    - "groups":
      - "system:bootstrappers"
      - "system:nodes"
      "rolearn": "arn:aws:iam::xxxxx:role/backend-eks-node-group-xxxxxxxxxx"
      "username": "system:node:{{EC2PrivateDNSName}}"
  mapUsers: |
    - "groups":
      - "system:masters"
      "userarn": "arn:aws:iam::xxxxx:root"
      "username": "root"
    - "groups":
      - "system:masters"
      "userarn": "arn:aws:iam::xxxxx:user"
      "username": "xx"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-27T13:33:15Z"
  name: aws-auth
  namespace: kube-system
  resourceVersion: "26180451"
  uid: 13b72acd-5531-4fde-9a2c-43df456704e1

我还尝试创建一个新的 IAM 用户并授予完全访问权限,并尝试连接到 EKS。

amazon-web-services kubernetes terraform terraform-provider-aws amazon-eks
1个回答
0
投票

这个问题的答案实际上有两个方面。首先需要理解的是,分配给 IAM 用户/角色的权限与 AWS 中的权限相关。 EKS 权限与 Kubernetes 权限没有任何关系。前者允许用户/角色在使用 AWS 控制台/API/AWS CLI 时与 AWS 托管服务交互(即获取集群信息)。后者,即 Kubernetes 权限,允许您与集群交互,但是在使用

kubectl
时。通过ConfigMap可以实现IAM用户/角色与Kubernetes Role/ClusterRole之间的连接。为此,您必须创建一个 Role/ClusterRole 并将其绑定到 Kubernetes 用户/组。您可以执行此操作的方式取决于您的用例,但也可以使用 terraform 来实现。

resource "kubernetes_cluster_role_v1" "some_role" {
  metadata {
    name = "some-role-name"
  }

  rule {
    api_groups = [""]
    resources  = ["namespaces"]
    verbs      = ["get", "list"]
  }
}

resource "kubernetes_cluster_role_binding_v1" "some_role_binding" {
  metadata {
    name = "some-role-name-binding"
  }

  role_ref {
    api_group = "rbac.authorization.k8s.io"
    kind      = "ClusterRole"
    name      = kubernetes_cluster_role_v1.some_role.metadata[0].name
  }

  subject {
    kind = "User"
    name = "xx" # or whatever the user name is
  }
}

这样,ClusterRole 就被创建了,它将绑定到具有 EKS 配置的组

"system:masters"
以及您创建的用户:

aws_auth_users = [
  {
    userarn  = "arn:aws:iam::xxxxx:root"
    username = "root"
    groups   = ["system:masters"]
  },
  {
    userarn  = "arn:aws:iam::xxxxx:user"
    username = "xx"
    groups   = ["system:masters"]
  },
]

如果需要限制对特定命名空间的访问,可以使用 RoleBinding 而不是 ClusterRoleBinding。或者,如果需要额外的安全性,您可以创建一个 Role 并使用 RoleBinding。此外,此示例中的规则仅允许列出命名空间,因此如果需要,可以添加其他规则。

最后一步,您需要使用

aws eks update-kubeconfig <options>
命令更新 kube 配置文件。

注意:上述内容适用于使用旧的 EKS 身份验证方式(即

ConfigMap
)的情况。使用 EKS API 进行身份验证的新方法解决了前面提到的一些问题。

© www.soinside.com 2019 - 2024. All rights reserved.