#経緯
最近になってkubernetes(k8s)を触るようになって、これができるのかどうか試してみたので記録しておきます。
開発しているコンテナの中に最初からgdbをインストールしてしまえば、確実にいけるとは思ってましたが
それだとアプリ用のコンテナイメージサイズが大きくなってしまうので、サイドカーにしたいなと思ったのが事の経緯です。
バイナリはC++で書きました。
##本題の前に
k8sの環境の上でローカルで動作させるようにデバッガをアタッチしたり、breakpointを貼りたいという需要はもちろんすでにあって
そのためのプロダクトもあります
[squash] https://github.com/solo-io/squash
最初はこれをもちろん活用できないか考えましたが
Supported debuggers:
dlv
Java
gdb (2019) < === ※
Nodejs (2019)
Python - ptvsd (2019)
といった記載があったり、
Debuggers
We will be adding support to several additional debuggers in early 2019, including gdb, nodejs, and python.
という記載があるように、現状動作している訳ではないようなのでそれ以外で
コンテナのデバッグ方法を確認しておきたいという意図もありました。
##結果
できた
github repository => https://github.com/iwana2929/test-attaching-gdb-to-cpp-binary-on-k8s
確認方法
https://github.com/iwana2929/test-attaching-gdb-to-cpp-binary-on-k8s/blob/master/README_jp.md
##環境
MacBook Pro (15-inch, 2017)
OS:10.14.5(18F132) Mojave
docker desktop 2.1.0.1(kubernetes: v1.14.3)
Visual Studio Code: 1.37.1
##解説
動作確認自体はdocker desktop上のみしか確認していませんが、このままminikubeでもGKEでもAKSでも動作するはず
図に起こしてみるとこういう感じで動作します
deployment.yamlについてだけ解説します。
同一Pod内の別のコンテナで動作しているプロセスを見えるようにする
spec:
shareProcessNamespace: true #<= ココ※
https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
上記ページに記載があります。
これのおかげでdebugtoolのコンテナから動作しているappのプロセスが見えます。
つまり gdb -p PID ができます。
appのバイナリをdebugtoolにコピーする
spec:
~
volumes:
- name: data-volume #<= ココ※
emptyDir: #<= ココ※
~~~
- name: debugtool
image: debugtool:0.1
~~~~
volumeMounts:
- name: data-volume #<= ココ※
mountPath: /data #<= ココ※
動作しているバイナリとソースコードがdebugtool側にあったほうが良いので
-ソースはコンテナのビルド時にdebugtoolの方にだけ含めておく
-バイナリは同一のものが欲しいのでtestappのコンテナからemptyDirを経由してdebugtoolにも配置しておく
という作戦です。
今回はtestappコンテナの作成時に一緒にビルドしちゃってるのでこういう形にしましたが、
バイナリは外部で作ってdocker build時にコピーするだけ(大抵はそうなると思いますが)でもいいかと思います。
emptyDir
https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
strace(gdb)がdebugtool上で実行できるようにする
securityContext:
capabilities:
add:
- SYS_PTRACE #for gdb strace #<= ココ※
https://qiita.com/tkusumi/items/a62c209972bd0d4913fc
こちらを参考にさせて頂きました。
公式ドキュメントはこちら
https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container
##今後やりたい事
これがいけるならサイドカーにクラスタの外からアクセスできれば、リモートデバッグできるかも・・・
VSCodeとかVisualStudioとか、使い慣れたIDEで開発できるようにしたいですね。
やっぱGoを読み書きできるようになった方がいいのかな・・・