【问题标题】:Serviceaccount is unable to create persistentvolumeclaim(PVC)服务帐户无法创建持久卷声明(PVC)
【发布时间】:2020-11-10 22:43:21
【问题描述】:

我们正在测试 Shiny-proxy Kubernetes 容器,每个应用程序都旋转它自己的容器,在这部分之前它工作正常。我们进行了一些更改以创建 PVC/PV 以保留每个容器的用户特定数据,注意到尽管我为该帐​​户配置了以下角色,但 serviceaccount 无法创建 PVC。一般来说,是否有任何其他步骤可以确保 SA 能够访问/创建 PVC?

从普通容器测试时可以访问 PV/PVC,但似乎是用于创建新容器的服务帐户角色/权限的问题。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: sp-ns
  name: sp-sa
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log", "persistentvolumeclaims"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

我已确认 serviceaccount 角色设置正确,如下命令返回“是”。

kubectl auth can-i create pvc --as=system:serviceaccount:sp-ns:sp-sa -n sp-ns

从应用程序创建容器时出错:

at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    Caused by: io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: POST at: http://localhost:8001/api/v1/namespaces/sp-ns/pods. Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. pods "sp-pod-92e1efc0-0859-4a87-8b9b-04d6adaa11f5" is forbidden: user "system:serviceaccount:sp-ns:sp-sa" is not an admin and does not have permissions to use host bind mounts for resource .
    at io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestFailure(OperationSupport.java:503)
    at io.fabric8.kubernetes.client.dsl.base.OperationSupport.assertResponseCode(OperationSupport.java:440)
    at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:406)
    at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleResponse(OperationSupport.java:365)
    at io.fabric8.kubernetes.client.dsl.base.OperationSupport.handleCreate(OperationSupport.java:234)
    at io.fabric8.kubernetes.client.dsl.base.BaseOperation.handleCreate(BaseOperation.java:735)
    at io.fabric8.kubernetes.client.dsl.base.BaseOperation.create(BaseOperation.java:325)
    at io.fabric8.kubernetes.client.dsl.base.BaseOperation.create(BaseOperation.java:321)
    at io.fabric8.kubernetes.client.dsl.base.BaseOperation.lambda$createNew$0(BaseOperation.java:336)
    at io.fabric8.kubernetes.api.model.DoneablePod.done(DoneablePod.java:26)
    at eu.openanalytics.containerproxy.backend.kubernetes.KubernetesBackend.startContainer(KubernetesBackend.java:223)
    at eu.openanalytics.containerproxy.backend.AbstractContainerBackend.doStartProxy(AbstractContainerBackend.java:129)
    at eu.openanalytics.containerproxy.backend.AbstractContainerBackend.startProxy(AbstractContainerBackend.java:110)
    ... 95 more

【问题讨论】:

标签: kubernetes


【解决方案1】:
  1. 容器未以特权身份运行。在 pod 规范中使用 privileged: true

  2. 服务帐号没有cluster-admin 角色。使用下方提供权限。

    kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=sp-ns:sp-sa

【讨论】:

  • 如果从代码/YAML 配置中删除与 PVC 相关的行,容器会正常启动。我们是否需要集群管理员角色才能访问 PVC?
  • 是的,您需要管理员角色才能访问 PVC。
  • 我找不到任何文档说明为什么我们需要集群管理员角色来访问 PVC,因为它是命名空间范围的资源,而不是集群范围的资源。我将为相同的资源创建一个集群角色,看看是否会有所不同。
  • 集群管理员角色可以完全控制角色绑定命名空间中的每个资源,包括命名空间本身。详情请查看this document
  • 添加集群管理员角色绑定解决了创建pvc的问题。
猜你喜欢
  • 1970-01-01
  • 2021-05-22
  • 2017-02-27
  • 2021-11-22
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
相关资源
最近更新 更多