Лучший способ использовать Perf для Программы в Kubernetes/Docker?

Я запускаю Kubernetes на CentOS 7, и не похоже, что версия perf осознает пространство имен.

Если запустить perf для PID на узле узла (узел узла найден с kubectl describe pods --namespace) Я получаю сообщение об ошибке, что символы не найдены. Кажется, это происходит потому, что он ищет путь к файлу относительно контейнера, но в файловой системе узла.

Если я скопирую exe (Go exe, который содержит символы) в ожидаемый путь на узле хоста (либо с kubectl cp ...или путем нахождения файла под overlay2 в /var/lib/docker) затем perf top -p <pid> работает с хост-узла хоста, так как он может найти те же символы, которые соответствуют exe в контейнере.

Есть ли лучший / более чистый способ запуска perf против процесса, запущенного в контейнере с хостом CentOS 7?

Рекомендации:

0 ответов

Начиная с Kubernetes 1.17 стало возможным разделять пространство имен процессов между контейнерами в поде. Похоже, это то, что вы ищете.

Совместное использование пространства имен процессов включается с помощью поля share ProcessNamespace v1.PodSpec. Например:

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, на которые я ссылаюсь, дают немного больше подробностей о том, как работать с этим подходом.

Другие вопросы по тегам