首页 > 解决方案 > Kubernetes 更改挂载卷的权限

问题描述

我在 Openstack 上管理 Kubernetes 的部署。

我的用户 pod 挂载了一个PersistentVolume使用 Openstack Cinder 作为主文件夹动态创建的。

奇怪的是,如果我创建一个文件权限为 600 的(空)文件:

bash-4.2$ ls -l
total 16
-rw------- 1 jovyan users     0 Jul 16 17:55 id_rsa

然后我杀死容器并重新启动它,卷再次安装,但权限现在具有rw组权限:

bash-4.2$ ls -l
total 16
-rw-rw---- 1 jovyan users     0 Jul 16 17:55 id_rsa

关于如何进一步调试的任何建议?

有关 Kubernetes 配置的详细信息

检查 Openstack

我首先认为这是一个 Openstack 问题,但如果我从 Openstack 实例中分离卷,然后使用 Openstack 命令再次附加它,并使用终端将其挂载到节点上,权限就可以了。所以我认为这是 Kubernetes 以某种方式弄乱了权限。

Yaml 资源

我将 pod、PV 和 PVC 的 YAML 文件粘贴到 gist 上,请参阅https://gist.github.com/zonca/21b81f735d0cc9a06cb85ae0fa0285e5

我还添加了kubectl describe这些资源的输出。它是Jupyterhub0.9.0 Helm 包的部署。

标签: kubernetesopenstackpersistent-volumes

解决方案


发生这种情况是因为您已将 pod 配置为fsGroup. 它在以下指定securityContext

---
securityContext:
  fsGroup: 100
---

每当fsGroup指定字段时,容器的所有进程也是补充组 ID 的一部分。卷的所有者和在该卷中创建的任何文件将是组 ID。

Kubernetes API 文档是这样解释的:

fsGroup是一个特殊的补充组,适用于一个 pod 中的所有容器。某些卷类型允许 Kubelet 将该卷的所有权更改为由 pod 拥有:

  1. 拥有 GID 将是 FSGroup
  2. setgid 位已设置(在卷中创建的新文件将归 FSGroup 所有)
  3. 权限位与 rw-rw 进行或运算---- 如果未设置,Kubelet 将不会修改任何卷的所有权和权限

推荐阅读