Kubernetes:如何修改容器服务的运行用户
背景
我们的产品是使用 k8s 进行编排运行的。
项目上线后,容器产生的日志都是 root 用户的权限,而现场运维人员只有普通用户权限。
这就导致运维人员无法对日志进行操作,比如增删,或者分割等。
解决方法
Google 了一圈,在官网看到一个参数:runAsUser
很像!
官方提供的配置方法如下:
1 | apiVersion: v1 |
测试
1、设置日志目录的父目录权限为普通用户,删除日志目录,重新启动服务
生成的日志文件权限仍然是 root
查看进程状态:
可以看出是 root 用户启动的
2、新增配置
1 | securityContext: |
日志目录权限仍保持 root,重启服务
启动失败
应该是没有读写日志目录(root)的权限
PS:查看用户 uid 和 gid
1 | id -u username |
3、删除日志目录,重启服务
生成的日志目录权限变为普通用户
服务启动成功
查看进程状态:
可以看到进程变成了普通用户启动的
问题
若每个机器上,同一个用户的 uid 不一致?Pod 漂移时如何处理呢?
我们继续测试
为了系统安全,我们不使用已有的用户进行测试
1、新建用户
机器 1 上:
1 | useradd liuhao -u 1024 |
机器 2 上:
1 | useradd liuhao -u 1023 |
2、停止服务,清理日志
3、修改配置,重启服务
这里我们在配置文件里将服务启动节点设定在节点 1 上。
1 | securityContext: |
4、查看
生成日志权限
服务状态
所属用户是 liuhao
5、修改启动节点
修改启动节点为节点 2
启动成功
日志权限直接使用 uid(1024):
服务进程所属用户也是 1024:
6、修改节点2用户的uid
1 | usermod -u 1024 liuhao |
7、重新启动
启动成功
生成的日志权限:
服务进程状态:
总结
1、可以使用 runAsUser
控制 k8s 容器的启动用户;
2、需要注意不同节点的用户 uid 要一致,否则日志权限会直接是 uid;
3、注意日志目录的权限,启动用户是否可读写;
参考: