5 votes

Meilleure façon d'utiliser Perf sur un programme dans Kubernetes/Docker ?

J'exécute Kubernetes sur CentOS 7, et il ne semble pas que la version de perf est conscient des espaces de noms.

Si l'on exécute perf sur le PID du nœud hôte (nœud hôte trouvé avec kubectl describe pods --namespace ) Je reçois un message d'erreur indiquant que les symboles ne sont pas trouvés. Cela semble être dû au fait qu'il recherche le chemin du fichier relatif au conteneur mais sur le système de fichiers du nœud hôte.

Si je copie l'exe (un Go exe qui inclut les symboles) vers le chemin attendu sur le nœud hôte (soit avec la commande kubectl cp ... ou en trouvant le fichier sous overlay2 dans le dossier /var/lib/docker ) alors perf top -p <pid> fonctionne à partir du nœud hôte puisqu'il peut trouver les mêmes symboles qui correspondent à l'exe dans le conteneur.

Y a-t-il un moyen plus efficace et plus propre de faire fonctionner perf contre un processus s'exécutant dans un conteneur avec un hôte CentOS 7 ?

Références :

1voto

cvoigt Points 111

Depuis Kubernetes 1.17, il est possible de Partager l'espace de nom du processus entre les conteneurs d'un pod . Il semble que ce soit ce que vous recherchez.

Le partage de l'espace de nom du processus est activé en utilisant le champ shareProcessNamespace de v1.PodSpec. Par exemple :

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

Les documents de Kubernetes dont j'ai fait le lien donnent un peu plus de détails sur la façon de travailler avec cette approche de sidecar.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X