【问题标题】:Kubernetes RBAC rules for PersistentVolumePersistentVolume 的 Kubernetes RBAC 规则
【发布时间】:2019-11-11 17:01:15
【问题描述】:

我正在尝试为需要持久卷的服务创建 RBAC 角色/规则,但它仍然因 forbidden 错误而失败。

这是我的角色配置:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: logdrop-user-full-access
  namespace: logdrop
rules:
- apiGroups: ["", "extensions", "apps", "autoscaling"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]

这是我删减的PersistentVolume清单:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: logdrop-pv
  namespace: logdrop
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  claimRef:
    namespace: logdrop
    name: logdrop-pvc
  hostPath:
    path: /efs/logdrop/logdrop-pv

当我尝试应用它时,我得到一个禁止的错误。

$ kubectl --kubeconfig ~/logdrop/kubeconfig-logdrop.yml apply -f pv-test.yml 
Error from server (Forbidden): error when retrieving current configuration of:
Resource: "/v1, Resource=persistentvolumes", GroupVersionKind: "/v1, Kind=PersistentVolume"
Name: "logdrop-pv", Namespace: ""
Object: &{map["apiVersion":"v1" "kind":"PersistentVolume" "metadata":map["annotations":map["kubectl.kubernetes.io/last-applied-configuration":""] "name":"logdrop-pv"] "spec":map["accessModes":["ReadWriteMany"] "capacity":map["storage":"10Gi"] "claimRef":map["name":"logdrop-pvc" "namespace":"logdrop"] "hostPath":map["path":"/efs/logdrop/logdrop-pv"] "persistentVolumeReclaimPolicy":"Retain"]]}
from server for: "pv-test.yml": persistentvolumes "logdrop-pv" is forbidden: User "system:serviceaccount:logdrop:logdrop-user" cannot get resource "persistentvolumes" in API group "" at the cluster scope

在最后一行,它特别写着resource "persistentvolumes" in API group "" - 这是我在规则中所允许的!

我可以使用来自同一 yaml 文件的 admin 凭据创建 PV,并且可以使用 logdrop 权限创建任何其他资源(pod、服务等)。只是 PersistentVolume 由于某种原因不起作用。知道为什么吗?

我使用的是 Kubernetes 1.15.0。

更新:

这是我要求的角色绑定:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: logdrop-user-view
  namespace: logdrop
subjects:
- kind: ServiceAccount
  name: logdrop-user
  namespace: logdrop
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: logdrop-user-full-access

这不是 ClusterRoleBinding,因为我的目的是让用户只访问一个命名空间 (logdrop),而不是整个集群的所有命名空间。

【问题讨论】:

    标签: kubernetes rbac


    【解决方案1】:

    PV、命名空间、节点和存储是集群范围对象。作为最佳实践,为了能够列出/观察这些对象,您需要创建 ClusterRole 并通过 ClusterRoleBinding 将它们绑定到 ServiceAccount。举个例子;

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: <name of your cluster role>
    rules:
    - apiGroups: [""]
      resources:
      - nodes
      - persistentvolumes
      - namespaces
      verbs: ["list", "watch"]
    - apiGroups: ["storage.k8s.io"]
      resources:
      - storageclasses
      verbs: ["list", "watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: <name of your cluster role binding>
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: <name of your cluster role which should be matched with the previous one>
    subjects:
      - kind: ServiceAccount
        name: <service account name>
    

    【讨论】:

      【解决方案2】:

      我在这里看到了一个潜在的问题。

      PersistentVolume 为 cluster scoped resources。它们应该由管理员提供,没有任何命名空间。

      但是,PersistentVolumeClaims 可以由特定命名空间中的用户创建,因为它们是 namespaced resources

      这就是为什么当您使用admin 凭据时它可以工作,但使用logdrop 它会返回错误。

      请让我知道这是否有意义。

      【讨论】:

        【解决方案3】:

        新角色需要授予一个用户或用户组,rolebinding,例如:

        apiVersion: rbac.authorization.k8s.io/v1 
        kind: RoleBinding 
        metadata: 
          name: logdrop-rolebinding
          namespace: logdrop 
        subjects: 
        - kind: User
          name: logdrop-user     
          apiGroup: rbac.authorization.k8s.io 
        roleRef: 
          kind: Role
          name: logdrop-user-full-access 
          apiGroup: rbac.authorization.k8s.io
        

        【讨论】:

        • 谢谢,但我当然有 RoleBinding。我可以使用该角色创建部署、Pod、服务,甚至是 PersistentVolumeClaims!只是不是 PersistentVolumes :(
        • 我明白了。您可以将您的角色绑定添加到问题中吗?我认为问题在于在这种情况下您需要使用集群角色和集群角色绑定,因为 PersistentVolume 是集群级别的资源。
        • 谢谢,我已将 RoleBinding 语句添加到问题中。它确实是RoleBinding,而不是ClusterRoleBinding,因为我只想让用户无限制地访问其命名空间(logdrop),而不是其他任何地方。
        猜你喜欢
        • 2019-12-30
        • 2019-11-24
        • 1970-01-01
        • 2021-09-30
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 2021-11-21
        相关资源
        最近更新 更多