暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K8S环境中PV访问权限问题

零君聊软件 2020-02-19
4120

一般container不会用root用户来运行,而是通过一个非root用户来运行。而mount到POD内的volume的owner默认是root,所以默认情况下container是没有向PV中写数据的权限。本文简要介绍如何解决这类问题。


首先要将运行container的用户加入到sudoer中,这个需要在Dockerfile中增加一行:

    RUN adduser --shell /bin/bash --home $home_dir --disabled-password --gecos "" $user && \
    echo "$user ALL=(ALL) NOPASSWD:ALL" >> etc/sudoers


    其次,为POD定义一个init container,将mount到container中的volume同样也mount到init container中。接下来,就可以在init container中解决container没有权限写volume的问题。具体有两种解决办法。


    第一种办法就是将volume的根目录的权限设置成777。注意这里只需要将根目录的权限设置成777,chmod命令无需带"-R"选项。因为当container在volume中创建的任何新文件和文件夹的owner默认都是运行container的用户。具体来说,就是在init container的执行脚本中增加下面这行,

      sudo chmod 777 /my-data


      第二种办法就是将volume的根目录的owner设置成运行container的用户。假设运行contaienr的用户是user1,mount到init container中的volume的根目录名是my-data,那么就可以在init container的执行脚本中增加下面这行。这条命令同样无需带"-R"选项,否则如果volume中有大量文件时,这条命令可能会执行很长时间。一般来说,第二种办法更可取。

        sudo chown user1:user1 /my-data


        上面两种办法,都用到了sudo,这就是之前在Dockerfile中为什么要将$user加入sudoer的原因。


        另外值得一提的一点是,Kubernetes提供了一个注解(annotation) 来控制POD对PV的访问,

          pv.beta.kubernetes.io/gid


          可以为PV定义一个GID,如下例所示。只有使用相同GID的POD才允许向PV中写入数据。

            apiVersion: v1
            kind: PersistentVolume
            metadata:
            name: pv1
            annotations:
            pv.beta.kubernetes.io/gid: "1000"


            --END--

            文章转载自零君聊软件,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论