使用动态名称管理单个 pod 的 RBAC 角色

RBAC role to manage single pod with dynamic name

我需要使用 RBAC 授予对一个部署和该部署的所有 pods 的访问权限。 我已经为 deploymet 配置了 RoleRoleBinding,并且工作正常:

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: <my-namespace>
  name: <deployment>-manager-role
rules:
  - apiGroups: ["", "extensions", "apps"]
    resources: ["deployments"]
    resourceNames: ["<deployment>"]
    verbs: ["get", "list", "watch", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: <deployment>-manager-binding
  namespace: <my-namespace>
subjects:
  - kind: User
    name: <username>
    apiGroup: ""
roleRef:
  kind: Role
  name: <deployment>-manager-role
  apiGroup: ""

使用此角色用户可以访问、更新和修补部署。此部署使用动态名称(如 <deployment>-5594cbfcf4-v4xx8)创建 pods。我试图允许此用户使用部署名称和使用部署名称 + 通配符 *:

访问这些 pods(获取、列出、观察、读取日志、执行、删除)
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  namespace: <my-namespace>
  name: <deployment>-pods-manager-role
rules:
  - apiGroups: ["", "extensions", "apps"]
    resources: ["pods"]
    resourceNames: ["<deployment>*"]
    verbs: ["get", "list", "watch", "update", "patch", "exec", "delete"]

我还更新了角色绑定。但是当我尝试获取 pod 时:

kubectl --context=<username>-ctx -n <namespace> get pods <deployment>-5594cbfcf4-v4xx8

我遇到错误:

Error from server (Forbidden): pods "<deployment>-5594cbfcf4-v4xx8" is forbidden: User "<username>" cannot get resource "pods" in API group "" in the namespace "<namespace>"

如果我将 <deployment>-5594cbfcf4-v4xx8 添加到 resourceNames 的列表中,用户可以访问此 pod。

是否可以根据部署名称授予对特定 pods 的访问权限?

在 Kubernetes 中,pods 被认为是短暂的 "cattle",它们来来去去。您不应该尝试管理每个 pod 的 RBAC。

在您的用例中,不幸的是,无法对一组 pods 匹配特定名称的角色授予角色,因为 resourceNames 字段 不支持prefixes/suffixes 这样的模式。不要混淆:单个星号字符 ('*') 具有特殊含义,表示 "all",但它不是模式。因此,resourceNames 中的 'my-app-* 将不起作用。此功能已开票,但未实施:
https://github.com/kubernetes/kubernetes/issues/56582

也有人请求能够通过标签管理 RBAC,但该功能也未实现:
https://github.com/kubernetes/kubernetes/issues/44703

因此,您可能需要更改模型以向用户授予角色以管理特定命名空间中的所有 pods。您的部署应该是该命名空间中唯一的 "source of pods"。这样,您就不需要指定任何资源名称。