Kubernetes:如何修改容器服务的运行用户?

Kubernetes:如何修改容器服务的运行用户

背景

我们的产品是使用 k8s 进行编排运行的。

项目上线后,容器产生的日志都是 root 用户的权限,而现场运维人员只有普通用户权限。

这就导致运维人员无法对日志进行操作,比如增删,或者分割等。

解决方法

Google 了一圈,在官网看到一个参数:runAsUser

很像!

官方提供的配置方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false

测试

1、设置日志目录的父目录权限为普通用户,删除日志目录,重新启动服务

生成的日志文件权限仍然是 root

▲ 日志权限

查看进程状态:

▲ 进程状态

可以看出是 root 用户启动的

2、新增配置

1
2
3
securityContext:
runAsUser: 1002
runAsGroup: 1000

日志目录权限仍保持 root,重启服务

启动失败

应该是没有读写日志目录(root)的权限

PS:查看用户 uid 和 gid

1
2
id -u username
id -g username

3、删除日志目录,重启服务

生成的日志目录权限变为普通用户

▲ 日志权限

服务启动成功

查看进程状态:

▲ 进程状态

可以看到进程变成了普通用户启动的

问题

若每个机器上,同一个用户的 uid 不一致?Pod 漂移时如何处理呢?

我们继续测试

为了系统安全,我们不使用已有的用户进行测试

1、新建用户

机器 1 上:

1
useradd liuhao -u 1024

机器 2 上:

1
useradd liuhao -u 1023

2、停止服务,清理日志

3、修改配置,重启服务

这里我们在配置文件里将服务启动节点设定在节点 1 上。

1
2
3
securityContext:
runAsUser: 1024
runAsGroup: 1024

4、查看

生成日志权限

▲ 日志权限

服务状态

▲ 服务状态

所属用户是 liuhao

5、修改启动节点

修改启动节点为节点 2

启动成功

日志权限直接使用 uid(1024):

日志权限

服务进程所属用户也是 1024:

▲ 服务状态

6、修改节点2用户的uid

1
usermod -u 1024 liuhao

7、重新启动

启动成功

生成的日志权限:

▲ 日志权限

服务进程状态:

▲ 进程状态

总结

1、可以使用 runAsUser 控制 k8s 容器的启动用户;

2、需要注意不同节点的用户 uid 要一致,否则日志权限会直接是 uid;

3、注意日志目录的权限,启动用户是否可读写;

参考:

hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/kubernetes-runasuser.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%