本日も乙

ただの自己満足な備忘録。

IntelliJ IDEA で Spinnaker をリモートデバッグする

業務で Spinnaker を活用したデプロイフローを構築しています。Spinnaker は便利なことが多い反面、バグに遭遇したりクラウドの新機能に追いついていないなどの問題もしばしば遭遇します。今直面しているのが、GCP の Internal HTTP(S) Load Balancing に Spinnaker が対応していない問題です。(グローバルな)HTTP(S) Load Balancing 、Internal TCP Load Balancing は対応しているのですが、ベータリリースのせいなのか他に使っている人がいないのか、Issue にも上がっていません。

GCP のネットワーク(VPC)内部における HTTP ロードバランシングしたい場合はインターナルのロードバランサが欠かせません。無理やりすべてグローバルなロードバランサで運用することもできますが、内部同士の通信をするためにいちいち VPC ネットワーク外に出て SSL/TLS で通信しなければならないのはコスト面・レイテンシ面でも好ましくありません。

コミュニティ Slack や Issue には投げたのですが反応がなく、いつ修正がされるかわかりません。そこでいつまでも受け身で待つよりかは OSS の醍醐味ということで自分自身でプルリクエストでも投げてみることにしました。

本記事では Spinnaker のソースコードを修正するために、IntelliJ IDEA でリモートデバッグしてみたのでその方法をご紹介します。 同じような境遇の方やバグに遭遇してデバッグしたい人にとって有益になれば幸いです。今回は Spinnaker のコンポーネントの一つである、Clouddriver*1 を例にしますが、他のコンポーネントも同様にできるはずです。なお、Clouddriver は SpringBoot + Groovy で構成されており、私にとってまったくわからないことが多いため未だ修正はできていません。。。

Clouddriver をソースコードから実行する方法については次の記事が大変参考になりました。

Spinnakerのコードを手元で修正して動作確認する方法(その1) – PSYENCE:MEDIA

Spinnakerのコードを手元で修正して動作確認する方法(その2) – PSYENCE:MEDIA

前提条件

すでに Google Compute Engine(GCE)に Spinnaker をインストールしていることが前提となります。もしまだインストールしていない場合は次の記事を参考にしてみてください。

blog.jicoman.info

GCE インスタンスにはグローバル IP アドレスを付与し、7002、7102 ポートでアクセスできるように Firewall Rules で許可してください。グローバル IP アドレスは静的 IP アドレスである必要はありません。*2

今回は例として、インスタンス名を dev-spinnaker、グローバルIPアドレスを 35.200.111.49 とします*3

Clouddriver をソースコードで動かす

Spinnakerのコードを手元で修正して動作確認する方法(その1) – PSYENCE:MEDIA で紹介されている方法を参考にしました。

# 必要なパッケージのインストール
$ sudo apt-get update
$ sudo apt-get install -y openjdk-8-jdk

# Halyard でインストールされた Clouddriver を停止
$ sudo systemctl stop clouddriver

# ソースコードを取得、設定ファイルをコピー
$ git clone https://github.com/spinnaker/clouddriver.git
$ cd clouddriver
$ cp /opt/spinnaker/config/clouddriver.yml \
  ./clouddriver-web/config/clouddriver.yml

GCE インスタンス外から Clouddriver にアクセスできるように clouddriver-web/config/clouddriver.yml を修正します。この方法はセキュリティ的に好ましくありませんが、今回はデバッグ用途なのでスルーします。

server:
  port: ${services.clouddriver.port:7002}
  address: 0.0.0.0   # 追加
  # address: ${services.clouddriver.host:localhost} # 削除

次のコマンドでビルドと起動します。-DDEBUG=true をつけることで、7102 ポートでデバッグモードも起動します。

$ ./gradlew -DDEBUG=true

起動できたら Clouddriver にアクセスできることを確認します。http://35.200.111.49:7002/applications/{アプリケーション名}/loadBalancers にアクセスし、ロードバランサ一覧が取得できていることを確認します。

リモートデバッグの設定

「Run」→「Edit Configurations」を選択します。左上の「+」をクリックして「Remote」を選択します。下図のように設定します。

spinnaker-remote-debug

  • Name: 適当な名前
  • Host: GCE インスタンスのグローバル IP アドレス
  • Port: 7102(デバッグモード)

リモートデバッグを試す

デバッグしたい行にブレークポイントを入れて、右上にある虫アイコンをクリックします。設定が正しくされていれば下図のようにブレークポイントで止まるはずです。

spinnaker-remote-debug

うまくいかない場合

もしうまくいかない場合は問題を切り分けて考えてみましょう。

Clouddriver デバッグモードが起動できているか

GCE インスタンスで 7102 ポートで Listen できているか確認してください。

$ netstat -an | grep 7102

GCE インスタンスへの疎通ができているか

PC から GCE インスタンスへ疎通できているか確認してください。
PC 側は telnet コマンド等で 7102 ポートで到達できるかを確認します。

$ telnet 35.200.111.49 7102

GCE インスタンス側は tcpdump などでパケットが流れているかを確認してもよいかもしれません。

$ sudo tcpdump -s0 -A port 7102

宣伝

技術書典7 で販売した Spinnaker入門は引き続き BOOTH で販売中です!

ohsawa0515.booth.pm

twitter.com

*1:Clouddriver は AWS、GCPなどのクラウドプロバイダへの変更やリソース管理を司るコンポーネントです。

*2:GCE インスタンスを再起動してもグローバル IP アドレスを固定したい場合は静的 IP アドレスを用いてください。

*3:このグローバルIPアドレスはエフェメラルであり(当然ですが)どこか別の人が利用しているかもしません