Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何管理 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 官方已更新 10 个月前
