问题描述
在k8s中部署gocd-server,因需要持久化数据,gocd-server相关数据目录挂载到了nfs volume,
但这导致gocd-server启动失败.错误提示如下:
1 | root@master01:~/k8s-test/gocd-server# kubectl logs -f test-gocd-server-deployment-5c849557d9-5prc2 -n test |
原因
经分析,是如下原因导致的:
(1) nfs export出来的目录加了”root_squash”,如在nfs client side 用root(uid=0)身份操作该nfs目录,在其内创建的任何文件目录它的owner:grouper会是nobody:nogroup
(2) nfs export出来的目录uid=0,gid=0,即在nfs server side该目录也是uid=0,gid=0,则在client挂载该目录后,只有client side的uid=0的用户拥有该目录读写权限. 但uid=0是root用户,按照(1)的原因,root会变为nobody. 哈哈,这是矛盾的。
(3) 现实情况是,客户给的nfs目录,权限是777, 这样虽然root被压缩成nobody了,但client side能在该目录创建文件和目录,
只不过他们owner:grouper会是nobody:nogroup,虽然能创建文件,但你想chown他们的owner:grouper是不能的
解决办法
分析gocd-server的dockerfile和entrypoint.sh,你会发现它容器是以root用户启动,但最后gocd-server却是以go用户启动的。
修改其docker-entrypoint.sh,让gocd-server以nobody用户启动即可.
修改后重新打包的镜像:docker pull itwye/gocd-server:fornfs
验证过程
严格模拟线上nfs
nfs配置(该配置模拟的真实环境)
1 | #注意:将要export的/opt/nfs目录权限是777 |
k8s编排文件
(1) deployment.yml
1 | apiVersion: apps/v1 |
(2) service.yml
1 | apiVersion: v1 |
(3) pv.yml
1 | apiVersion: v1 |
(4) pvc.yml
1 | kind: PersistentVolumeClaim |
参考
(1) nfs root_squash
1 | no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用! |