業務で 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 をインストールしていることが前提となります。もしまだインストールしていない場合は次の記事を参考にしてみてください。
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」を選択します。下図のように設定します。
- Name: 適当な名前
- Host: GCE インスタンスのグローバル IP アドレス
- Port: 7102(デバッグモード)
リモートデバッグを試す
デバッグしたい行にブレークポイントを入れて、右上にある虫アイコンをクリックします。設定が正しくされていれば下図のようにブレークポイントで止まるはずです。
うまくいかない場合
もしうまくいかない場合は問題を切り分けて考えてみましょう。
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 で販売中です!
twitter.comAWS EKS, GCP GKEに対応!継続的デリバリーツール Spinnakerの入門書です。AWS、GCP初心者でもわかりやすい(はず)
— shu1 (@ohsawa0515) 2019年10月2日
BOOTH にて電子版販売中です!https://t.co/mUq5JBDSkL#技術書典 #推し祭りリターンズ @techbookfest