一般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: v1kind: PersistentVolumemetadata:name: pv1annotations:pv.beta.kubernetes.io/gid: "1000"
--END--




