VIP Response Inconsistency in DSR Architecture with Follow-Port Configuration
- override-port が使えない環境で、port 80 でヘルスチェックするためには follow-port が必要
- 監視対象の仮想ポート(例:VIP の vport 80)の サービスポートに追従させる設定(=follow-port)。
- 任意の別ポートに強制する override-port が使えないなら、サービスと同じ 80 番でチェックするように follow-port を使う。
- follow-port を使うには、follow-port 先の port 定義が必要
- 追従対象となる vport(例:VIP:80)や、サーバ側の service port(80)が オブジェクトとして定義済みであることが前提。
- DSR 環境では、server port にヘルスチェックを定義しただけでは lo チェックが働かない
- DSR は 返信経路がサーバから直接クライアントへ戻るため、サーバ側に VIP を受けるための lo0(ループバック)に VIP アドレスを持たせるなどの内在条件が必要。
- 単にアプリ(HTTP)応答があるだけでは、DSR としての可用条件(lo0 への VIP 設定・ ARP/ルーティング抑止 等)を満たしているかは判定できない。
- VIP に vport 80 が必要
- 当然ながら、クライアントが TCP/80 で到達するための **仮想サーバ(VIP:80)**が正しく存在し、follow-port の対象ともなる。
実際の挙動(問題となるケース)
Section titled “実際の挙動(問題となるケース)”- サーバに lo0 が付いていなくても status.html が読めればサービスインしてしまう
- lo0 にアドレスが設定されている・いないにかかわらずサーバは Up 状態でサービスイン状態
- VIP にサービスインしてしまうが、lo0 が付いていないので、VIP に対するリクエストには応答しないため事故
つまり
- ヘルスチェックが アプリ層(HTTP/80)だけを見て Up にしてしまう。
- DSR に必要な ループバック設定(lo0 に VIP or 受け付け用アドレス) がないため、実トラフィックは 戻り応答不可/ブラックホールになり、VIP 的にはサービスイン済みなのに応答しないという 不一致が発生。
Config 例
Section titled “Config 例”slb server server01 10.10.10.11 port 80 tcp health-check http-get-status conn-limit 20000 port 443 tcp health-check follow-port 80 tcp conn-limit 20000!slb server server02 10.10.10.12 port 80 tcp health-check http-get-status conn-limit 20000 port 443 tcp health-check follow-port 80 tcp conn-limit 20000!slb service-group vip01-443 tcp member server01:443 member server02:443!slb virtual-server vip01 10.10.10.13 ha-group 1 port 443 tcp service-group vip01-443 no-dest-nat ha-conn-mirror!