Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@nota-ja
Last active December 30, 2015 06:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nota-ja/7788733 to your computer and use it in GitHub Desktop.
Save nota-ja/7788733 to your computer and use it in GitHub Desktop.
HM9000の使い方

 この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のコードを見てみましょう。

https://github.com/cloudfoundry/cloud_controller_ng/blob/9fc43437094383ec036b87a9767cfe5b0d201132/lib/cloud_controller/hm9000_respondent.rb#L17-L25

    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),

https://github.com/cloudfoundry/cloud_controller_ng/blob/9fc43437094383ec036b87a9767cfe5b0d201132/lib/cloud_controller/hm9000_respondent.rb#L27-L49 のL44-45

        dea_client.stop_instances(app_id, instance_guid) unless @noop
        logger.info "cloudcontroller.hm9000.will-stop", :reason => reason, :payload => message, :noop => @noop

@noopfalseである場合のみdeaに対してインスタンス停止要求が行われるようになっています(ここでわかりにくいのは,@noopの値に関わらず,ログには停止要求が行われたように出力されることです)。

 hm9000_noopの設定については,デフォルト値がtrueなので,何も設定しなければCCv2はHM9000のメッセージに反応しません。一方,HM9000のREADMEにもCCv2のREADMEにも記載がないため,なかなか気付きにくくなっています。わずかにcf-releaseのサンプル・テンプレートに記載がありますが,何の説明もないので,今のところこの設定の意味を知るには結局ソースコードを読むよりほかに方法がありません。

 というわけで,かなりニッチな知識ですが,万が一(日本語を母国語とする人で)HM9000を使ってみたいという人がいた時に,少しだけ役立つかもしれないtipsを書いてみました。

 ぎりぎり12/4内に間に合ったかな。nota-jaでした。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment