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的密钥即可. 命令很简单,在 ...
随机推荐
- 79元国产ARM+DSP平台FFT实测分享
T113-i国产ARM+DSP架构介绍 创龙科技SOM-TLT113是一款基于国产全志T113-i双核ARM Cortex-A7 + HiFi4 DSP + 玄铁C906 RISC-V异构多核处理器 ...
- power bi创建切片器导航
现在很多报告使用的是按钮导航,今天分享另外一种方式:切片器导航. 第一步: 新建一个页面导航表,主页-输入数据-[填写列名,每页报表的表名] 如图: [页面导航表] 第二步: 添加一个切片器,将页面导 ...
- .Net Core 全局捕获异常-过滤器
1.代码版本 .Net Core 版本 2.2 2.自定义异常捕获类 新建一个类 CustomerExceptionFilter.cs 继承 Microsoft.AspNetCore.Mvc.Filt ...
- Swift开发基础06-闭包
Swift的闭包(Closures)是一种将功能块和上下文整合并演示在代码中的一种手段.闭包可以捕获并存储其上下文中的变量和常量.与普遍存在于其他语言的匿名函数(如Python的lambda.Java ...
- oeasy教您玩转python - 008 - # ascii码表
ASCII 码表 回忆上次内容 通过 help()可以从 python 命令行模式进入到帮助模式 通过 q 退出 ord(c)和 chr(i) 这是俩函数 这俩是一对,相反相成的 ord 通过字符 ...
- Python 按规则解析并替换字符串中的变量及函数
按规则解析并替换字符串中的变量及函数 需求 1.按照一定规则解析字符串中的函数.变量表达式,并替换这些表达式.这些函数表达式可能包含其它函数表达式,即支持函数嵌套 2.函数表达式格式:${ __函数名 ...
- 奇怪的回溯增加了 | leetcode131分割回文串
题目要求:给你一个字符串 s,请你将s分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案 示例 1: 输入:s = "aab" 输出:[["a" ...
- yum密钥报错
解决报错 [root@node3 mnt]# cat /etc/yum.repos.d/local.repo [BaseOS_repo] baseurl = file:///mnt/BaseOS en ...
- 神经网络之卷积篇:详解计算机视觉(Computer vision)
详解计算机视觉 计算机视觉是一个飞速发展的一个领域,这多亏了深度学习.深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们.还使得人脸识别技术变得更加效率和精准,即将能够体验到或 ...
- SEO自动外链蜘蛛池工具促进百度快速收录怎么样 跟大家详谈一下
此工具集成市面上所有自动外链网站的资源链接,经过合并.去重.筛选.验证 总结出最终的外链资源 ,软件实时更新 本软件将您繁杂的外链推广转为自动化进行,并且加入站群的支持,您只需要将你的站群域名粘贴到软 ...