メインコンテンツにスキップ

3つ以上の計算ノードを持つクラスターのロードバランサーサービスエラーを修正

概要

CubeCOSバージョン3.0.0では、3つ以上のコンピューティングノードを持つクラスターがサービスとしてロードバランサー(LBaaS)によって誤って報告される可能性があります。

詳細

問題の説明

Octaviaワーカーは、最初の3つのコンピュートノードでのみ実行されるように設計されています。 ただし、ヘルスチェッカーはすべてのコンピューティングノードを評価します。 最初の3つを超えて計算ノードをチェックするとき Octaviaがノード上で実行されていないことを検出し、LBaaSサービスを不健康として誤って報告します。

対象バージョン

CubeCOS 3.0.0 以上。

この記事は、CubeCOS バージョン 3.0.0 以降を実行している環境に適用されます。

決議

LBaaSのヘルスモニターにパッチを適用する

  1. 端末セッションを開きます。

  2. SSH 経由で root ユーザーとしてクラスタ管理 VIP にログインします。

    ssh root@<your-cluster-vip>
  3. ヘルスモニタの設定ファイルを開き、LBaaSヘルスプローブを編集します。

    このSDKヘルスモジュールは、CubeCOSサービスのヘルスチェックと自動修理アクションを提供します。 このコマンドは、ファイルエディタを介してヘルスモニタの設定を開きます。

    vim /usr/lib/hex_sdk/modules/sdk_health.sh
  4. Octaviaのヘルスチェック関数を見つける

    1. /health_octavia_check() と入力して、health_octavia_check 関数を検索してください
    2. Enterキーを押します
    3. health_octavia_check() 関数がハイライトされると、既存のロジックを確認します。 この機能を変更して、LBaaSの健康エラーを防ぎます。
  5. 最初の3つのコンピュートノード上のOctaviaサービスのみを検証するように、コンピュートノードのチェックを更新してください。

    1. health_octavia_check() 関数内で、Octavia コンピュートノードのチェックを以下の条件で囲んでください:

      if remote_run $node hex_sdk is_first_three_compute_node ; then
      ...
      fi
  6. ヘルスチェックの変更を適用する

    1. エラーログのソースを設定する行を特定します

      ERR_LOG="ip addr show"
    2. この行の直後に続く for ループを探してください

      for node in "${CUBE_NODE_COMPUTE_HOSTNAMES[@]}" ; do
      ...
      done
  7. 以下のdiffに示すように、このループ内に条件分岐ロジックを追加してください:

    health_octavia_check()
    {
    stale_api_check_repair octavia-api 9876 octavia-api python3

    local 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" ] ; then
    ERR_CODE=1
    else
    for node in "${CUBE_NODE_CONTROL_HOSTNAMES[@]}" ; do
    if ! is_remote_running $node octavia-api ; then
    ERR_MSG+="octavia-api on $node is not running\n"
    ERR_CODE=3
    ERR_LOG="journalctl -n $ERR_LOGSIZE -u octavia-api"
    elif ! is_remote_running $node octavia-housekeeping ; then
    ERR_MSG+="octavia-housekeeping on $node is not running\n"
    ERR_CODE=4
    ERR_LOG="journalctl -n $ERR_LOGSIZE -u octavia-housekeeping"
    fi
    done
    ERR_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
    - fi
    done
    fi

    _health_fail_log
    }
  8. 更新した設定を同期します。

    ファイルを保存した後、更新されたヘルスモジュールをすべてのコンピュートおよび制御統合ノードに同期します:

    cubectl node rsync /usr/lib/hex_sdk/modules/sdk_health.sh -r compute
  9. 健康チェックの修正を確認します。

  10. ヘルスチェックを手動で実行する:

    hex_sdk health_octavia_check ; echo $?
  11. コマンドが 0 を返した場合、修正は完了します。 サービスの再起動やノードの再起動は必要ありません。