允许非ROOT用户访问PersistentVolumeClaim

22
在 Kubernetes 中我可以使用 PersistentVolumeClaim 创建一些存储,稍后可以将其挂载到某个容器中。
但是如果容器中的用户不是 root 用户,那么该用户将无法访问该目录,因为它的所有者是 root。
如何正确地访问这样的卷?(在创建和挂载该卷时未找到任何用户/权限选项。)
2个回答

12

首先,找出您的进程正在运行的UID号码。

然后,通过添加 .spec.securityContext.fsGroup,您可以告诉Kubernetes为您的pod的挂载点chown(有点像)卷:

spec:
  ...
  securityContext:
    fsGroup: 2000

fsGroup:整数类型:适用于 Pod 中所有容器的特殊附加组。某些卷类型允许 Kubelet 更改该卷的所有权,以由 Pod 拥有:1. 所有者 GID 将是 FSGroup;2. 设置 setgid 位(在卷中创建的新文件将归 FSGroup 所有);3. 权限位与 rw-rw---- OR 运算。如果未设置,则 Kubelet 不会修改任何卷的所有权和权限。


我们尝试使用持久卷索赔来解决这个问题,但是没有成功。不过对于常规挂载的卷来说效果还不错。 - Mike
1
很奇怪,我正在使用PVCs。 - Janos Lenart
我怀疑这是GKE的小问题...你正在GCP上运行吗?我们在GKE上解决此问题的方法是使用init容器。建议在此线程中:https://github.com/kubernetes/kubernetes/issues/2630 - Mike
是啊,跟我说说吧。这真的毁了我的一天。混淆似乎出现在不同卷类型具有不同级别的支持上。不幸的是,HostPathVolumeSource和NFSVolumeSource都包含以下通知: “...卷不支持所有权管理或SELinux重新标记。” https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/ - Vance Shipley

0

我在GKE环境中也遇到了同样的问题。 securityContext 无法解决权限问题。这是我所做的。

  1. 在Dockerfile中创建一个非root用户,并授予目录所需的权限。
RUN adduser -s /bin/sh -u 1100 --disabled-password foo
RUN apk add sudo
RUN mkdir /app
RUN mkdir /app/logs 
RUN chown -R foofoo /app /app/logs
RUN chmod -R 777 /app/logs/
USER foo
WORKDIR /app
  1. 在部署的yaml文件中将PVC挂载到Pod中。

  2. 在GKE工作节点上创建相同的用户,并授予必要的权限以挂载该路径。

/var/lib/docker/volumes/47aa3xxxxxxxxxxxxxxxxxxxx19dc2c864ed99676b/_data


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接