現象の説明
CLBのUDPヘルスチェックで、バックエンドサーバーポートの真のステータスとヘルスチェックステータスが一致しません。
考えられる原因
UDPヘルスチェックの原理は、CLBがUDPチェックメッセージをバックエンドサーバーに送信し、PINGに成功してなおかつ応答タイムアウト時間内にメッセージ port XX unreachableが返されなかった場合、ヘルスチェックは正常であると判定し、そうでなければ異常と判定するものです。
ステータスが一致しない問題が発生する原因としては次の2つが考えられます。
ヘルスチェックの応答タイムアウト時間が短すぎ、バックエンドサーバーから返されるreplyまたはport unreachableタイプのICMPメッセージがタイムアウト時間内にヘルスチェックのノードに到達せず、ヘルスチェックの結果が不正確になります。
バックエンドサーバーがICMPメッセージ生成の速度を制限しているため、サーバーに異常が生じていても、フロントエンドにエラーメッセージport XX unreachableを返すことができないため、CLBはICMP応答を受信していないことからヘルスチェックを成功と判定し、最終的にサービスの真のステータスがヘルスチェックと一致しなくなります。
処理手順
1. 初めに、ヘルスチェックの応答タイムアウト時間の設定が短すぎないかを調べます。CLBコンソールにログインし、UDPリスナーのヘルスチェックの応答タイムアウト時間を適宜延長します。詳細については、 UDPヘルスチェックの設定をご参照ください。 説明:
UDPヘルスチェックの原理は他のヘルスチェックとは異なります。 ヘルスチェックのタイムアウト時間が短すぎると、バックエンドサーバーがオンラインとオフラインを繰り返す可能性があるため、長めに設定することをお勧めします。
2. ヘルスチェックの応答タイムアウト時間を調整してもステータスの不一致が続く場合は、バックエンドサーバーがICMPメッセージ生成の速度を制限していないかどうかのトラブルシューティングを選択します。バックエンドCVMにログインし、次のコマンドを実行してICMPメッセージ速度の制限をチェックします。
sysctl -q net.ipv4.icmp_ratelimit
sysctl -q net.ipv4.icmp_ratemask
3. net.ipv4.icmp_ratelimit速度パラメータの戻り値が0またはデフォルト値の1000かどうかを確認します。デフォルト値1000への変更をお勧めします。1000より大きくすることはお勧めしません。
4. 速度制限の調整を行ってもステータスの不一致が続く場合は、次のコマンドを実行してport unreachableタイプのICMPメッセージの速度制限を無効にします。
ご注意:
port unreachableタイプのICMPメッセージの送信速度を制限しなくなった後で、パブリックネットワークに公開されたサーバーがUDPポートスキャニング攻撃を受けた場合、port unreachableメッセージが回数制限なしに返されます。
sysctl -w net.ipv4.icmp_ratemask=xxxx