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のようなヘルスチェック機能ではないのでその点は注意されたし。