【问题标题】:Allowing access to a PersistentVolumeClaim to non-root user允许非 root 用户访问 PersistentVolumeClaim
【发布时间】:2018-04-03 01:59:27
【问题描述】:

在 kubernetes 中,我可以使用 PersistentVolumeClaim 创建一些存储,以后可以将其挂载到某个容器中。

但是,如果容器中的用户不是 root,则该用户将无法访问该目录,因为它归 root 所有。

访问此类卷的正确方法是什么? (在创建和挂载该卷时,我没有找到任何用户/权限选项。)

【问题讨论】:

    标签: permissions kubernetes google-kubernetes-engine


    【解决方案1】:

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

    然后您可以通过添加.spec.securityContext.fsGroup 来告诉 Kubernetes 为您的 pod chown(某种程度)卷的挂载点:

    spec:
      ...
      securityContext:
        fsGroup: 2000
    

    fsGroup: integer:一个特殊的补充组,适用于一个 pod 中的所有容器。一些卷类型允许 Kubelet 将该卷的所有权更改为由 pod 拥有: 1. 拥有 GID 将是 FSGroup 2. setgid 位已设置(在卷中创建的新文件将归 FSGroup 所有) 3 . 权限位与 rw-rw 进行 OR'd---- 如果未设置,Kubelet 将不会修改任何卷的所有权和权限。

    【讨论】:

    • 我们尝试使用持久性卷声明,但没有成功。不过对于常规安装的卷来说效果很好。
    • 这很奇怪。我将它与 PVC 一起使用。
    • 我怀疑它是 GKE 的怪癖……你在 GCP 上运行吗?我们在 GKE 上解决这个问题的方法是使用一个 init 容器。建议在此线程中:github.com/kubernetes/kubernetes/issues/2630
    • 是的,告诉我。这真的毁了我的一天。似乎混淆来自于不同的卷类型具有不同级别的支持这一事实。不幸的是,HostPathVolumeSource 和 NFSVolumeSource 都包含以下通知:“...卷不支持所有权管理或 SELinux 重新标记。” kubernetes.io/docs/reference/generated/kubernetes-api/v1.10
    【解决方案2】:

    我在 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. 将 PVC 挂载到部署 yaml 文件中的 pod 中

    2. 在 GKE 工作节点中创建相同的用户并授予挂载路径所需的权限。

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

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 2016-05-04
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多