k8s pod挂载hostPath执行写时报错Permission denied
关于hostPath的权限说明
最近项目中经常遇到pod中container挂载主机hostPath报错无权限问题:
httpd@hostpath-volume:/test-volume$ touch 123
touch: cannot touch '123': Permission denied
于是又复习了一遍hostPath使用方法,发现没有什么新知识的涌入:
| 值 | 行为 |
|---|---|
| 空字符串(默认)用于向后兼容,这意味着在挂载hostPath卷之前不会进行任何检查 | |
| DirectoryOrCreate | 如果给定的路径没有任何东西存在,那将根据需要在此创建一个空目录,权限设置为0755,与kubelet拥有相同的用户与组 |
| Directory | 指定路径下必须存在此目录 |
| FileOrCreate | 如果给定的路径没有任何东西存在,那将根据需要在此创建一个空文件,权限设置为0644,与kubelet拥有相同的用户与组 |
| File | 给定的路径下必须存在文件 |
| Socket | 给定的路径下必须存在Unix套接字 |
| CharDevice | 给定的路径下必须存在字符设备 |
| BlockDevice | 给定的路径下必须存在块设备 |
使用这种卷类型时请注意:
- 由于每个节点上的文件不同,具有相同配置(例如从 podTemplate创建的)的pod在不同节点上的行为可能会有所不同
- 当Kubernetes按照计划添加资源感知调度时,将无法考虑hostPath使用的资源
- 在底层主机上创建的文件或目录只能由root写入。必须在特权容器中以root身份运行进程,或修改主机上文件权限以便写入 hostPath 卷
注意几个话术
- 当值为DirectoryOrCreate和FileOrCreate时,并且给定的路径或文件不存在时,kubelet会自动创建,并且会和kubelet拥有相同的用户与组,说白了,就是你用什么用户起的kubelet创建出来的就是此用户的属主数组。
- 必须在特权容器中以root身份运行进程,或修改主机上文件权限以便写入 hostPath 卷。如果你的容器不是以root用户运行的,这一点可要注意了。
问题的根源
查看发现,容器挂载hostPath写入时报错Permission denied时基本都是容器运行用户不是root的情况下,这就说明,启动容器的用户没有权限在宿主机中属主属组为root的目录或者文件中写入。
这就很清晰明了,只要赋予运行容器的用户写权限,这个问题就解决了。
可是,我们应该赋予哪个用户呢?在宿主机创建一个与启动容器相同的用户然后赋予权限吗?显然不行。
那么容器用户与宿主机用户的对应关系是什么呢?没错,是uid。
只要将宿主机的用户与启动容器用户的uid相对应上,并且给它写的权限,那这个问题就迎刃而解了。
做几个测试
先创建一个普通用户起的container
apiVersion: v1
kind: Pod
metadata:
name: hostpath-volume
namespace: default
spec:
containers:
- name: hostpath-container
image: nginx-test:v1
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /test-volume
name: dir-volume
volumes:
- name: dir-volume
hostPath:
path: /data/vfan/test/
type: DirectoryOrCreate
创建这个pod,测试写入
##
kubectl create -f hostpath-test.yaml ##
httpd@hostpath-volume:/$ cd /test-volume/
httpd@hostpath-volume:/test-volume$ touch 11 22 33
touch: cannot touch '11': Permission denied
touch: cannot touch '22': Permission denied
touch: cannot touch '33': Permission denied
查看宿主机相对应目录的权限
# ll -dh /data/vfan/test/
drwxr-xr-x 2 root root 4.0K Mar 21 14:53 /data/vfan/test/
查看容器内用户的uid,并查看宿主机的此uid用户是谁
## 容器内
httpd@hostpath-volume:/test-volume$ id
uid=1000(httpd) gid=1000(httpd) groups=1000(httpd) ## 容器外
# grep 1000 /etc/passwd
work:x:1000:1000::/home/work:/bin/bash
如果没有相同uid的用户,则创建一个对应用户即可:useradd -u 1000 xxx
赋予宿主机对应uid用户权限,再次测试
## 宿主机
chown work:work test/ ## 容器内
httpd@hostpath-volume:/test-volume$ touch 11 22 33
httpd@hostpath-volume:/test-volume$ ls
11 22 33
容器内外权限分别是什么?
## 容器内
httpd@hostpath-volume:/test-volume$ ls -ld /test-volume/
drwxr-xr-x 2 httpd httpd 4096 Mar 21 07:27 /test-volume/ ## 容器外
[root@gzbh-intel002.gom vfan]# ll -dh /data/vfan/test/
drwxr-xr-x 2 work work 4.0K Mar 21 15:27 /data/vfan/test/
k8s pod挂载hostPath执行写时报错Permission denied的更多相关文章
- git提交时报错 permission denied
git push 时报错:permission denied xxx 目前很多解决办法是生成公钥和秘钥,这种方法安全可靠,比较适用于一台电脑对应一个git账户,但是多个账户在同一台电脑上提交使用git ...
- Git push提交时报错Permission denied(publickey)...Please make sure you have the correct access rights and the repository exists.
一.git push origin master 时出错 错误信息为: Permission denied(publickey). fatal: Could not read from remote ...
- Linux执行命令报错:Permission denied
原因:权限被拒 结局办法 chmod -R 777 目录名 更改目录内文件的权限即可
- 执行automake时报错 error while making link: Operation not supported
执行automake时报错: [root@localhost project]# automake --add-missingconfigure.in: installing `./install-s ...
- [转帖]Linux /tmp目录下执行脚本失败提示Permission denied
Linux /tmp目录下执行脚本失败提示Permission denied https://www.cnblogs.com/linyfeng/p/11087655.html 国产化的环境上 就有一个 ...
- linux 下执行.sh文件提示permission denied
linux 下执行.sh文件提示permission denied 在脚本文件目录下运行命令,赋予权限: chmod 777 *.sh or chmod +x *.sh
- Visual Studio Code 使用 Git插件报错 - Permission denied (publickey)
在使用GitHub的时候,为了避免每次输入用户名密码,都会使用SSH方式代替Https. 按网上教程,大多数使用SSH-KeyGen生成公私钥对,而后上传公钥至Github,并切换Repositori ...
- java sftp 报错 Permission denied (没有权限;拒绝访问)
解决办法: 1.检查账号密码是否错误 2.检查freeSSHD是否是以管理员身份运行的 3.检查sftp路劲有没有配置错误,java通过sftp将图片文件传输到指定文件夹,如果这个文件夹在配置的当前目 ...
- 【jvm】linux 调用 jmap 报错Permission denied
linux 调用 jmap 报错Permission denied 解决方案: 分别对java安装目录,java的bin目录以及jmap命令设置权限 chmod jdk1..0_79 chmod b ...
- IDEA中使用git报错Permission denied (publickey)
最近在使用idea开发时,使用git拉取远程仓库的代码时,报错Permission denied (publickey),原因是因为ssh的密钥失效,必须得重新设置下ssh的密钥即可. 命令很简单,在 ...
随机推荐
- 使用Jest和React Test library 进行React单元测试
React单元测试,就是把React 组件渲染出来,看看渲染出来的内容符不符合我们的预期.比如组件加载的时候有loading, 那就渲染组件,看看渲染出的内容中有没有loading. 再比如,ajax ...
- java中的基准测试框架JMH
JHM是openJDK开发的一个benchmark框架.它是一个Maven依赖,所以创建一个Maven项目,引入下面两个依赖: <dependency> <groupId>or ...
- Class 与 Style 如何动态绑定?
Class 可以通过对象语法和数组语法进行动态绑定: 对象语法: <div v-bind:class="{ active: isActive, 'text-danger': hasEr ...
- 手把手帮助你搭建属于自己的个人博客,使用cervel部署,无需后端
1.项目简介 项目使用了vue+elementUI技术栈,通过读取本地md文件实现博客文章的展示,使用vercel实现自动化部署,纯前端项目,无需后端 第一步:下载源码 仓库地址: github:ht ...
- Django Template层之Template概述
Django Template层之Template概述 by:授客 QQ:1033553122 实践环境 Python版本:python-3.4.0.amd64 下载地址:https://www.py ...
- .NET周刊【7月第3期 2024-07-21】
国内文章 给博客园的寄语 https://www.cnblogs.com/jingc/p/18307859 作者是一名39岁的大龄C#开发程序员,对博客园的艰难处境深感触动,并购买会员支持.回顾他与博 ...
- XXL-JOB分片执行分布式任务
XXL-JOB相对于springtask来说优点之一就是分布式执行任务,可以在调度中心为执行器分发任务,实现分布式. 分片广播任务即当一个微服务形成集群的时候,任务会完整的下发给每一个执行器.而不像其 ...
- 免费正版 IntelliJ IDEA license 详细指南
一.前言 IntelliJ IDEA 一直是我非常喜欢的 IDE 自从用上之后就回不了头了,但是 Ultimate 版本的费用十分昂贵,其实 JetBrains 自己就提供了6种免费申请授权的方式:本 ...
- 使用Git bash切换Gitee、GitHub多个Git账号
使用Git bash切换Gitee.GitHub多个Git账号 Git是分布式代码管理工具,使用命令行的方式提交commit.revert回滚代码.这里介绍使用Git bash软件来切换Gitee ...
- 【Uni-App】API笔记 P1
1.调试打印: console.log() 向控制台打印 log 日志 console.debug() 向控制台打印 debug 日志 注:App 端自定义组件模式下,debug 方法等同于 log ...