如何管理 Amazon EKS 集群中 IAM 用户的跨命名空间权限?

上次更新时间:2020 年 2 月 6 日

我想管理我的 Amazon Elastic Kubernetes (Amazon EKS) 集群中用户的跨命名空间权限。

简短描述

要管理 Amazon EKS 集群中用户的跨命名空间权限,您必须执行以下操作:

  1. 创建一个可以由您组织中的成员代入的 AWS Identity and Access Management (IAM) 角色。
  2. 为您的集群创建一个 Kubernetes 基于角色的访问控制 (RBAC) 角色 (Role) 和一个角色绑定 (RoleBinding)
  3. 使用 aws-auth ConfigMap 将 IAM 角色映射到 RBAC 角色和组

注意:集群创建时,仅创建该集群的 IAM 用户或角色的 Amazon 资源名称 (ARN) 会被添加到 aws-auth ConfigMap 并具有 system:masters 权限。这意味着只有集群的创建者可以将其他用户或角色添加到 aws-auth ConfigMap。

解决方法

创建一个可以由您组织中的成员代入的 IAM 角色

要让您组织中的成员访问命名空间,您必须创建一个可由这些成员代入的 IAM 角色。

1.    创建一个向 IAM 用户赋予权限的角色

2.    要验证团队成员是否有权代入第 1 步中的 IAM 角色,请首先配置 AWS 命令行界面 (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"
    }
}

注意:请将 yourAccessKeyIdyourSecretAccessKeyyourSessionTokenyourAssumedRoleIdyourAccountIDyourIAMRoleName 替换为您的值。

3.    要配置 IAM 用户的 kubectl 角色以确保在访问 Kubernetes API 时始终使用该角色,请运行以下命令来更新 kubeconfig 文件:

$ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName

注意:请将 yourClusterNameyourAccountIDyourIAMRoleName 替换为您的值。

为您的集群创建一个 Kubernetes RBAC 角色和角色绑定

重要提示:必须从配置为访问 Kubernetes 的工作站完成以下步骤。用户必须是集群的创建者或已经通过 aws-auth ConfigMap 获得访问权限的 IAM 实体。在上一步骤中创建的 IAM 角色尚未获得访问集群的权限。

您可以将某个集群角色 (ClusterRole) 绑定到某个角色绑定,这是因为 RBAC 角色和角色绑定都是 Kubernetes 命名空间资源。但您无法将某个角色绑定到某个集群角色绑定 (ClusterRoleBinding)。

1.    要列出所有内置集群角色,请将集群角色管理员绑定到该命名空间的某个角色绑定,然后运行以下命令:

$ kubectl get clusterrole

2.    要查看与集群角色管理员关联的权限,请运行以下命令:

$ kubectl describe clusterrole admin

重要提示:如果您想使用现有的命名空间,可以跳过下面的第 3 步。如果您为命名空间 test 选择了不同的名称,则应替换下面第 4 步和第 6 步中 namespace 参数的值。

3.    要创建向属于 IAM 组成员的 IAM 用户授予访问权限的命名空间 test,请运行以下命令:

$ kubectl create namespace test

4.    要创建 Kubernetes RBAC 角色,请将下面的代码复制到新的 YAML 文件中(例如 role.yaml):

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
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"

注意:上述角色允许用户执行 verbs 部分的所有操作。

5.    要创建 RBAC 角色,请运行以下命令:

$ kubectl apply -f role.yaml

6.    要创建 Kubernetes 角色绑定,请将以下代码复制到新的 YAML 文件中:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
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

7.    要创建 RBAC 角色绑定,请运行以下命令:

$ kubectl apply -f rolebinding.yaml

8.    要将 IAM 角色 yourIAMRoleName 与 Kubernetes 用户 k8s-test-user 绑定,请运行以下命令:

$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user

注意:请将 yourClusterNameyourAccountIDyourIAMRoleName 替换为您的值。

测试对命名空间的访问

要测试对命名空间 test 的访问,请代入您所创建用户的 IAM 角色 yourIAMRoleName,然后运行以下命令:

$ kubectl get role -n test

上述命令列出了您之前创建的 RBAC 角色 k8s-test-role

属于该 IAM 组成员的 IAM 用户现在可以使用此命名空间并部署其应用程序。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?