如何通过K8s RBAC实现用户仅查看命名空间内指定Pod?
实现仅允许查看命名空间内指定Pod的RBAC方案
方案1:通过Pod名称精准控制(兼容所有支持RBAC的K8s版本)
可以在Role中通过resourceNames字段指定允许访问的Pod名称。注意:这种方式仅支持get、watch等针对单个资源的操作,list操作无法通过名称限制(因为list是获取资源集合),因此用户执行kubectl get pods会返回权限不足或空列表,但能成功获取指定Pod的详情。
示例Role定义:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: your-namespace name: pod-reader-specific rules: - apiGroups: [""] resources: ["pods", "pods/log", "pods/exec"] # 根据需求添加需要访问的子资源 verbs: ["get", "watch"] resourceNames: ["pod-a", "pod-b"] # 替换为允许查看的Pod名称
绑定该Role到目标用户/ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: your-namespace name: bind-pod-reader-specific subjects: - kind: User name: your-target-user # 替换为目标用户名 apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader-specific apiGroup: rbac.authorization.k8s.io
方案2:通过标签选择器过滤(K8s 1.27+版本可用)
如果你的集群版本在1.27或以上,可使用resourceSelectors字段基于Pod标签限制可见范围。这种方式支持list操作,用户执行kubectl get pods只会返回匹配标签的Pod,更适合批量管理场景。
示例Role定义:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: your-namespace name: pod-reader-by-label rules: - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list", "watch"] resourceSelectors: - matchLabels: app: allowed-app # 替换为目标Pod的标签键值对
同样需要创建对应的RoleBinding完成用户绑定。
替代方案:OPA Gatekeeper(复杂场景)
如果上述RBAC方案无法满足复杂的访问控制需求(比如多条件组合过滤),可以使用OPA Gatekeeper实现更细粒度的规则。它允许编写自定义策略,基于Pod的命名空间、注解、状态等多种属性过滤用户可访问的资源。
内容的提问来源于stack exchange,提问作者Uvindu Sahan
相关产品推荐
相关产品推荐

