Я использую Kubernetes на CentOS 7, и мне кажется, что версия perf
знает пространство имен.
Если запустить perf для PID на хост-узле (хост-узел найден с kubectl describe pods --namespace
) Я получаю сообщение о том, что символы не найдены. Это похоже на то, что он ищет путь к файлу относительно контейнера, но в файловой системе хост-узла.
Если я скопирую exe (Go exe, который включает символы) на ожидаемый путь на хост-узле (либо с kubectl cp ...
, или найдя файл под overlay2 в /var/lib/docker
) затем perf top -p <pid>
работает с хост-узла, так как он может найти те же символы, которые соответствуют исполняемому файлу в контейнере.
Есть ли способ лучше / чище? perf
против процесса, запущенного в контейнере с хостом CentOS 7?
Ссылки:
Начиная с Kubernetes 1.17 возможно Совместное использование пространства имен процессов между контейнерами в модуле. Похоже, это то, что вы ищете.
Совместное использование пространства имен процессов включается с помощью поля shareProcessNamespace 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, на которые я ссылаюсь, дают немного больше подробностей о том, как работать с этим подходом.