如何在EKS中复刻GKE的roles/container.clusterViewer只读访问功能?
要实现和GKE roles/container.clusterViewer 接近的权限效果,需要从IAM权限配置、EKS身份映射、Kubernetes RBAC三个层面配合完成,具体步骤如下:
1. 创建自定义IAM策略,覆盖EKS控制台访问与基础集群权限
先创建一个IAM策略,允许用户查看EKS控制台集群信息,同时具备后续关联K8s只读权限的基础:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DescribeCluster", "eks:ListClusters", "eks:ListNodegroups", "eks:DescribeNodegroup", "eks:ListAddons", "eks:DescribeAddon" ], "Resource": "arn:aws:eks:你的区域:你的账号ID:cluster/*" }, { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::你的账号ID:role/eks-cluster-viewer-role" } ] }
将此策略附加到AWS账号内所有需要只读权限的IAM用户,或者直接附加到账号级别的用户组。
2. 创建专用的IAM角色用于EKS身份映射
创建一个名为 eks-cluster-viewer-role 的IAM角色,信任策略设置为允许账号内所有IAM用户扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::你的账号ID:user/*" } } } ] }
3. 配置EKS的aws-auth ConfigMap映射IAM角色到K8s用户组
编辑EKS集群的 aws-auth ConfigMap,将刚才创建的IAM角色映射到Kubernetes的 eks-cluster-viewers 用户组:
apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: arn:aws:iam::你的账号ID:role/eks-cluster-viewer-role username: eks-cluster-viewer groups: - eks-cluster-viewers
执行 kubectl apply -f aws-auth-updated.yaml 生效。
4. 创建Kubernetes ClusterRole,复刻GKE ClusterViewer的权限限制
创建一个ClusterRole,允许只读访问大部分资源,但禁止查看Secrets、执行Pod exec/attach操作:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: eks-cluster-viewer rules: # 允许只读访问大部分核心资源 - apiGroups: [""] resources: ["pods", "pods/log", "services", "endpoints", "nodes", "persistentvolumes", "persistentvolumeclaims", "configmaps", "events"] verbs: ["get", "list", "watch"] # 允许只读访问工作负载资源 - apiGroups: ["apps"] resources: ["deployments", "replicasets", "statefulsets", "daemonsets"] verbs: ["get", "list", "watch"] # 允许只读访问网络资源 - apiGroups: ["networking.k8s.io"] resources: ["ingresses", "services", "networkpolicies"] verbs: ["get", "list", "watch"] # 明确禁止访问Secrets - apiGroups: [""] resources: ["secrets"] verbs: ["deny"] # 禁止Pod的exec/attach/port-forward操作 - apiGroups: [""] resources: ["pods/exec", "pods/attach", "pods/portforward"] verbs: ["deny"]
执行 kubectl apply -f cluster-role.yaml 创建该角色。
5. 绑定ClusterRole到目标用户组
创建ClusterRoleBinding,将 eks-cluster-viewers 用户组与刚才的ClusterRole绑定:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks-cluster-viewer-binding subjects: - kind: Group name: eks-cluster-viewers apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: eks-cluster-viewer apiGroup: rbac.authorization.k8s.io
执行 kubectl apply -f cluster-role-binding.yaml 完成绑定。
验证效果
用户执行 aws eks update-kubeconfig --region 你的区域 --name 集群名称 更新kubeconfig后,即可通过kubectl执行只读操作,无法查看Secrets或进入Pod,同时能正常访问EKS控制台查看集群信息。
内容的提问来源于stack exchange,提问作者neoakris

