Avi Load Balancerのマルチテナント設定についてまとめてみる

この記事は[vExperts Advent Calendar 2024](https://adventar.org/calendars/10310)の５日目の記事です。

Avi Load Balancerはコントロールプレーンとデータプレーンが分離したアーキテクチャを持っている仮想ロードバランサーで、テナントを作成してコントローラの設定をテナント毎に分割したり、データプレーンの提供方法も管理者が一元的に行うのか、テナントユーザがセルフサービス的に利用するのかを選択できたりと、マルチテナントに関わる設定が充実しています。

ただ私自身あまりこの辺りの設定に関する整理と理解が追いついていないので、この機に触りながら整理をしてみようという記事です。

注）ロードバランサーとしての使い方や設定については本記事で触れません。

# 前提条件
バージョン 30.2.1

Cloud設定はNo Ochestratorで設定

# Cloud設定の説明
CloudはAviの設定において、データプレーンの供給元基盤の設定となります。
vSphereをOchestratorとするCloudを作成した場合は、vCenterやESXiのクレデンシャルとIPアドレスなどを入力して連携することで、データプレーン仮想マシンが連携先の基盤上に作成されます。AWS等のパブリッククラウドをCloudとして設定することも可能です。

No Ochestratorは特に他と連携せず、手動でコントローラからデータプレーン仮想マシン（サービスエンジン、SEと呼ばれる）のOVAをダウンロードし、同じくコントローラ上でAuth Tokenを生成してOVAデプロイ時に登録する方法となります。

![SnapCrab_NoName_2024-12-2_15-53-17_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/e71d718a-576f-8b05-8bcc-c80818ff249d.png)

画像の右の方にある下矢印のアイコンでOVA（もしくはqcow2）のダウンロード、鍵のアイコンでAuth Tokenの生成をそれぞれ行います。


# テナントとユーザ
初期状態ではadminテナントとadminユーザが存在しています。
adminユーザにはスーパーユーザという属性が設定されており、全テナントに対する書き込み権限を有しています。
また、別のテナントやユーザ、ロールの作成が可能です。

テナントの作成画面は下記のようにシンプルです。
（2つのチェックボックスについては後ほど説明します）
![SnapCrab_NoName_2024-12-2_16-24-52_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/d421a9ec-e11b-f53c-e641-f955f3a147e6.png)

テナント作成後、ユーザに対してどのテナントにどの権限を割り当てるかを設定できます。
下記画像はユーザ設定の中のテナントとロールに関する部分です。
すべてのテナントを対象としたロールと個別のテナントに対するロールを設定可能です。
![SnapCrab_NoName_2024-12-3_14-52-6_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/fba57749-6a92-6326-6ca0-18222b1b0ef4.png)

ロール自体についてはいくつかビルトインされたものがあり、カスタムロールを作成することもできます。
下記画像のようにそれぞれの設定項目について、書き込み、読み込み、アクセス不可の3種類から権限を設定できます。
![SnapCrab_NoName_2024-12-2_16-26-25_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/9de701df-e1b2-4107-8e95-cefb9032847f.png)
adminユーザにはデフォルトですべてのテナントに対する「Tenant-Admin」ロールが割り当てられており、Tenant-AdminロールはCloudやサービスエンジンなどデータプレーンに関わる設定、ロードバランサーとしての設定含め、そのテナント内のほぼすべての設定を行うことができます。（テナントやユーザの追加削除編集等は行えない）

複数のテナントにアクセス権を有するユーザはGUI右上にテナントコンテキストを切り替える箇所があり、そこから特定のテナントのGUIに切り替えることができます。
テナントを切り替えると、そのテナント内の設定のみが表示され、他のテナントの設定は見えなくなります。
![SnapCrab_NoName_2024-12-4_14-3-28_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/1b2cd381-992c-f855-5d8b-65019f482323.png)
また、スーパーユーザは「すべてのテナント」に切り替えることで全テナントの設定を確認できます。


# サービスエンジン コンテキスト
Aviのコントローラをデプロイし、初回のGUIアクセスの際の初期設定画面にも出てくるのが、このサービスエンジンコンテキストの設定です。サービスエンジン（SE）はAviのデータプレーンを担う仮想マシンになります。
冒頭でもお話した、データプレーンの提供を管理者が一元的に行うか、テナントユーザがセルフで行うか、を決定するための設定となります。（そのため、どちらかのモードでテナントを作成後は、既存テナントをすべて削除しない限り変更できません）
![SnapCrab_NoName_2024-12-4_11-38-32_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/a6da9e22-50c7-2a93-344d-ea0cdec13f5f.png)
プロバイダコンテキスト（共有）を設定した場合、サービスエンジンはadminが管理・供給するものとなります。
admin以外の各テナントのユーザはadminが作成したCloudを使用してSEをデプロイするということができなくなります。（Auth Tokenを生成できなくなる）

Cloud設定はadminテナントのものか、それ以外の一般テナントのものかで区別されており、adminテナントに作成したCloud設定は基本的にどのテナントに切り替えても（自分のテナントのCloud設定にアクセスできるロール権限があれば）表示され、アクセスを行うことが可能です。ただ、表示はされますがAuth Tokenは生成できない状態となるため、そのCloudにサービスエンジンをデプロイすることはできません。

そもそもadminがサービスエンジンを提供するなら一般テナントユーザはCloudやサービスエンジンの設定を確認できる必要がないのでは、という疑問があります。その場合、テナント設定にあった2つのチェックボックスのうちの1つ、「プロバイダサービスエンジンへのテナントアクセス」をOFFにします。
![SnapCrab_NoName_2024-12-2_19-22-16_No-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/5658567c-2f20-c0a9-c5e5-e37fd0961795.png)
これをOFFにした場合、Cloudやサービスエンジン、VRFの確認、設定が行える、「インフラストラクチャ」設定タブに、そのテナントのユーザがアクセスすることはできなくなります。

![SnapCrab_NoName_2024-12-2_19-25-9_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/46272ee8-acd3-399b-768b-781a32e0f4f3.png)

逆にサービスエンジンコンテキストをテナントコンテキストに設定した場合、adminテナントにあるCloudを利用しAuth Tokenを生成してサービスエンジンをデプロイすることが、他のテナントユーザにも可能となります。

adminテナントのCloudを利用して作成されたサービスエンジンも、Auth Token生成時にどのテナントのTokenなのかが判別できる情報が含まれており、デプロイされたサービスエンジンはAuth Tokenで指定されたテナントのものとして、そのテナントのサービスエンジングループ（サービスエンジンをグループ化して冗長化方式などを決める設定）に所属する形となります。
![SnapCrab_NoName_2024-12-3_18-5-45_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/a54e74f8-28c0-3895-487f-af8f496ae453.png)
上記の図のように、「すべてのテナント」に切り替えてサービスエンジングループを確認すると、Admin-Cloud配下に各テナント用のサービスエンジングループが存在します。

その他、adminテナント以外のテナントユーザが自分のテナント上にCloud設定を作成することも権限があれば可能です。
その場合、そのCloud設定は他のテナントからは見えず、作成したテナント専用のCloud設定となります。

# テナントVRF
1つのサービスエンジン内に複数のVRFを作成し、テナントのVLANを収容してルーティングすることができます。
No OchestratorのCloudで作成したサービスエンジンであればVLANインターフェースを作成できるので、1つのvNICに対して複数のテナントのVLANを持たせて、それぞれのVLANインターフェース毎にVRFを設定できます。
これによりテナント間でIPアドレスが重複していても、VRFが別れていれば正しくロードバランスできます。
![SnapCrab_NoName_2024-12-3_18-20-4_No-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/6dc349ea-f3fe-a382-a4bf-1019e0e3b96b.png)


AviのVRF設定はCloudに紐づいており、デフォルトではCloud毎にglobal VRFのみ存在しています。
adminであれば、adminテナントのCloudにあるVRFに対して、追加でVRF作成やルート設定を行うことが可能です。他のテナントユーザはadmin CloudのVRFに対してなにか操作を行うことはできません。

そのため、サービスエンジンコンテキストがテナントコンテキストで、かつadminの用意したCloudを利用して各テナントがサービスエンジンを作成する想定だと、VRFの作成やルート設定の部分のみセルフではなくadminが行うことになります。
一貫性という意味ではテナント側にセルフでルーティング設定も行えるようにしたいという場面もあると思いますので、その場合、テナント設定の中にあった「テナントVRF」のチェックをONにします。
![SnapCrab_NoName_2024-12-2_16-24-52_No-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/3b8c5fe7-5ac5-1400-c24f-e1a49cb41ec0.png)
これをONにすることで、テナント作成されると同時にadmin CloudのVRFに対して追加でそのテナント用のVRFが自動作成されます。また他のテナントからは分離された状態で自テナント用の他のVRFを追加したりルートを追加・編集することもテナントユーザ自身で可能になります。
![SnapCrab_NoName_2024-12-2_18-28-7_No-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657075/c2d76448-586d-8aaf-8fae-7151d0943722.png)


adminテナントのCloudではなく、各個別のテナントが作成したCloudのVRFに対しては、元々そのテナントのユーザが権限に応じてVRFの設定を行う事が可能ですので、上記テナントVRFの設定は特に影響しません。あくまでadminのCloudに対する設定となります。

# まとめ
まとめてみると言いつつまとまりのない記事になっておりますが、ここまでの設定と挙動を見ると、以下の2つがベースとなるのかなと個人的に思いました。

* adminがインフラストラクチャ（Cloud、サービスエンジン、VRF）を一元管理する場合
・サービスエンジンコンテキスト：プロバイダコンテキスト
・プロバイダサービスエンジンへのテナントアクセス：OFF
・テナントVRF：OFF
・各テナントユーザのロール：ビルトインのものだとApplication-Adminなどインフラストラクチャ設定に権限が無いもの
<br>

* 各テナント自身でインフラストラクチャまで管理する場合（Cloud設定はadmin提供）
・サービスエンジンコンテキスト：テナントコンテキスト
・プロバイダサービスエンジンへのテナントアクセス：ON
・テナントVRF：ON
・各テナントユーザのロール：Tenant-Adminなどインフラストラクチャの設定まで権限をもつもの