背景
在ARM服务器上部署Kubernetes的Node节点上通过Kubelet启动的Pod时创建容器的/etc/hosts文件时,报没有权限。遇到这个问题,不妨看下是不是容器内文件的umask出现了问题。
解决方案
kubelet是采用容器的方式启动的,进入容器中可以看到容器的umask为 0027(默认容器的umask是0022) 导致kubelet在创建容器的host文件的时候,出现了权限的错误。又因为容器的host文件是kubelet生成并通过挂载的方式挂载到容器中的:所以权限和kubelet是有关系的,修改kubelet容器中的umask即可解决这个问题。
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/7e7fbe1f-1400-44d3-9979-0d2cc8432d50/etc-hosts",
"Destination": "/etc/hosts",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
所以通过修改Docker的启动命令即可恢复默认的umask的值,修改启动命令如下,增加—exec-opt native.umask=normal启动参数。
ExecStart=/usr/bin/dockerd --exec-opt native.umask=normal --insecure-registry=harbor.service.moebius.com --log-opt max-size=50M -H unix:///run/docker.sock -H tcp://0.0.0.0:900 --storage-driver=overlay2 --data-root=/data/docker_customized --live-restore ExecReload=/bin/kill -s HUP $MAINPID
正常容器主进程和exec进程的默认umask为0022,为了满足安全性需求,避免容器受到攻击,修改runc了实现,将默认umask修改为0027。修改后导致others群组将无法访问新建文件或目录。
arm环境下docker启动容器时的默认umask值为0027,可以在dockerd启动时,使用—exec-opt native.umask=normal参数将容器启动时的umask修改为0022