遇到
来自服务器的错误(禁止):禁止命名空间:用户“arn:aws:iam::xxxxx:user/xx”无法在集群范围内的 API 组“”中列出资源“命名空间”
尝试时
kubectl get ns
这个我试过了
https://repost.aws/knowledge-center/eks-kubernetes-object-access-error
我尝试访问 EKS 集群的 IAM 角色拥有以下权限:
EKS管理员拥有所有资源的“完全访问”权限
我的 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。
这个问题的答案实际上有两个方面。首先需要理解的是,分配给 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 配置文件。
ConfigMap
)的情况。使用 EKS API 进行身份验证的新方法解决了前面提到的一些问题。