Slide 1

Slide 1 text

VS Codeで実践! Kubernetes上のアプリのデバッグ実行 Atsushi Morimoto @74th

Slide 2

Slide 2 text

Atsushi Morimoto @74th ● Mobility Technologies所属 ● AIよりのサーバサイドエンジニア タクシーアプリ GO や タクシー乗務員支援サービスを開発 ● 著書 ● VS Code Conference Japan 2021 → 11/20開催! 技術書典3~11参加

Slide 3

Slide 3 text

とあるタクシー向けAIサービスの構成 (乗務員さんに、お客さんを拾いやすい道順を提供するサービス)

Slide 4

Slide 4 text

これをデバッグ実行したい とあるタクシー向けAIサービスの構成 (乗務員さんに、お客さんを拾いやすい道順を提供するサービス)

Slide 5

Slide 5 text

Kubernetes運用アプリのデバッグのペインポイント ● Dockerコンテナ環境でしか再現しない ○ MacOS/Windows上のローカルでは再現しない ● クラウド上のリソースに依存している ● Kubernetes上の他のサービスに依存している ○ 他のコンテナにアクセスできる環境でしか再現しない

Slide 6

Slide 6 text

Agenda 1. ローカルでデバッグ実行 2. Dockerコンテナでデバッグ実行 3. Kubernetesコンテナでデバッグ実行 4. 中間コンテナをデバッグ実行

Slide 7

Slide 7 text

最初に断っておくこと ● 本番環境のコンテナを対象にしません ● 開発、ステージング環境など、 構成を変更可能な環境を対象とします ● コンテナ内にデバッガなど必要なツールは持込可能とします

Slide 8

Slide 8 text

Agenda 1. ローカルでデバッグ実行 2. Dockerコンテナでデバッグ実行 3. Kubernetesコンテナでデバッグ実行 4. 中間コンテナをデバッグ実行

Slide 9

Slide 9 text

ローカルでの開発

Slide 10

Slide 10 text

ローカルでデバッグ実行

Slide 11

Slide 11 text

デバッガを経由して実行する $ python -m myapp.app $ python -m debugpy \ --listen 0.0.0.0:5678 \ --wait-for-client \ -m myapp.app $ ./cmd/app/main $ dlv exec --listen=0.0.0.0:2345 \ --headless --api-version 2 \ ./cmd/app/main

Slide 12

Slide 12 text

他に拡張機能やデバッガがやっていること ● ビルド時に 最適化オプションをオフにする $ go build -gcflags="all=-N -l" \ cmd/app/main.go

Slide 13

Slide 13 text

Agenda 1. ローカルでデバッグ実行 2. Dockerコンテナでデバッグ実行 3. Kubernetesコンテナでデバッグ実行 4. 中間コンテナをデバッグ実行

Slide 14

Slide 14 text

コンテナでの実行

Slide 15

Slide 15 text

コンテナ内のプロセスにアタッチ

Slide 16

Slide 16 text

Dockerコンテナに追加しておくこと ● デバッガもコンテナの中に追加する ○ イメージにデバッガを持ち込みたくない場合、 デバッガのプログラムを、ボリュームでマウントさせる ● 環境変数などによって、 デバッガ経由でプログラムを起動できるようにしておく ● 最適化オフのプログラムもビルドしておく

Slide 17

Slide 17 text

環境変数でデバッガを有効にする   import os if os.environ.get("ENABLE_DEBUGGER", "false") == "true": import debugpy debugpy.listen(("0.0.0.0", 5678)) import app app.start() #!/bin/sh if [ "${ENABLE_DEBUGGER}" == "true" ];then # 最適化オフのプログラム dlv exec --headless -l localhost:12345 ./app_debug else ./app fi

Slide 18

Slide 18 text

コンテナ実行後の、デバッグの設定 { "name": "Attach (Remote Debug)", "type": "python", "request": "attach", "pathMappings": [ { "localRoot": "${workspaceRoot}", "remoteRoot": "/app/" } ], "port": 5678, "host": "127.0.0.1" } コンテナ内のパスと ローカルのパスの対応 ~/project/main.py /app/main.py デバッグ実行設定 .vscode/launch.json

Slide 19

Slide 19 text

拡張機能Docker コンテナビルドや、デバッガ経由の実行をやってくれる 「デバッグ開始ボタン」で、 コンテナビルド→コンテナ内デバッグ実行を行う設定ができる デバッグ実行はNode.js、Python、.NET Coreしか対応しない

Slide 20

Slide 20 text

Agenda 1. ローカルでデバッグ実行 2. Dockerコンテナでデバッグ実行 3. Kubernetesコンテナでデバッグ実行 4. 中間コンテナをデバッグ実行

Slide 21

Slide 21 text

Kubernetes上のコンテナ(Pod)へのデバッグ

Slide 22

Slide 22 text

Kubernetes上のDeploymentへのデバッグ

Slide 23

Slide 23 text

Kubernetes上のDeploymentへのデバッグ ● Podの数を1(replicas: 1)にすること ● デバッガ経由の実行にコマンドを書き換えること ● kubectl port-forwardを使って、 デバッガに接続可能にすること

Slide 24

Slide 24 text

拡張機能Cloud Code ● デバッガの持ち込み、デバッガ経由での実行、 Podの数の変更、ポート転送、デバッガへのアタッチを 全部やってくれる ● ただし、Node.js、Python、Go、Java、.NET Coreのみ ● 一部、古いデバッガ(Pythonのptvsd)を使っているので注意

Slide 25

Slide 25 text

Agenda 1. ローカルでデバッグ実行 2. Dockerコンテナでデバッグ実行 3. Kubernetesコンテナでデバッグ実行 4. 中間コンテナをデバッグ実行

Slide 26

Slide 26 text

中間コンテナへのデバッグ

Slide 27

Slide 27 text

デモ 拡張機能 Kubernetes

Slide 28

Slide 28 text

拡張機能 Bridge to Kubernetes Kubernetes環境をローカルプロセスとしてデバッグ可能にする

Slide 29

Slide 29 text

通信をローカルプロセスに迂回させてデバッグ実行

Slide 30

Slide 30 text

まとめ ● 一般的なデバッグ実行 ● Dockerコンテナへのデバッグ実行 ○ デバッガ経由で実行に置き換える ○ デバッガにTCPポートでアクセスする ○ コンテナ内のファイルシステムとの対応を記述する ● Kubernetes上のコンテナへのデバッグ実行 ○ replicas: 1 を使う ○ デバッガに kubectl port-forward でアクセスする ○ Bridge to Kubernetesを使い、 ローカルプロセスに通信を迂回させる 設定などの具体例はこちらに https://74th.booth.pm/items/3338895