1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

kubernetes gdbをサイドカーとして動作させて同一Pod内別コンテナのプロセスをデバッグしてみる

Posted at

#経緯
最近になって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でも動作するはず
図に起こしてみるとこういう感じで動作します
pic.png

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を読み書きできるようになった方がいいのかな・・・

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?