问题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/。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐