SONiCとWedge100BF-32Xを使ったインバンドネットワークテレメトリ(INT)によるマイクロバースト検知
インバンドネットワークテレメトリ(INT)とは?
- スイッチ:Wedge100BF-32X (P4スイッチ)
- NOS: Edgecore商用ディストリビューションのSONiC※ (以降、Edgecore SONiCと記載)
物理環境と使用したSONiC
今回の実験では、以下のようにWedge100BF-32Xを使って、Leafを2台、Spineを2台のファブリックネットワークを用意しました。
ケーブルは以下のように接続しました。INTの情報を収集し可視化するためのサーバをLeaf01に繋いでいます。INTの情報はインバンドを流れるため、INT情報可視化サーバと各Leaf/SpineスイッチはIP reachabilityが必要です。
Edgecore SONiCは202111ブランチがベースのバージョンを使いました。なお、Edgecore SONiCについては、こちらの「ダウンロードはこちら」から無償でダウンロード可能です。このEdgecore SONiCは、以下のINT XD (eXport Data) モードをサポートしています。このモードでは、各スイッチはパケットを中継する際に、対象スイッチが受信してから送信するまでに発生した遅延時間やキュー(パケットを一時的に保存するスイッチ内部のメモリ)の使用量などのテレメトリ情報を、パケットのヘッダと一緒にモニタリングシステムに転送します。このテレメトリ情報をモニタリングシステムにて可視化・分析することで、ネットワーク内の輻輳箇所や輻輳の原因となったパケットを特定し、輻輳を回避するための情報を得ることができます。
抜粋: https://p4.org/p4-spec/docs/telemetry_report_v2_0.pdf
Leaf/SpineのBGP設定
"DEVICE_METADATA": { "localhost": { "bgp_asn": "65110", "buffer_model": "traditional", "default_bgp_status": "up", "default_pfcwd_status": "disable", "hostname": "Leaf01", "hwsku": "montara", "mac": "XX:XX:XX:XX:XX:XX", "platform": "x86_64-accton_wedge100bf_32x-r0", "synchronous_mode": "enable", "type": "LeafRouter" } }, "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.1.3/32": {} }, "INTERFACE": { "Ethernet0": {}, "Ethernet0|10.0.0.1/31": {}, "Ethernet4": {}, "Ethernet4|10.0.0.5/31": {}, "Ethernet8": {}, "Ethernet12": {} }, "BGP_NEIGHBOR": { "10.0.0.0": { "asn": "65100", "holdtime": "180", "keepalive": "60", "local_addr": "10.0.0.1", "name": "Spine01", "nhopself": "0", "rrclient": "0" }, "10.0.0.4": { "asn": "65100", "holdtime": "180", "keepalive": "60", "local_addr": "10.0.0.5", "name": "Spine02", "nhopself": "0", "rrclient": "0" } },上記のconig_db.jsonでは、自分自身のASNを65110にして、ASN 65100を持つ二台のSpineとBGPのピアを張ります。LeafとSpineをそれぞれ設定し、Leaf配下のトラフィックジェネレータ間で通信を流せる状態を作っておきます。
インバンドネットワークテレメトリの設定
{ "DTEL": { "POSTCARD": { "POSTCARD": "TRUE" }, "DROP_REPORT": { "DROP_REPORT": "TRUE" }, "QUEUE_REPORT": { "QUEUE_REPORT": "TRUE" }, "SWITCH_ID": { "SWITCH_ID": "101" }, "FLOW_STATE_CLEAR_CYCLE": { "FLOW_STATE_CLEAR_CYCLE": "2" }, "LATENCY_SENSITIVITY": { "LATENCY_SENSITIVITY": "32" } }, "DTEL_INT_SESSION": { "INT_SESSION1": { "COLLECT_SWITCH_ID": "TRUE", "COLLECT_INGRESS_TIMESTAMP": "TRUE", "COLLECT_EGRESS_TIMESTAMP": "TRUE", "COLLECT_SWITCH_PORTS": "TRUE", "COLLECT_QUEUE_INFO": "TRUE", "MAX_HOP_COUNT": "8" } }, "DTEL_REPORT_SESSION": { "REPORT_SESSION1": { "SRC_IP": "10.249.39.53", "DST_IP_LIST": "10.20.1.11", "TRUNCATE_SIZE": "256", "UDP_DEST_PORT": "33333", "VRF": "default" } }, "DTEL_QUEUE_REPORT": { "Ethernet0|0": { "REPORT_TAIL_DROP": "FALSE", "QUEUE_DEPTH_THRESHOLD": "18", "QUEUE_LATENCY_THRESHOLD": "100000", "THRESHOLD_BREACH_QUOTA": "1" }, "Ethernet4|0": { "REPORT_TAIL_DROP": "FALSE", "QUEUE_DEPTH_THRESHOLD": "18", "QUEUE_LATENCY_THRESHOLD": "100000", "THRESHOLD_BREACH_QUOTA": "1" }, "Ethernet8|0": { "REPORT_TAIL_DROP": "FALSE", "QUEUE_DEPTH_THRESHOLD": "18", "QUEUE_LATENCY_THRESHOLD": "100000", "THRESHOLD_BREACH_QUOTA": "1" } }, "ACL_TABLE": { "DTEL": { "policy_desc": "DTEL", "ports": [ "Ethernet8", "Ethernet4", "Ethernet12", "Ethernet0" ], "stage": "ingress", "type": "L3" } }, "ACL_RULE": { "DTEL|RULE1": { "FLOW_OP": "POSTCARD", "DROP_REPORT_ENABLE": "TRUE", "TAIL_DROP_REPORT_ENABLE": "FALSE", "REPORT_ALL_PACKETS": "FALSE", "PRIORITY": "20", "DST_IP": "10.10.102.0/24", "SRC_IP": "10.10.101.0/24", "IP_TYPE": "IP", "IP_PROTOCOL": "17" } } }考え方としては、ACLを使って、INT対象となるパケットを限定し、ACLのアクションとしてINTを実行、という流れになります。上記の例では、ACL_RULEの"DTEL|RULE1"にて、監視対象のパケットのIPアドレスを限定しています。また、ACLルール内の設定について以下に補足します。
"FLOW_OP": "POSTCARD" | INTのモードをXD (eXport Data)に指定 |
"DROP_REPORT_ENABLE": "TRUE" | パケットの破棄が発生したときのINTレポートを有効 |
"REPORT_ALL_PACKETS": "FALSE" | 全パケットに対してINTレポートを送信しない設定(サンプリングとイベント発生時に限定) |
"QUEUE_REPORT": { "QUEUE_REPORT": "TRUE" } |
キューの使用量の監視と、閾値を超えたときのINTレポートを有効 |
"SWITCH_ID": { "SWITCH_ID": "101" }, |
各スイッチのユニークIDを指定 |
"REPORT_SESSION1": { "SRC_IP": "10.249.39.53", "DST_IP_LIST": "10.20.1.11", "TRUNCATE_SIZE": "256", "UDP_DEST_PORT": "33333", "VRF": "default" } |
|
"Ethernet0|0": { "REPORT_TAIL_DROP": "FALSE", "QUEUE_DEPTH_THRESHOLD": "18", "QUEUE_LATENCY_THRESHOLD": "100000", "THRESHOLD_BREACH_QUOTA": "1" }, |
キューの使用率の監視閾値のパラメータ(監視したいバーストトラフィックの帯域や時間によって、パラメータの調整が必要) |
インバンドネットワークテレメトリの動作確認
まとめ
今回は、Edgecore SONiCとWedge100BF-32Xを使ったINTの試験環境の構築方法と、その試験結果を共有しました。パケットロスが発生しなくても、マイクロバースト発生時に遅延の増加やキューの使用量の増加をINTによってリアルタイムに検知できることが分かりました。INTを実現するためにはデータプレーンのハードウェア中継の振る舞いを拡張する必要がありましたが、データプレーンのプログラミングが可能なP4言語が登場したおかげで、このような機能開発が可能になりました。P4であれば、INT以外の拡張も可能ですので、ご興味ありましたら当社までお問合せください。