k8s中容器权限问题
问题1在容器内strace/gdb一个进程报错:operation not permitted这涉及到ptrace系统调用的权限问题,默认容器是没有权限去ptrace进程的。这个问题需要通过给容器提权才能解决,在K8S中需要给container级别增加如下选项:containers:- name: xxximage: xxx.com/php/zhongce_v2:a382ecfa39d16391b
问题1
在容器内strace/gdb一个进程报错:
operation not permitted
这涉及到ptrace系统调用的权限问题,默认容器是没有权限去ptrace进程的。
这个问题需要通过给容器提权才能解决,在K8S中需要给container级别增加如下选项:
containers:
- name: xxx
image: xxx.com/php/zhongce_v2:a382ecfa39d16391bc91f2036437906ef97c875e-1553052454
securityContext:
capabilities:
add: ["SYS_PTRACE"]
containers:
- name: xxx
image: xxx.com/php/zhongce_v2:a382ecfa39d16391bc91f2036437906ef97c875e-1553052454
securityContext:
capabilities:
add: ["SYS_PTRACE"]
注意,securityContext.capabilities选项只能在container级别生效,不能配置到POD级别。
capabilities还包括一些其他权限,另外也有平行于capabilities的其他选项可以配置,可以进一步学习:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/。
问题2
因为容器内的程序用到了大量的systemV信号量,需要通过sysctl命令调大阀值。
直接在容器里调整是被禁止的:
sysctl kernel.sem=”1034 32000 100 1000″
sysctl: setting key “kernel.sem”: Read-only file system
对于如下的sysctl配置:
kernel.shm*,
kernel.msg*,
kernel.sem,
fs.mqueue.,
net..
允许在POD级别指定securityContext生效,但是前提是在kubelet启动参数中进行授权,比如:
kubelet –allowed-unsafe-sysctls kernel.sem
然后就可以在POD级进行sysctl修改,生效到POD下的所有容器:
metadata:
labels:
app: xxxx
spec:
securityContext:
sysctls:
- name: kernel.sem
value: "1034 32000 100 1000"
metadata:
labels:
app: xxxx
spec:
securityContext:
sysctls:
- name: kernel.sem
value: "1034 32000 100 1000"
然后在容器里观察一下,已经生效:
[root@zhongce-85d55fd5b5-hrwbs ~]# sysctl -a|grep sem
kernel.sem = 1034 32000 100 1000
kernel.sem_next_id = -1
[root@zhongce-85d55fd5b5-hrwbs ~]# sysctl -a|grep sem
kernel.sem = 1034 32000 100 1000
kernel.sem_next_id = -1
K8S调整sysctl的官方文档:https://kubernetes.io/zh/docs/tasks/administer-cluster/sysctl-cluster/。
更多的POD级securityContext参考官方文档:https://kubernetes.io/docs/concepts/policy/pod-security-policy/。
更多推荐
所有评论(0)