web-dev-qa-db-ja.com

Kubernetes / DockerのプログラムでPerfを使用するより良い方法は?

CentOS 7でKubernetesを実行していますが、perfのバージョンが名前空間に対応していないようです。

ホストノード(ホストノードがkubectl describe pods --namespaceで見つかりました)のPIDでperfを実行すると、シンボルが見つからないというエラーが発生します。これは、コンテナに対するホストのファイルシステム上でのファイルの相対パスを探すためと思われます。

Exe(シンボルを含むGo exe)をホストノードの予想されるパスにコピーすると(kubectl cp ...を使用するか、/var/lib/dockerのoverlay2の下にあるファイルを見つけることにより)、perf top -p <pid>は、コンテナー内のexeに一致する同じシンボルを見つけることができるため、ホストホストノードから機能します。

CentOS 7ホストを備えたコンテナで実行されているプロセスに対してperfを実行するためのより良い/よりクリーンな方法はありますか?

参照:

4
Kyle Brandt

Kubernetes 1.17以降、ポッド内のコンテナー間でプロセス名前空間を 共有することが可能です 。これがあなたが探しているもののようです。

プロセス名前空間の共有は、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

リンクしたKubernetesDocsには、このサイドカーアプローチの操作方法についてもう少し詳しく説明しています。

1
cvoigt