站点图标 星露谷值班站长

K8S挂载本地目录权限拒绝问题解决 Permission denied

当我们在开发或自己测试环境需要把 Deployment 或 pod 挂载指定 Hosts 主机时可能会遇到权限拒绝的问题。解决这个问题其实只要把容器内外用户保持一致即可。

下面我以 Grafana 容器为例

首先在本地宿主机创建指定挂载目录

mkdir -p /data/k8smount/grafana

修改 deployment 文件里面的挂载参数

    spec:
      volumes:
        - name: grafana-storage
          hostPath:
            path: /data/k8smount/grafana
            type: DirectoryOrCreate

仅仅这样修改 pod 启动后会显示没有权限创建 plugins 插件目录

首先查看 grafana 容器内用户 id 信息

[root@ddn bin]# docker run -it --rm --entrypoint /bin/sh grafana/grafana:8.5.0
/usr/share/grafana $ id
uid=472(grafana) gid=0(root) groups=0(root)

可以看到容器内 uid 为 472,紧接着我们在宿主机上面创建 grafana 用户并指定 uid 为 472

useradd -u 472 grafana
chown -R grafana:grafana /data/k8smount/grafana/

仅仅这样做还是不够,调整 deployment 中 uid 信息为 472 再次启动 pod 就不会存在权限问题了

          imagePullPolicy: IfNotPresent
          securityContext:
            runAsUser: 472
退出移动版