Kubernetes 版本(使用kubectl version
):客户端版本:version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.1", GitCommit:"82450d03cb057bab0950214ef122b67c83fb11df", GitTreeState:"clean" , BuildDate:"2016-12-14T00:57:05Z", GoVersion:"go1.7.4", 编译器:"gc", Platform:"darwin/amd64"}
服务器版本:version.Info{Major:"1", Minor:"5+", GitVersion:"v1.5.1-3+10e41f22e4421c", GitCommit:"10e41f22e4421c9a14e9e6782c6375c199a07a6Date2:"GitTreeState2:" -15T10:06:44Z", GoVersion:"go1.7.4", 编译器:"gc", 平台:"linux/amd64"}
环境:
uname -a
):3.10.0-327.36.3.el7.x86_64发生了什么:我们启用了 RBAC 身份验证。 我们有两种不同的角色绑定:
apiVersion: rbac.authorization.k8s.io/v1alpha1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-custom
subjects:
- kind: ServiceAccount
name: default
namespace: kube-system
- kind: User
name: kubelet
namespace: kube-system
- kind: User
name: clusteradmin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
和
apiVersion: rbac.authorization.k8s.io/v1alpha1
kind: RoleBinding
metadata:
name: default-admin
namespace: default
subjects:
- kind: ServiceAccount
name: default
- kind: User
name: defaultadmin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
所以我们有两个不同的用户:clusteradmin,可以访问 kube 集群中的所有内容,defaultadmin,应该可以访问 default 命名空间中的所有资源。 使用 clusteradmin 执行 PV 命令工作正常,在默认命名空间中使用 defaultadmin 时会出现错误:
kubectl 获取 pv
来自服务器的错误(禁止):服务器不允许访问请求的资源(获取持久卷)
来自服务器的错误(禁止):创建“db-pv.yaml”时出错:服务器不允许访问请求的资源(postpersistentvolumes)
您期望发生的情况:defaultadmin 应该可以访问已定义(在我的情况下为默认)命名空间中的 PV 资源,因为 cluster-admin clusterrole 说明如下:
- apiGroups:
- '*'
attributeRestrictions: null
resources:
- '*'
verbs:
- '*'
- attributeRestrictions: null
nonResourceURLs:
- '*'
verbs:
- '*'
这里重要的是资源*,但感觉PV不是通配符的一部分。
如何重现它(尽可能少且精确):
我有一个类似的问题,我有几个命名空间,包括dev
和default
。 作为“开发用户”,我可以在dev
命名空间中创建一堆资源,包括一个 PVC,但是在dev
命名空间中以“开发用户”身份创建 PV 会产生相同的结果错误如上:
Error from server (Forbidden): error when creating "db-pv.yaml": the server does not allow access to the requested resource (post persistentvolumes)
我可以在default
命名空间中以管理员用户身份创建 PV,然后一切正常。
PV 未连接到命名空间
PV 是集群范围的对象。 它们不存在于命名空间中。 要获得通过 RBAC 使用 PV API 的权限,您需要在集群范围内使用 ClusterRoleBinding 绑定一个ClusterRole 。
最有用的评论
PV 是集群范围的对象。 它们不存在于命名空间中。 要获得通过 RBAC 使用 PV API 的权限,您需要在集群范围内使用 ClusterRoleBinding 绑定一个ClusterRole 。