k8s随笔 – K8S开启容器特权

折腾PHP容器的时候遇到了2个问题,都与容器的权限有关,下面分别记录一下。

问题1

在容器内strace/gdb一个进程报错:

 operation not permitted

这涉及到ptrace系统调用的权限问题,默认容器是没有权限去ptrace进程的。

这个问题需要通过给容器提权才能解决,在K8S中需要给container级别增加如下选项:

注意,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下的所有容器:

然后在容器里观察一下,已经生效:

K8S调整sysctl的官方文档:https://kubernetes.io/zh/docs/tasks/administer-cluster/sysctl-cluster/。

更多的POD级securityContext参考官方文档:https://kubernetes.io/docs/concepts/policy/pod-security-policy/

总结

注意container和POD都可以配置securityContext,但是支持的能力不同,具体还是参考文档决定应该配置在什么段落。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~