フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

MetalLBのv0.9.2で搭載されたL2でのノードの停止の回復速度向上を追ってみた

f:id:lirlia:20200415192919p:plain

Dramatically reduce dead node detection time when using Layer 2 mode (#527). This is improvement closes the long standing issue #298 that has been a common pain point for users using Layer 2 mode. This feature is enabled by default. You can disable it by simply changing the speaker Daemonset manifest and remove the METALLB_ML_BIND_ADDR environment variable. Also, you can verify the old method is being used by checking the speaker log on startup to contain: Not starting fast dead node detection (MemberList). If not shown, the new fast node detection method is being used.

こういう記載があったので追った。以下、どういうふうに追ったのかを備忘的に残す。

issueをみる

元々の課題はこちら。

kubernetesのnodeダウン時の検知が遅いためmetallbによるL2モードでのIP切り替えに時間がかかっていた。 

MetalLB以外のクラウドベンダのLBでは、常時LB側がヘルスチェックを行っているが、MetalLBは自分自身では負荷分散を行わない(iptablesのルール設定のみ)ためこういった方法による検知が出来ず、masterサーバによるpod evictionをトリガーにした動作しか行えなかった。

そこで以下のようなプルリクがだされ修整が行われた。


具体的にはこのcommit Use hashicorp/memberlist to speedup dead node detection by champtar · Pull Request #527 · metallb/metallb · GitHub

内容をかいつまんで説明すると、Hashicorp社のmemberlistという分散環境での死活監視の仕組み(Goのライブラリ)を導入し、MetallbのspeakerがIPを払い出しているコンテナに対してICMPによる死活監視を実装した。

memberlistについて

memberlistはSWIMと呼ばれる分散プロトコル(ゴシッププロトコルと呼ばれる)動きをつかっている。以下に詳しい日本語の記事があった。

MetalLBのコードを見る限りpodのIPを取得しているのでICMPプロトコルを使って死活監視を行っているように見えるが、memberlistの実装をみると以下のように記載されているのでTCPによる監視や、NACK(データ伝送で、受信側から送信側へ送られる否定的な返事。データを正常に受信できなかったときなどに、そのことを送信側に知らせるために送られる。)による監視もバージョンによって実装されている模様。

 // Version 3 added support for TCP pings but we kept the default
    // protocol version at 2 to ease transition to this new feature.
    // A memberlist speaking version 2 of the protocol will attempt
    // to TCP ping another memberlist who understands version 3 or
    // greater.
    //
    // Version 4 added support for nacks as part of indirect probes.
    // A memberlist speaking version 2 of the protocol will expect
    // nacks from another memberlist who understands version 4 or
    // greater, and likewise nacks will be sent to memberlists who
    // understand version 4 or greater

memberlist/net.go at c192837f8fd6d494ac641880d1356804b21503a3 · hashicorp/memberlist · GitHub

まとめ

MetalLBv0.9.2ではmemberlistライブラリを使用し稼働しているpodの死活監視をspeakerが行うことで障害時の切り替えの時間を大幅に削減した。ただしあくまでICMP監視であり、よくあるLBによるTCP/HTTPのようなヘルスチェック機能ではないのでその点は注意されたし。