Amazon EKS中IAM角色与Kubernetes RBAC的关联及权限控制疑问
IAM角色与Kubernetes RBAC的关系及权限控制方法
核心关系说明
AWS IAM角色与Kubernetes RBAC是两个独立但协同的权限体系:
- IAM权限:负责控制AWS云服务(如ECR、EC2、S3等)的访问,比如你看到的
myAmazonEKSNodeRole的ECR权限,是用来让EKS节点拉取镜像的,和K8s集群内部资源权限无关。 - Kubernetes RBAC:负责控制K8s集群内资源(Pod、Deployment、ConfigMap等)的访问,通过
Role/ClusterRole定义权限规则,RoleBinding/ClusterRoleBinding将规则绑定到K8s身份(User/Group)。
你看到的myAmazonEKSNodeRole在IAM中没有RBAC相关内容是完全正常的——它的K8s权限是由EKS默认的集群绑定实现的:EKS会自动将节点身份(system:nodes组)绑定到system:node ClusterRole,这个Role包含了节点运行所需的K8s权限(比如上报节点状态、管理Pod),这些配置都在K8s集群内部,不会出现在IAM控制台中。
而aws-auth ConfigMap的作用是映射IAM身份到K8s身份:它把IAM角色/用户转换成K8s能识别的User或Group,之后K8s再通过RBAC给这些身份分配权限。
控制特定IAM角色在K8s集群中的权限
要实现这一点,需要完成两个关键步骤:
1. 在aws-auth ConfigMap中映射IAM角色到K8s身份
首先编辑kube-system命名空间下的aws-auth ConfigMap:
kubectl edit configmap/aws-auth -n kube-system
在mapRoles字段中添加目标IAM角色的映射规则,示例如下:
mapRoles: - rolearn: arn:aws:iam::123456789012:role/YourTargetIAMRole username: k8s-user/your-custom-username groups: - k8s:dev-team # 自定义K8s组,推荐用组来批量管理权限
说明:
groups字段是核心,后续RBAC会基于这个组分配权限,比单个用户更易维护。
2. 通过K8s RBAC分配权限
根据需求选择集群级或命名空间级权限配置:
集群级权限(全集群生效)
先创建一个定义权限规则的ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"]
然后创建ClusterRoleBinding,将上面的ClusterRole绑定到aws-auth中定义的K8s组:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-pod-reader-binding subjects: - kind: Group name: k8s:dev-team # 与aws-auth中的组名一致 apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-pod-reader apiGroup: rbac.authorization.k8s.io
命名空间级权限(仅指定命名空间生效)
先在目标命名空间创建Role:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: ns-deployment-manager rules: - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list", "create", "update", "delete"]
再创建RoleBinding绑定到目标组:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: default name: ns-deployment-manager-binding subjects: - kind: Group name: k8s:dev-team apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: ns-deployment-manager apiGroup: rbac.authorization.k8s.io
权限验证
配置完成后,可用以下命令测试权限是否生效:
kubectl auth can-i get pods --as=k8s-user/your-custom-username kubectl auth can-i create deployments -n default --as=k8s-user/your-custom-username
内容的提问来源于stack exchange,提问作者Jenia Be Nice Please
相关产品推荐
相关产品推荐

