3つ以上の計算ノードを持つクラスターのロードバランサーサービスエラーを修正
概要
CubeCOSバージョン3.0.0では、3つ以上のコンピューティングノードを持つクラスターがサービスとしてロードバランサー(LBaaS)によって誤って報告される可能性があります。
詳細
問題の説明
Octaviaワーカーは、最初の3つのコンピュートノードでのみ実行されるように設計されています。 ただし、ヘルスチェッカーはすべてのコンピューティングノードを評価します。 最初の3つを超えて計算ノードをチェックするとき Octaviaがノード上で実行されていないことを検出し、LBaaSサービスを不健康として誤って報告します。
対象バージョン
CubeCOS 3.0.0 以上。
この記事は、CubeCOS バージョン 3.0.0 以降を実行している環境に適用されます。
決議
LBaaSのヘルスモニターにパッチを適用する
-
端末セッションを開きます。
-
SSH 経由で
rootユーザーとしてクラスタ管理 VIP にログインします。ssh root@<your-cluster-vip> -
ヘルスモニタの設定ファイルを開き、LBaaSヘルスプローブを編集します。
このSDKヘルスモジュールは、CubeCOSサービスのヘルスチェックと自動修理アクションを提供します。 このコマンドは、ファイルエディタを介してヘルスモニタの設定を開きます。
vim /usr/lib/hex_sdk/modules/sdk_health.sh -
Octaviaのヘルスチェック関数を見つける
/health_octavia_check()と入力して、health_octavia_check関数を検索してください- Enterキーを押します
health_octavia_check()関数がハイライトされると、既存のロジックを確認します。 この機能を変更して、LBaaSの健康エラーを防ぎます。
-
最初の3つのコンピュートノード上のOctaviaサービスのみを検証するように、コンピュートノードのチェックを更新してください。
-
health_octavia_check() 関数内で、Octavia コンピュートノードのチェックを以下の条件で囲んでください:
if remote_run $node hex_sdk is_first_three_compute_node ; then...fi
-
-
ヘルスチェックの変更を適用する
-
エラーログのソースを設定する行を特定します
ERR_LOG="ip addr show" -
この行の直後に続く
forループを探してくださいfor node in "${CUBE_NODE_COMPUTE_HOSTNAMES[@]}" ; do...done
-
-
以下のdiffに示すように、このループ内に条件分岐ロジックを追加してください:
health_octavia_check(){stale_api_check_repair octavia-api 9876 octavia-api python3local http_stats=$(influx -host $(shared_id) -database monasca -format json -execute "select last(value) from http_status where service = 'octavia'" | jq .results[0].series[0].values[0][1])if [ "$http_stats" != "0" ] ; thenERR_CODE=1elsefor node in "${CUBE_NODE_CONTROL_HOSTNAMES[@]}" ; doif ! is_remote_running $node octavia-api ; thenERR_MSG+="octavia-api on $node is not running\n"ERR_CODE=3ERR_LOG="journalctl -n $ERR_LOGSIZE -u octavia-api"elif ! is_remote_running $node octavia-housekeeping ; thenERR_MSG+="octavia-housekeeping on $node is not running\n"ERR_CODE=4ERR_LOG="journalctl -n $ERR_LOGSIZE -u octavia-housekeeping"fidoneERR_LOG="ip addr show"for node in "${CUBE_NODE_COMPUTE_HOSTNAMES[@]}" ; do+ if remote_run $node hex_sdk is_first_three_compute_node ; then+ if ! remote_run $node ovs-vsctl port-to-br octavia-hm0 >/dev/null 2>&1 ; then+ ERR_MSG+="no octavia-hm0 ovn port found on $node\n"+ ERR_CODE=5+ elif remote_run $node ip link show octavia-hm0 | grep -q DOWN ; then+ ERR_MSG+="no link octavia-hm0 found on $node\n"+ ERR_CODE=6+ elif ! remote_run $node route -n | grep -q octavia-hm0 ; then+ ERR_MSG+="no route from octavia-hm0 found on $node\n"+ ERR_CODE=7+ elif ! is_remote_running $node octavia-worker ; then+ ERR_MSG+="octavia-worker on $node is not running\n"+ ERR_CODE=8+ elif ! is_remote_running $node octavia-health-manager ; then+ ERR_MSG+="octavia-health-manager on $node is not running\n"+ ERR_CODE=9+ fi+ fi- if ! remote_run $node ovs-vsctl port-to-br octavia-hm0 >/dev/null 2>&1 ; then- ERR_MSG+="no octavia-hm0 ovn port found on $node\n"- ERR_CODE=5- elif remote_run $node ip link show octavia-hm0 | grep -q DOWN ; then- ERR_MSG+="no link octavia-hm0 found on $node\n"- ERR_CODE=6- elif ! remote_run $node route -n | grep -q octavia-hm0 ; then- ERR_MSG+="no route from octavia-hm0 found on $node\n"- ERR_CODE=7- elif ! is_remote_running $node octavia-worker ; then- ERR_MSG+="octavia-worker on $node is not running\n"- ERR_CODE=8- elif ! is_remote_running $node octavia-health-manager ; then- ERR_MSG+="octavia-health-manager on $node is not running\n"- ERR_CODE=9- fidonefi_health_fail_log} -
更新した設定を同期します。
ファイルを保存した後、更新されたヘルスモジュールをすべてのコンピュートおよび制御統合ノードに同期します:
cubectl node rsync /usr/lib/hex_sdk/modules/sdk_health.sh -r compute -
健康チェックの修正を確認します。
-
ヘルスチェックを手動で実行する:
hex_sdk health_octavia_check ; echo $? -
コマンドが
0を返した場合、修正は完了します。 サービスの再起動やノードの再起動は必要ありません。