このgistは Cloud Foundry Advent Calendar 2013 の4日目の記事です。
cloud Foundry では,最近,コンポーネントのGoでの書き換えが進んでいます。
最も早く登場したのが,Gorouter。そしてCFのクライアントも,vmc(Ruby実装)→cf(Ruby実装)という変遷を経て,gcfが正式版となりました。また,本当につい最近(11月下旬に),CFの心臓ともいえるNATSサーバーに,gnatsdが採用されました。
HM9000は,正式採用こそまだですが,CFのデプロイ・セットを定義しているcf-releaseには既に含まれており,BOSHでデプロイすることも可能です。但し,ある設定を行わないと,デプロイしても期待通りに機能しません。
それは,HM9000の設定ではなく,Cloud Controller V2 (CCv2)の設定です。 具体的には,hm9000_noop
という設定です。
(例: https://github.com/cloudfoundry/cloud_controller_ng/blob/9fc43437094383ec036b87a9767cfe5b0d201132/config/cloud_controller.yml#L123 )
hm9000_noop: true
この値をfalse
にしないと,HM9000が起動して,NATSにインスタンスの起動/終了リクエストを送出しているにも関わらず,CCv2が反応してくれず,実際にインスタンスの起動/終了が行われません。
CCv2のコードを見てみましょう。
def handle_requests
message_bus.subscribe("hm9000.stop", :queue => "cc") do |decoded_msg|
process_hm9000_stop(decoded_msg)
end
message_bus.subscribe("hm9000.start", :queue => "cc") do |decoded_msg|
process_hm9000_start(decoded_msg)
end
end
まず,NATSのsubjectが,既存の Health Manager ("health.start"
, "health.stop"
)と異なります。 このコードは起動時に実行されるので,CCv2は起動後,このsubjectにpublishされたメッセージを受け取ることができるのですが,受信したメッセージを処理する部分を見てみると(例はhm9000.stop
),
dea_client.stop_instances(app_id, instance_guid) unless @noop
logger.info "cloudcontroller.hm9000.will-stop", :reason => reason, :payload => message, :noop => @noop
@noop
がfalse
である場合のみdeaに対してインスタンス停止要求が行われるようになっています(ここでわかりにくいのは,@noop
の値に関わらず,ログには停止要求が行われたように出力されることです)。
hm9000_noop
の設定については,デフォルト値がtrue
なので,何も設定しなければCCv2はHM9000のメッセージに反応しません。一方,HM9000のREADMEにもCCv2のREADMEにも記載がないため,なかなか気付きにくくなっています。わずかにcf-releaseのサンプル・テンプレートに記載がありますが,何の説明もないので,今のところこの設定の意味を知るには結局ソースコードを読むよりほかに方法がありません。
というわけで,かなりニッチな知識ですが,万が一(日本語を母国語とする人で)HM9000を使ってみたいという人がいた時に,少しだけ役立つかもしれないtipsを書いてみました。
ぎりぎり12/4内に間に合ったかな。nota-jaでした。