業務で役に立ったのでメモとして
pythonのdocker imageをkubernetes (EKS) の上で動かしていたが、このdocker image内でどのようにメモリを使っているか調べる必要があった。そこでmemrayを使うことにしたが、色々つまづいたので備忘録として残す。
結論
以下に書いてある。ただし、imageはroot userで動かす必要がある(と思う)。
つまり、runAsUser: 0
なりをセットする必要がある(下参照)。
手順について
1. Pythonのpackageとしてmemrayをいれる
poetryならば、以下のコマンドで入る。
poetry add memray
Docker imageに入れる際は、requirements.txtを生成した上で、pipコマンドをたたくなりすればよい。
2. gdbとlibcap-2binをinstallする
dockerのpython imageはdebianなので、Dockerfileに以下を追記する(/etc/os-releaseをみるとほぼdebianだと思うので)。
RUN apt-get install -y gdb libcap2-bin
3. kubernetesのdeploymentのmanifestに追記をする。
おそらくdeploymentを使っていると思うので(そうでない場合でも同様にすればよいと思われる)、Deployment.spec.template.spec.containers
の部分に以下を追記する。
securityContext:
capabilities:
add:
- SYS_PTRACE
4. setcapのコマンドを走らせる
次のコマンドを走らせる
setcap cap_sys_ptrace+pe /usr/bin/gdb
Dockerfileに以下を追記でもよいと思われる(自分はこれでOKだった)
CMD ["setcap", "cap_sys_ptrace+pe", "/usr/bin/gdb"]
5. memrayを走らせる
以下のコマンドを走らせる。ただしPIDは1の場合である。必要ならば、あらかじめpsコマンドを入れるなどすればよい。
kubectl exec -it <your pod> -- memray attach 1
最後に
Capabilitiesなどわかっていないkubernetesの概念などがあったが、とりあえず上で動いた。ただ過剰な権限を付与していたりするかもしれない。