Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
如何管理 Amazon EKS 集群中 IAM 用户的跨命名空间权限?
我想管理 Amazon Elastic Kubernetes Service(Amazon EKS)集群中 AWS Identity and Access Management(IAM)用户的跨命名空间用户权限。
简短描述
要管理 Amazon EKS 集群中跨命名空间的用户权限,请完成以下步骤:
- 创建 IAM 角色供组织成员代入。
- 为集群创建 Kubernetes 基于角色的访问控制(RBAC)角色(Role)和角色绑定(RoleBinding)。有关详细信息,请参阅 Kubernetes 网站上的 Using RBAC authorization。
- 使用 aws-auth ConfigMap 将 IAM 角色映射到 RBAC 角色和群组。
**注意:**当 IAM 用户或角色创建集群时,只有此 IAM 身份的 ARN 会被添加到 aws-auth ConfigMap 中,且具有 system:masters 权限。这意味着只有集群创建者才能向 aws-auth ConfigMap 添加更多用户或角色。
解决方法
**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI。
创建组织成员可以代入的 IAM 角色
要向组织成员授予对命名空间的访问权限,请创建 IAM 角色:
-
要验证用户是否有权代入 IAM 角色,请配置 AWS CLI。然后,从该用户的工作站运行以下命令:
$ aws sts assume-role --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --role-session-name abcde{ "Credentials": { "AccessKeyId": "yourAccessKeyId", "SecretAccessKey": "yourSecretAccessKey", "SessionToken": "yourSessionToken", "Expiration": "2020-01-30T01:57:17Z" }, "AssumedRoleUser": { "AssumedRoleId": "yourAssumedRoleId", "Arn": "arn:aws:iam::yourAccountID:role/yourIAMRoleName" } }
**注意:**请将 yourAccessKeyId、yourSecretAccessKey、yourSessionToken、yourAssumedRoleId、yourAccountID 和 yourIAMRoleName 替换为您的值。
-
更新 kubeconfig 文件,将 IAM 用户的 kubectl 配置为访问 Kubernetes API 时始终使用该角色:
$ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName
**注意:**请将 yourClusterName、yourAccountID 和 yourIAMRoleName 替换为您的值。
为集群创建 Kubernetes RBAC 角色和角色绑定
**重要事项:**必须从被配置为访问 Kubernetes 的工作站上完成以下步骤。用户必须是集群创建者或已通过 aws-auth ConfigMap 获得访问权限的 IAM 主体。IAM 角色尚无权访问集群。
将集群角色(ClusterRole)绑定到某个角色绑定。RBAC 角色和角色绑定是 Kubernetes 命名空间资源。但是,您无法将角色绑定到集群角色绑定(ClusterRoleBinding)。
-
运行以下命令,以列出所有内置群集角色,并将群集角色管理员绑定到命名空间的角色绑定:
$ kubectl get clusterrole
-
运行以下命令,以查看与集群角色管理员关联的权限:
$ kubectl describe clusterrole admin
-
创建一个名为 test 的命名空间,向属于 IAM 组的 IAM 用户授予访问权限:
**注意:**如果选择其他名称,请将 namespace 参数的值替换为使用现有命名空间,然后继续执行步骤 4。$ kubectl create namespace test
-
要创建 Kubernetes RBAC 角色,请将以下代码复制到新的 YAML 文件(例如 role.yaml)中:
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: k8s-test-role namespace: test rules: - apiGroups: - "" - "apps" - "batch" - "extensions" resources: - "configmaps" - "cronjobs" - "deployments" - "events" - "ingresses" - "jobs" - "pods" - "pods/attach" - "pods/exec" - "pods/log" - "pods/portforward" - "secrets" - "services" verbs: - "create" - "delete" - "describe" - "get" - "list" - "patch" - "update"
**注意:**Kubernetes RBAC 角色允许用户执行 verbs 部分中的所有操作。
-
运行以下命令创建 RBAC 角色:
$ kubectl apply -f role.yaml
-
创建 Kubernetes 角色绑定。将以下代码复制到新的 YAML 文件(例如 rolebinding.yaml)中:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: k8s-test-rolebinding namespace: test subjects: - kind: User name: k8s-test-user roleRef: kind: Role name: k8s-test-role apiGroup: rbac.authorization.k8s.io
**注意:**角色绑定是一种命名空间资源,它会将 roleRef 部分中的 RBAC 角色与 subjects 部分中的用户相绑定。您无需创建 k8s-test-user 用户,因为 Kubernetes 不存在 user 资源类型。
-
运行以下命令创建 RBAC 角色绑定:
$ kubectl apply -f rolebinding.yaml
使用 aws-auth ConfigMAP 将 IAM 角色映射到 RBAC 角色和群组
运行以下命令将 yourIAMRoleName IAM 角色与 k8s-test-user Kubernetes 用户关联:
$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user
**注意:**请将 yourClusterName、yourAccountID 和 yourIAMRoleName 替换为您的值。
测试对命名空间的访问
- 运行以下命令来测试对 test 命名空间的访问:
**注意:**上述命令会创建一个使用 k8s-test-role RBAC 角色的作业。$ kubectl create job hello -n test --image=busybox -- echo "Hello World"
- 运行以下命令检查 test 命名空间中的容器组(pod)和作业:
$ kubectl get job -n testNAME COMPLETIONS DURATION AGE hello 1/1 4s 15s $ kubectl get pods -n test NAME READY STATUS RESTARTS AGE hello-tpjmf 0/1 Completed 0 2m34s
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 5 个月前
- AWS 官方已更新 1 年前