DigiLoog

PC関係の事なら何でもいけるそんな処

keepalivedアップグレードとIPv6 DADのコンボで仮想IP割当がバグった

2021年06月06日(日) - 22:15 | カテゴリ: Linux

ロードバランサ兼リバースプロキシとして利用しているサーバでは、
仮想IPの管理にCentOS8のAppStreamで配布しているバージョンのkeepalivedを走らせていた。
今まで不具合も出ずに動いていたので普段通りにOSのアップグレードを実行したら、
想定外の仮想IPが割り当たらなくなる不具合に当たった。

“ns-lab BB”のロードバランサ構成は以前書いた紹介記事を読んで貰えばわかるが、
一応説明を書くと、NICを2個接続してインライン構成にしつつ、
それぞれのNICでVRRPv3を喋ってIPv4・IPv6仮想IPを付与する構成となる。

今回の問題が発生したのは2021/06/04の早朝。
上に書いた通りパッケージのアップグレードを実施したら、
プライベートIPを付与しているNIC(eth0)側のIPv4のみ仮想IPが突然消えた。
ログは何も出ていなかったのでパケットを見たが正常にパケットは飛んできていた。
straceを読む余裕が無かったので不明だが、恐らく仮想IPを渡す所で不具合が発生したのでは無いかと思われる。

今までサーバを運用してきた直感だと、IPv6 Duplicate Address Detection・Non Local Bindあたりが怪しかった。
その上でデバッグログを有効化したりしてみたら、それっぽいログが出ていた事が判明。

Jun 4 07:04:54 server ***: (eth0-ipv4) removing VIPs.
Jun 4 07:04:54 server ***: (eth0-ipv6) removing VIPs.
Jun 4 07:04:54 server ***: (eth1-ipv4) removing VIPs.
Jun 4 07:04:54 server ***: (eth1-ipv6) removing VIPs.
Jun 4 07:04:54 server ***: bind unicast_src Unicast-IPv6 failed 22 - Invalid argument
Jun 4 07:04:54 server ***: (eth0-ipv6): entering FAULT state (src address not configured)
Jun 4 07:04:54 server ***: (eth0-ipv6) Entering FAULT STATE
Jun 4 07:04:54 server ***: VRRP_Group(eth0-vip) Syncing instances to FAULT state
Jun 4 07:04:54 server ***: (eth0-ipv4) Entering FAULT STATE
Jun 4 07:04:54 server ***: VRRP sockpool: [ifindex(  2), family(IPv4), proto(112), fd(14,15), unicast, address(Private-IPv4)]
Jun 4 07:04:54 server ***: VRRP sockpool: [ifindex(  2), family(IPv6), proto(112), fd(-1,-1), unicast, address(Unicast-IPv6)]
Jun 4 07:04:54 server ***: VRRP sockpool: [ifindex(  3), family(IPv4), proto(112), fd(16,17), unicast, address(Global-IPv4)]
Jun 4 07:04:54 server ***: VRRP sockpool: [ifindex(  3), family(IPv6), proto(112), fd(18,19), unicast, address(Unicast-IPv6)]
Jun 4 07:04:54 server ***: VRRP_Script(healthcheck) succeeded

keepalivedでvrrp_sync_groupやtrack_interfaceは入れてあるのでエラーが出ているIPv6が落ちるのは判るが、
IPv4・IPv6の片方だけ生き残るのは想定外だった。

今回は復旧優先という事もあり、IPv6 DADの無効化を入れつつkeepalivedをソースビルドに変更して復旧させた。
サービスのハブとなっているサーバなので冗長化していたのだが、まさか冗長化部分が壊れるのは想定外。
根本的な原因は不明だが、アプリケーションアップグレードのレアケースとして良い経験になった。





  • 応援中

    はじめるセカイの理想論 -goodbye world index-