我正在尝试为需要持久卷的服务创建 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 权限创建任何其他资源(吊舱,服务等)。出于某些原因,只是 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
)的权限,而不是访问整个群集中所有名称空间的权限。
答案 0 :(得分:4)
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>
答案 1 :(得分:0)
新角色需要使用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
答案 2 :(得分:0)
我在这里看到一个潜在的问题。
PersistentVolumes为cluster scoped resources
。管理员应在没有任何名称空间的情况下配置它们。
PersistentVolumeClaims可以由特定命名空间中的用户创建,因为它们是namespaced resources
。
这就是为什么当您使用admin
凭据时有效,而在logdrop
中使用它会返回错误。
请让我知道这是否合理。