在 Kubernetes/Docker 中的程序上使用 Perf 的更好方法?

在 Kubernetes/Docker 中的程序上使用 Perf 的更好方法?

我在 CentOS 7 上运行 Kubernetes,但该版本似乎不perf支持命名空间。

如果在主机节点(使用 找到的主机节点)上的 PID 上运行 perf,kubectl describe pods --namespace我会收到有关未找到符号的错误。这似乎是因为它在主机节点的文件系统上查找相对于容器的文件路径。

如果我将 exe(包含符号的 Go exe)复制到主机节点上的预期路径(使用kubectl cp ...,或通过在 中找到 overlay2 下的文件/var/lib/docker),则可以perf top -p <pid>从主机主机节点运行,因为它可以找到与容器中的 exe 匹配的相同符号。

有没有更好/更干净的方法来perf针对在 CentOS 7 主机的容器中运行的进程运行?

参考:

答案1

从 Kubernetes 1.17 开始,可以在 Pod 中的容器之间共享进程命名空间。这似乎就是您要找的东西。

使用 v1.PodSpec 的 shareProcessNamespace 字段启用进程命名空间共享。例如:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  shareProcessNamespace: true
  containers:
  - name: nginx
    image: nginx
  - name: shell
    image: busybox
    securityContext:
      capabilities:
        add:
        - SYS_PTRACE
    stdin: true
    tty: true

我链接的 Kubernetes 文档提供了有关如何使用此 sidecar 方法的更多详细信息。

相关内容