自宅で検証できそうなスペックに合わせたNSX-Tのインストール手順を紹介します。NSX Manager 3台, NSX Edge 2台, ESXi 2台, vCenter 1台の構成で、このページではVLANトランスポートゾーンとT0ゲートウェイを接続する方法をまとめます。
構築範囲
このページでは、VLANトランスポートゾーンとそれに関する最小限のネットワーク設定をして、pingによる疎通確認可能な状態までの構築します。構築範囲を図示すると以下の範囲です。
システム関連の設定
VLANトランスポートゾーンの作成
NSX-Tはトランスポートゾーンと呼ばれる疎通可能な範囲を定義することができます。トランスポートゾーンは「オーバーレイ」と「VLAN」があります。後者のVLANトランスポートゾーンは、NSX-T外のルータなどを接続する時に使用します。
デフォルト設定のVLANトランスポートゾーンを使用しても問題ないですが、このページではVLANトランスポートゾーンを自作する方法を説明します。「システム」「ファブリック」「トランスポートゾーン」「ゾーンの追加」の順に押下します。
トランスポートゾーンの「名前」を入力し、「トラフィックタイプ」は「VLAN」とします。その後、「追加」を押下します。
VLANトランスポートゾーンが追加されたことを確認します。
ホストスイッチの設定
NSX EdgeにVLANトランスポートゾーンに所属しているホストスイッチを作成します。この設定によって、NSX内に接続されたセグメントがNSX外へルーティングできるようになります。
この設定を入れるには、「システム」「ファブリック」「ノード」「Edge トランスポートノード」の順に画面遷移し、対象のNSX Edgeにチェックを入れ「編集」を押下します。
前述の操作で作成したオーバーレイトランスポートゾーン向けとは別に、VLANトランスポートゾーン用のホストスイッチを作成しますので、「スイッチの追加」を押下します。
「Edgeスイッチ名」を入力します。何か分かりやすい名前が良いのは当然ですが、あまり他の設定と関係する設定ではないので、それほどこだって名前をつけるほどではないかと思われます。
前述の操作で設定した「(VLAN)トランスポートゾーン」「アップリンクプロファイル」を指定します。
アップリンクが接続されるインターフェースを指定します。このシナリオの場合ならば「fp-eth1」になります。
以上の設定完了後、「保存」を押下します。
オーバーレイトランスポートゾーンではなくVLANトランスポートゾーンですので、IPアドレスの設定はありません。ここでIPアドレスの設定欄が現れたら、トランスポートゾーンがVLANではなくオーバーレイになっています。トランスポートゾーンの設定を見直しましょう。
設定が完了すると、今まではN-VDSが1つだけであったのが2つになります。「N-VDS」の列が「1」から「2」に変わったことを確認します。
Edgeクラスタの作成
NSX-TはNSX Edgeをクラスタというまとまりで管理し、このクラスタに対してルータやセグメントを作成することができます。今までの操作で作成したNSX Edgeに対してクラスタを作成します。
Edgeクラスタを作成するには、「システム」「ファブリック」「ノード」「Edgeクラスタ」「Edgeクラスタの追加」の順に押下します。
「名前」に何か分かりやすいクラスタ名を入れます。
クラスタに参加させたいESX Edgeにチェックを入れ、「右矢羽」を押下します。
クラスタに追加されたことを確認して、「追加」を押下します。
Edgeクラスタが作成されたことを確認します。
ネットワーク関連の設定
セグメントの作成
前述の手順で作成したVLANトランスポートノードに紐づいたセグメントを作成します。「ネットワーク」「セグメント」「セグメント」「セグメントの追加」の順に押下します。
「セグメント名」は何か分かりやすい名前を、「接続されたゲートウェイ」は「なし」を、「トランスポートゾーン」は前述の操作で作成したVLANトランポートゾーンを設定します。
「VLAN」は「0」を設定します。
このシナリオではポートグループでVLANタグを付与しますので、セグメントの設定はVLANタグを付与しない「0」になります。もし、ポートグループや物理スイッチでVLANタグを付与しないならば、このセグメントの機能を使ってVLANタグを付与することもできます。
「保存」を押下します。
「いいえ」を押下します。
T0ゲートウェイの作成
NSX-Tは「Tier-0ゲートウェイ」「Tier-1ゲートウェイ」と呼ばれる2階層のルータを作成することができます。Tier-0ゲートウェイを作成し、後続の操作でTier-0のインターフェースをVLANトランスポートゾーンに所属させることで、NSX-Tが物理的なネットワーク機器と疎通可能な状態になります。
まずは、Tier-0ゲートウェイを作成しましょう。「ネットワーク」「Tier-0ゲートウェイ」「ゲートウェイの追加」「Tier-0」の順に押下します。
初回の編集画面では設定可能な項目は少なめです。「Tier-0ゲートウェイの名前」のみを入力します。
「保存」を押下します。
保存後に編集を継続するかどうかを聞かれます。2回目以降の編集ではより詳細なパラメタを指定できるようになります。「はい」を選び、編集を継続します。
「Edgeクラスタ」を指定し、「保存」を押下します。
設定が保存されたことを確認します。
T0ゲートウェイに接続されたインターフェース
Tier-0ゲートウェイの編集画面にて、「インターフェース」のメニューを開くと「編集」というリンクが現れます。これをクリックします。
「インターフェースの追加」を押下します。
「名前」は何か分かりやすい名前を、「タイプ」は「外部」を、「セグメント」は前述の操作で作成したVLANトランスポートノードと紐づいたセグメントを指定します。
「Edgeノード」を指定した後に、そのEdgeノードに付与するIPアドレスを「IPアドレス/マスク」の入力欄に指定します。
設定完了後、「保存」を押下します。
編集直後は「初期化されていません」との表示ですが、ここをクリックすると初期化が完了したか否かを確認できます。うまくいけば「初期化されていません」の表示が「成功」に変わります。
インターフェース設定に成功した場合は、「成功」との表示になります。
同様の操作を繰り返し、NSX Edge全てにIPアドレスを付与します。
ネットワーク関連の設定
Tier-0ゲートウェイに接続されたインターフェースに対して、ping疎通が可能であることを確認します。以下はNSX-T外部にある物理的なルータからのping確認をした時のログです。
nec-ix01# ping 192.168.3.131 PING 192.168.3.1 > 192.168.3.131 56 data bytes 64 bytes from 192.168.3.131: icmp_seq=0 ttl=64 time=17.046 ms 64 bytes from 192.168.3.131: icmp_seq=1 ttl=64 time=0.439 ms 64 bytes from 192.168.3.131: icmp_seq=2 ttl=64 time=0.355 ms --- 192.168.3.131 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip (ms) min/avg/max = 0.355/5.946/17.046 nec-ix01#
補足説明
自動化
VLANトランスポートノード作成
VLANトランスポートゾーンを設定するRest API操作は以下の通りです。
curl --request POST -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-zones << EOF { "display_name":"tz-vlan-01", "host_switch_name":"host-switch-tz-vlan-01", "transport_type":"VLAN" } EOF
ホストスイッチ作成
VLANトランスポートノードに属するホストスイッチを作成するRest API操作は以下の通りです。
「NSX-T 3.1.2 最小限構成のインストール方法 (4/7)」で作成したホストスイッチを削除しいよう、ホストスイッチの配列には「オーバーレイトランスポーポートゾーンに属するスイッチ」と「VLANトランスポートゾーン」に属するスイッチ」の2つを指定します。
NODE_DISPLAY_NAME="nsx-edge132.gokatei.go" NODE_IP_ADDRESS="192.168.2.132" NODE_SUBNET_MASK="255.255.255.0" NODE_DEFAUT_GATEWAY="192.168.2.1" UPLINK_PROF_DISPLAY_NAME="prof-edge-single-01" TZ_OVERLAY_NAME="tz-overlay-01" TZ_VLAN_NAME="tz-vlan-01" WORK_FILE=/tmp/nsx_api_work_$$ curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-nodes \ | jq --arg arg ${NODE_DISPLAY_NAME} ' .results[] | select ( .display_name == $arg ) ' \ > ${WORK_FILE} NODE_ID=$(cat ${WORK_FILE} | jq -r ".node_id") REVISION=$(cat ${WORK_FILE} | jq -r "._revision") rm -f WORK_FILE TZ_OVERLAY_ID=$(curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-zones \ | jq -r --arg arg ${TZ_OVERLAY_NAME} ' .results[] | select ( .display_name == $arg ) | .id ' ) TZ_VLAN_ID=$(curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-zones \ | jq -r --arg arg ${TZ_VLAN_NAME} ' .results[] | select ( .display_name == $arg ) | .id ' ) UPLINK_PROF_ID=$(curl --silent --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/host-switch-profiles \ | jq -r --arg arg ${UPLINK_PROF_DISPLAY_NAME} ' .results[] | select ( .display_name == $arg ) | .id') curl --request PUT -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-nodes/${NODE_ID} << EOF { "host_switch_spec" : { "host_switches" : [ { "host_switch_name" : "nsxHostSwitchOverlay", "host_switch_type" : "NVDS", "host_switch_mode" : "STANDARD", "host_switch_profile_ids" : [ { "key" : "UplinkHostSwitchProfile", "value" : "${UPLINK_PROF_ID}" } ], "pnics" : [ { "device_name" : "fp-eth0", "uplink_name" : "uplink1" } ], "is_migrate_pnics" : false, "ip_assignment_spec" : { "ip_list" : [ "${NODE_IP_ADDRESS}" ], "default_gateway" : "${NODE_DEFAUT_GATEWAY}", "subnet_mask" : "${NODE_SUBNET_MASK}", "resource_type" : "StaticIpListSpec" }, "transport_zone_endpoints" : [ { "transport_zone_id" : "${TZ_OVERLAY_ID}" } ] }, { "host_switch_name" : "nsxHostSwitchVlan", "host_switch_type" : "NVDS", "host_switch_mode" : "STANDARD", "host_switch_profile_ids" : [ { "key" : "UplinkHostSwitchProfile", "value" : "${UPLINK_PROF_ID}" } ], "pnics" : [ { "device_name" : "fp-eth1", "uplink_name" : "uplink1" } ], "transport_zone_endpoints" : [ { "transport_zone_id" : "${TZ_VLAN_ID}" } ] } ], "resource_type" : "StandardHostSwitchSpec" }, "display_name" : "${NODE_DISPLAY_NAME}", "description" : "", "_revision": ${REVISION} } EOF
Edgeクラスタの作成
Edgeクラスタを作成するRest API操作は以下の通りです。
NODE_DISPLAY_NAME_01="nsx-edge131.gokatei.go" NODE_DISPLAY_NAME_02="nsx-edge132.gokatei.go" NODE_ID_01=$(curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-nodes \ | jq -r --arg arg ${NODE_DISPLAY_NAME_01} ' .results[] | select ( .display_name == $arg ) | .id ') NODE_ID_02=$(curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-nodes \ | jq -r --arg arg ${NODE_DISPLAY_NAME_02} ' .results[] | select ( .display_name == $arg ) | .id ') curl --request POST -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/edge-clusters << EOF { "members" : [ { "transport_node_id":"${NODE_ID_01}" }, { "transport_node_id":"${NODE_ID_02}" } ], "resource_type" : "EdgeCluster", "display_name" : "cluster01" } EOF
セグメント作成
Tier-0ゲートウェイやTier-1ゲートウェイに接続されていないセグメントを作成するRest API操作は以下の通りです。
TZ_VLAN_NAME="tz-vlan-01" TZ_VLAN_ID=$(curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/transport-zones \ | jq -r --arg arg ${TZ_VLAN_NAME} ' .results[] | select ( .display_name == $arg ) | .id ' ) curl --request PUT -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/policy/api/v1/infra/segments/external-vlan3 << EOF { "type" : "DISCONNECTED", "vlan_ids" : [ "0" ], "transport_zone_path" : "/infra/sites/default/enforcement-points/default/transport-zones/${TZ_VLAN_ID}", "resource_type" : "Segment", "display_name" : "external-vlan3" } EOF
Tier-0ゲートウェイの作成
Tier-0ゲートウェイを作成するRest API操作は以下の通りです。
curl --request PUT -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/policy/api/v1/infra/tier-0s/t0-router << EOF { "resource_type" : "Tier0", "display_name" : "t0-router" } EOF
Tier-0ゲートウェイとEdgeクラスタの紐付け
Tier-0ルータの詳細な設定は以下のようなlocale-servicesというURL体系で管理されます。GUIで操作した場合は<ロケールサービスID>に「default」という名前が使用されますので、API操作するときも「defualt」という名前を使用します。
https://<fqdn>/policy/api/v1/infra/tier-0s/<t0ルータID>/locale-services/<ロケールサービスID>
Tier-0とEdgeクラスタを紐づけるRest API操作は以下の通りです。
CLUSTER_NAME="cluster01" CLUSTER_ID=$(curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/edge-clusters \ | jq -r --arg arg ${CLUSTER_NAME} ' .results[] | select ( .display_name == $arg ) | .id ' ) curl --request PUT -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/policy/api/v1/infra/tier-0s/t0-router/locale-services/default << EOF { "edge_cluster_path" : "/infra/sites/default/enforcement-points/default/edge-clusters/${CLUSTER_ID}", "resource_type" : "LocaleServices", "display_name" : "default" } EOF
Tier-0ゲートウェイのインターフェース作成
Tier-0にインターフェースを付与するRest API操作は以下の通りです。
CLUSTER_NAME="cluster01" CLUSTER_ID=$(curl --request GET \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/api/v1/edge-clusters \ | jq -r --arg arg ${CLUSTER_NAME} ' .results[] | select ( .display_name == $arg ) | .id ' ) curl --request PUT -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/policy/api/v1/infra/tier-0s/t0-router/locale-services/default/interfaces/external-131 << EOF { "edge_path" : "/infra/sites/default/enforcement-points/default/edge-clusters/957930cd-9ca6-4de6-a455-7e02f3df2774/edge-nodes/0", "segment_path" : "/infra/segments/external-vlan3", "type" : "EXTERNAL", "resource_type" : "Tier0Interface", "display_name" : "external-131", "subnets" : [ { "ip_addresses" : [ "192.168.3.131" ], "prefix_len" : 24 } ] } EOF curl --request PUT -d @- \ -u admin:P@ssw0rdP@ssw0rd \ --header "Content-Type:application/json" \ -k https://192.168.1.121/policy/api/v1/infra/tier-0s/t0-router/locale-services/default/interfaces/external-132 << EOF { "edge_path" : "/infra/sites/default/enforcement-points/default/edge-clusters/957930cd-9ca6-4de6-a455-7e02f3df2774/edge-nodes/1", "segment_path" : "/infra/segments/external-vlan3", "type" : "EXTERNAL", "resource_type" : "Tier0Interface", "display_name" : "external-132", "subnets" : [ { "ip_addresses" : [ "192.168.3.132" ], "prefix_len" : 24 } ] } EOF