項目一覧
Contrail でのアンダーレイ オーバーレイ マッピング
概要:Contrail Analytics を使用したアンダーレイ オーバーレイ マッピング
このトピックは、Contrail Networking リリース 2005 以前に適用されます。Contrail Networking リリース 2008 以降では、パケットがネットワーク内でたどるパスを表示できるようになりました。 トポロジービューでのパケットパスの表示を参照してください。
今日のクラウドデータセンターは、相互接続されたサーバーの大規模な集合体で構成されており、さまざまなアプリケーションを実行するためのコンピューティング能力とストレージ容量を提供します。サーバーは冗長TORスイッチで接続され、TORスイッチはスパインルーターに接続されます。クラウド展開は通常、複数のテナントによって共有され、通常、各テナントには複数の分離されたネットワークが必要です。複数の孤立したネットワークは、アンダーレイまたは物理接続上にトンネル(gre、ip-in-ip、mac-in-macなど)を形成することによって作成されるオーバーレイネットワークによって提供できます。
データがオーバーレイネットワーク内を流れると、Contrail はアンダーレイ ネットワーク内のトラフィックの統計情報を提供し、可視化できます。
Contrail でアンダーレイ オーバーレイ分析を利用可能
Contrail では、Contrail Web ユーザ インターフェイスで、アンダーレイ トラフィックとオーバーレイ トラフィックに関連するさまざまな分析を表示できます。以下は、オーバーレイ アンダーレイ トラフィックの統計と可視化のために Contrail が提供する分析の一部です。
アンダーレイ ネットワークのトポロジーを表示します。
物理アンダーレイ ネットワークのユーザー インターフェイス ビューで、接続されているサーバー(Contrail Compute)とサーバー上の仮想マシンを表示します。
トポロジー内の任意の要素の詳細を表示します。
2 つの要素間の pRouter、vRouter、または仮想マシン リンクの詳細を表示できます。また、選択した要素に対応するグラフィカルビューでトラフィック統計を表示することもできます。
オーバーレイ フローのアンダーレイ パスを表示します。
オーバーレイ フローを指定すると、そのフローに使用されるアンダーレイ パスを取得し、トポロジ ビューでパスをマッピングできます。
アーキテクチャとデータ収集
オーバーレイ フローをアンダーレイ パスにマッピングするためのデータの蓄積は、Contrail モジュール間で複数の手順で実行されます。
以下は、重要な手順の概要です。
アンダーレイ オーバーレイ マッピングの新しいプロセス/サービス
contrail-snmp-collector
と contrail-topology
は、どちらも contrail-analytics
ノードに追加される新しいデーモンです。contrail-analytics
パッケージには、これらの新機能とその関連ファイルが含まれています。contrail-status に新しいサービスが表示されます。
例:contrail-status
次に、 contrail-status
を使用して、アンダーレイ オーバーレイ マッピングの新しいプロセスとサービスのステータスを表示する例を示します。
user@host:~# contrail-status == Contrail Control == supervisor-control: active contrail-control active … == Contrail Analytics == supervisor-analytics: active … contrail-query-engine active contrail-snmp-collector active contrail-topology active
例:サービス コマンド
service
コマンドを使用して、新しいサービスを開始、停止、および再起動できます。次の例を参照してください。
user@host:~# service contrail-snmp-collector status contrail-snmp-collector RUNNING pid 12179, uptime 1 day, 14:59:11
アンダーレイ オーバーレイ マッピングのための外部インターフェイス設定
このセクションでは、Contrail 分析でアンダーレイ オーバーレイ マッピングを成功させるために必要な外部インターフェースの設定について説明します。
物理トポロジー
一般的な物理トポロジーには、次のようなものがあります。
ToR スイッチに接続されたサーバー。
スパインスイッチに接続されたToRスイッチ。
コアスイッチに接続されたスパインスイッチ。
次に、トポロジーが Contrail WebUI 分析でどのように表示されるかの例を示します。
SNMP 設定
contrail-snmp-collector
がSNMPデータを読み取れるように、物理デバイスにSNMPを設定します。
以下に、ジュニパーネットワークス デバイスからの SNMP 設定例を示します。
set snmp community public authorization read-only
Link Layer Discovery Protocol(LLDP)の設定
contrail-snmp-collector
がルーターのネイバー情報を読み取れるように、物理デバイスにLLDPを設定します。
次に、ジュニパーネットワークスデバイスでのLLDP設定の例を示します。
set protocols lldp interface all
set protocols lldp-med interface all
IPFIX と sFlow の設定
フローサンプルは、物理デバイスによって contrail-collector
に送信されます。 contrail-collector
はフロー サンプルを受信するための sFlow プロトコルと IPFIX プロトコルをサポートしているため、MXシリーズ デバイスや ToR スイッチなどの物理デバイスは、これらのプロトコルのいずれかを使用してサンプルを送信するように設定する必要があります。
例:sFlow 設定
次に、sFlow の構成例を示します。サンプルでは、IP 変数 <source ip>は、sflow 送信元として機能するデバイスに到達可能なループバックまたは IP を指し、もう 1 つの IP 変数 <collector_IP_data> はコレクター デバイスのアドレスです。
root@host> show configuration protocols sflow | display set set protocols sflow polling-interval 0 set protocols sflow sample-rate ingress 10 set protocols sflow source-ip <source ip>4 set protocols sflow collector <collector_IP_data> udp-port 6343 set protocols sflow interfaces ge-0/0/0.0 set protocols sflow interfaces ge-0/0/1.0 set protocols sflow interfaces ge-0/0/2.0 set protocols sflow interfaces ge-0/0/3.0 set protocols sflow interfaces ge-0/0/4.0
例:IPFIX の設定
以下は、ジュニパーネットワークスデバイスからのIPFIX設定の例です。IP アドレス変数 <ip_sflow collector> は sflow コレクター(制御コレクター分析ノード)を表し、 <source ip> はコレクターにフローデータを送信するために使用されるルーター/スイッチ デバイス上の送信元(発信)インターフェイスを表します。Contrail クラスタから到達可能な場合は、lo0 アドレスにすることもできます。
root@host> show configuration chassis | display set set chassis tfeb slot 0 sampling-instance sample-ins1 set chassis network-services root@host> show configuration chassis tfeb | display set set chassis tfeb slot 0 sampling-instance sample-ins1 root@host > show configuration services flow-monitoring | display set set services flow-monitoring version-ipfix template t1 flow-active-timeout 30 set services flow-monitoring version-ipfix template t1 flow-inactive-timeout 30 set services flow-monitoring version-ipfix template t1 template-refresh-rate packets 10 set services flow-monitoring version-ipfix template t1 ipv4-template root@host > show configuration interfaces | display set | match sampling set interfaces ge-1/0/0 unit 0 family inet sampling input set interfaces ge-1/0/1 unit 0 family inet sampling input root@host> show configuration forwarding-options sampling | display set set forwarding-options sampling instance sample-ins1 input rate 1 set forwarding-options sampling instance sample-ins1 family inet output flow-server <ip_sflow collector> port 4739 set forwarding-options sampling instance sample-ins1 family inet output flow-server <ip_sflow collector> version-ipfix template t1 set forwarding-options sampling instance sample-ins1 family inet output inline-jflow source-address <source ip>
Contrail の SNMP コレクターへの pRouter 情報の送信
完全な分析情報を読み取って表示するには、物理デバイスに関する情報をSNMPコレクターに送信する必要があります。通常、pRouter 情報は contrail-config
から取得されます。
contrail-configからpRouter情報を取得するSNMPコレクター
物理ルーターを contrail-config
に追加するには、Contrailのユーザーインターフェイスを使用するか、直接API、プロビジョニングなどのスクリプトを使用します。設定が contrail-config
に入ると、 contrail-snmp-collector
は contrail-config
から物理ルーター情報を取得します。SNMP コレクターは、このリストとその他の設定パラメーターを使用して、SNMP クエリを実行し、pRouter UVE に入力します。
pRouter UVE
pRouter UVE には、次の形式の URL を使用して、 contrail-analytics-api
からシステムの REST API からアクセスします。
http://<host ip>:8081/analytics/uves/prouters
以下は、pRouter REST API からの出力例です。
pRouter UVE の詳細は、次の形式の URL を使用して、システムから取得できます。
http://<host ip>:8081/analytics/uves/prouter/a7-ex3?flat
以下は、pRouter UVE の出力例です。
アンダーレイ オーバーレイ分析用の Contrail ユーザー インターフェイス
トポロジー ビューと関連機能には、Contrail Web ユーザー インターフェイスの [ Monitor > Physical Topology] からアクセスします。
Web UI での物理トポロジーの有効化
Contrail Web UI で [Physical Topology ] セクションを有効にするには、次の手順を実行します。
仮想マシン レベルでのトポロジの表示
Contrail のユーザー インターフェイスでは、表示されたトポロジーを仮想マシン レベルまでドリルダウンできます。次の図は、a7s36 vRouter でインスタンス化された仮想マシンと、それぞれに関連する完全な物理トポロジーを示しています。
任意のリンクのトラフィックの表示
[ Monitor > Physical Topology] で、トポロジー上の任意のリンクをダブルクリックすると、そのリンクのトラフィック統計グラフが表示されます。次に例を示します。
トレース フロー
[ Trace Flows ] タブをクリックして、アクティブなフローのリストを表示します。フローのパスを表示するには、アクティブなフローリストでフローをクリックし、[ フローをトレース] ボタンをクリックします。選択したフローがアンダーレイでたどったパスが表示されます。次に例を示します。
トレース フロー機能の制限
トレース フロー機能は、ip traceroute を使用してフローに関与する 2 つの vRouter 間のパスを決定するため、パス内のレイヤ 2 ルータがリストされていないため、トポロジに表示されないなど、ip トレースルートと同じ制限があります。
検索フローとマップ フロー
「 フローの検索」 タブをクリックして検索ダイアログを開き、「 検索 」ボタンをクリックして検索条件に一致するフローをリストします。リストからフローを選択して [フローのマップ(Map Flow )] をクリックすると、トポロジ内の選択したフローがたどるアンダーレイ パスが表示されます。次に例を示します。
オーバーレイからアンダーレイへのフローマップスキーマ
オーバーレイ フローのアンダーレイ マッピング情報を照会するスキーマは、次の形式の URL を使用してシステム上でアクセスできる REST API から取得されます。
http://<host ip>:8081/analytics/table/OverlayToUnderlayFlowMap/schema
例:オーバーレイからアンダーレイへのフローマップスキーマ
{"type": "FLOW", "columns": [ {"datatype": "string", "index": true, "name": "o_svn", "select": false, "suffixes": ["o_sip"]}, {"datatype": "string", "index": false, "name": "o_sip", "select": false, "suffixes": null}, {"datatype": "string", "index": true, "name": "o_dvn", "select": false, "suffixes": ["o_dip"]}, {"datatype": "string", "index": false, "name": "o_dip", "select": false, "suffixes": null}, {"datatype": "int", "index": false, "name": "o_sport", "select": false, "suffixes": null}, {"datatype": "int", "index": false, "name": "o_dport", "select": false, "suffixes": null}, {"datatype": "int", "index": true, "name": "o_protocol", "select": false, "suffixes": ["o_sport", "o_dport"]}, {"datatype": "string", "index": true, "name": "o_vrouter", "select": false, "suffixes": null}, {"datatype": "string", "index": false, "name": "u_prouter", "select": null, "suffixes": null}, {"datatype": "int", "index": false, "name": "u_pifindex", "select": null, "suffixes": null}, {"datatype": "int", "index": false, "name": "u_vlan", "select": null, "suffixes": null}, {"datatype": "string", "index": false, "name": "u_sip", "select": null, "suffixes": null}, {"datatype": "string", "index": false, "name": "u_dip", "select": null, "suffixes": null}, {"datatype": "int", "index": false, "name": "u_sport", "select": null, "suffixes": null}, {"datatype": "int", "index": false, "name": "u_dport", "select": null, "suffixes": null}, {"datatype": "int", "index": false, "name": "u_protocol", "select": null, "suffixes": null}, {"datatype": "string", "index": false, "name": "u_flowtype", "select": null, "suffixes": null}, {"datatype": "string", "index": false, "name": "u_otherinfo", "select": null, "suffixes": null}]}
pRouter 間のアンダーレイ データのスキーマは、次の場所にある Contrail インストールで定義されています。
http://<host ip>:8081/analytics/table/StatTable.UFlowData.flow/schema
例:アンダーレイのフロー データ スキーマ
{"type": "STAT", "columns": [ {"datatype": "string", "index": true, "name": "Source", "suffixes": null}, {"datatype": "int", "index": false, "name": "T", "suffixes": null}, {"datatype": "int", "index": false, "name": "CLASS(T)", "suffixes": null}, {"datatype": "int", "index": false, "name": "T=", "suffixes": null}, {"datatype": "int", "index": false, "name": "CLASS(T=)", "suffixes": null}, {"datatype": "uuid", "index": false, "name": "UUID", "suffixes": null}, {"datatype": "int", "index": false, "name": "COUNT(flow)", "suffixes": null}, {"datatype": "string", "index": true, "name": "name", "suffixes": ["flow.pifindex"]}, {"datatype": "int", "index": false, "name": "flow.pifindex", "suffixes": null}, {"datatype": "int", "index": false, "name": "SUM(flow.pifindex)", "suffixes": null}, {"datatype": "int", "index": false, "name": "CLASS(flow.pifindex)", "suffixes": null}, {"datatype": "int", "index": false, "name": "flow.sport", "suffixes": null}, {"datatype": "int", "index": false, "name": "SUM(flow.sport)", "suffixes": null}, {"datatype": "int", "index": false, "name": "CLASS(flow.sport)", "suffixes": null}, {"datatype": "int", "index": false, "name": "flow.dport", "suffixes": null}, {"datatype": "int", "index": false, "name": "SUM(flow.dport)", "suffixes": null}, {"datatype": "int", "index": false, "name": "CLASS(flow.dport)", "suffixes": null}, {"datatype": "int", "index": true, "name": "flow.protocol", "suffixes": ["flow.sport", "flow.dport"]}, {"datatype": "int", "index": false, "name": "SUM(flow.protocol)", "suffixes": null}, {"datatype": "int", "index": false, "name": "CLASS(flow.protocol)", "suffixes": null}, {"datatype": "string", "index": true, "name": "flow.sip", "suffixes": null}, {"datatype": "string", "index": true, "name": "flow.dip", "suffixes": null}, {"datatype": "string", "index": true, "name": "flow.vlan", "suffixes": null}, {"datatype": "string", "index": false, "name": "flow.flowtype", "suffixes": null}, {"datatype": "string", "index": false, "name": "flow.otherinfo", "suffixes": null}]}
例:フローマップの一般的なクエリ
以下は、一般的なクエリです。内部的には、 analytics-api
は FlowRecordTable
に対してクエリを実行し、次に StatTable.UFlowData.flow
に対してクエリを実行して、特定のオーバーレイ フローで取得されたアンダーレイ パスを示す (prouter, pifindex)
ペアのリストを返します。
FROM OverlayToUnderlayFlowMap SELECT prouter, pifindex WHERE o_svn, o_sip, o_dvn, o_dip, o_sport, o_dport, o_protocol = <overlay flow>
オーバーレイ アンダーレイ マッピングのモジュール操作
SNMP コレクタの動作
Contrail SNMP コレクターは、Net-SNMP ライブラリを使用して、物理ルーターまたは任意の SNMP エージェントと通信します。SNMP パケットを受信すると、データは Python 辞書に変換され、対応する UVE オブジェクトが作成されます。その後、UVE オブジェクトは SNMP コレクターにポストされます。
SNMP モジュールは、設定可能な期間スリープした後、コレクター プロセスをフォークし、プロセスが完了するのを待ちます。コレクター プロセスは、照会するデバイスのリストを調べます。デバイスごとに、グリーンレット タスク(Python コルーチン)をフォークし、SNMP データを蓄積し、概要を JSON ファイルに書き込み、終了します。その後、親プロセスは JSON ファイルを読み取り、UVE を作成し、UVE をコレクターに送信し、再びスリープ状態になります。
SNMP コレクターから送信される pRouter UVE は、未加工の MIB 情報のみを伝送します。
例:pRouter UVE で伝送される pRouter エントリ
以下の定義は、pRouterUVE
で運ばれるpRouterEntry
を示しています。さらに、LldpTable
定義の例を示します。
以下では、以下で定義される仮想テーブルを作成します。
http://<host ip>:8081/analytics/table/StatTable.UFlowData.flow/schema struct LldpTable { 1: LldpLocalSystemData lldpLocalSystemData 2: optional list<LldpRemoteSystemsData> lldpRemoteSystemsData } struct PRouterEntry { 1: string name (key="ObjectPRouter") 2: optional bool deleted 3: optional LldpTable lldpTable 4: optional list<ArpTable> arpTable 5: optional list<IfTable> ifTable 6: optional list<IfXTable> ifXTable 7: optional list<IfStats> ifStats (tags="name:.ifIndex") 8: optional list<IpMib> ipMib } uve sandesh PRouterUVE { 1: PRouterEntry data }
トポロジ モジュールの動作
トポロジ モジュールは、SNMP コレクターによってポストされた UVE を読み取り、ネイバー テーブルを計算して、リモート システム名、ローカルおよびリモート インターフェイス名、リモート タイプ(pRouter または vRouter)、およびローカルおよびリモート ifindices をテーブルに入力します。トポロジ モジュールはしばらくスリープし、UVE を読み取り、ネイバー テーブルを計算して UVE をコレクターにポストします。
トポロジ モジュールによって送信される pRouter UVE はネイバー リストを伝送するため、クライアントはすべての pRouter ネイバー リストをまとめて完全なトポロジを計算できます。
対応する pRouter UVE の定義は次のとおりです。
struct LinkEntry { 1: string remote_system_name 2: string local_interface_name 3: string remote_interface_name 4: RemoteType type 5: i32 local_interface_index 6: i32 remote_interface_index } struct PRouterLinkEntry { 1: string name (key="ObjectPRouter") 2: optional bool deleted 3: optional list<LinkEntry> link_table } uve sandesh PRouterLinkUVE { 1: PRouterLinkEntry data }
IPFIX および sFlow コレクタの動作
IPFIX および sFlow コレクタが Contrail コレクタに実装されました。コレクターは IPFIX と sFlow のサンプルを受信し、分析データベースに統計サンプルとして保存します。
例:IPFIX sFlow コレクタ データ
次の定義は、統計サンプルに格納されるデータと、クエリの実行に使用できるインデックスを示しています。
struct UFlowSample { 1: u64 pifindex 2: string sip 3: string dip 4: u16 sport 5: u16 dport 6: u16 protocol 7: u16 vlan 8: string flowtype 9: string otherinfo } struct UFlowData { 1: string name (key="ObjectPRouterIP") 2: optional bool deleted 3: optional list<UFlowSample> flow (tags="name:.pifindex, .sip, .dip, .protocol:.sport, .protocol:.dport, .vlan") }
アンダーレイ オーバーレイ マッピングのトラブルシューティング
このセクションには、アンダーレイ オーバーレイ マッピングで発生する可能性のあるエラーを調査できるさまざまなリンクがあります。
システムログ
contrail-snmp-collector
とcontrail-topology
のログは、インストール済みの Contrail システムでは次の場所にあります。
/var/log/contrail/contrail-snmp-collector-stdout.log
/var/log/contrail/contrail-topology.log
Introspectユーティリティ
Contrail システムで次の形式の URL を使用して、SNMP データおよびトポロジ データの Introspect ユーティリティにアクセスします。
SNMP データ イントロスペクト
http://<host ip>:5920/Snh_SandeshUVECacheReq?x=PRouterEntry
トポロジーデータのイントロスペクト
http://<host ip>:5921/Snh_SandeshUVECacheReq?x=PRouterLinkEntry
pRouter オブジェクトを追加するスクリプト
pRouter オブジェクトを contrail-config
に追加する通常のメカニズムは、Contrail UI を使用することです。ただし、Contrail vnc-api
を使用してこれらのオブジェクトを追加することもできます。pRouter を 1 つ追加するには、ファイルを cfg-snmp.py
という名前で保存し、次に示すように コマンドを実行します。
python cfg-snmp.py
例: cfg-snmp.py のコンテンツ
#!python from vnc_api import vnc_api from vnc_api.gen.resource_xsd import SNMPCredentials vnc = vnc_api.VncApi('admin', 'abcde123', 'admin') apr = vnc_api.gen.resource_client.PhysicalRouter(name='a7-mx80-1') apr.set_physical_router_management_ip('ip_address') apr.set_physical_router_dataplane_ip(''ip_address') apr.set_physical_router_snmp_credentials(SNMPCredentials(version=2, v2_community='public')) vnc.physical_router_create(apr) #$ABC123 apr = vnc_api.gen.resource_client.PhysicalRouter(name='a7-mx80-2') apr.set_physical_router_management_ip('ip_address') apr.set_physical_router_dataplane_ip('ip_address') apr.set_physical_router_snmp_credentials(SNMPCredentials(version=2, v2_community='public')) vnc.physical_router_create(apr) #$ABC123' apr = vnc_api.gen.resource_client.PhysicalRouter(name='a7-ex3') apr.set_physical_router_management_ip('source_ip') apr.set_physical_router_dataplane_ip('source_ip'') apr.set_physical_router_snmp_credentials(SNMPCredentials(version=2, v2_community='public')) vnc.physical_router_create(apr) #$ABC123' apr = vnc_api.gen.resource_client.PhysicalRouter(name='a7-ex2') apr.set_physical_router_management_ip('ip_address') apr.set_physical_router_dataplane_ip('ip_address') apr.set_physical_router_snmp_credentials(SNMPCredentials(version=2, v2_community='public')) vnc.physical_router_create(apr) #$ABC123'