らくがきちょう

なんとなく

Cisco ACI で TEP アドレス範囲を決める際の注意点

Cisco ACI では APIC の初期セットアップを行う際、内部的に TEP (Tunnel Endpoint) が利用するアドレス範囲を指定します。 この値は一度設定すると後で変更することは出来ません。 今回はこの「初期設定時に設定する TEP のアドレス範囲」についてメモします。

結論

TEP のアドレス範囲は以下の点に注意して設計する必要があります。

  • TEP のアドレス範囲は初期設定以降、変更出来ない
  • デフォルト値は「10.0.0.0/16」
  • サブネットの最小値は (バージョン/条件によって異なるらしいが) 概ね「/22」
  • ネットワーク全体で一意なネットワークが好ましい
    • 重複するネットワークがある場合、APIC から該当ネットワークへアクセス出来なくなってしまう
  • Multipod (マルチポッド) 構成の場合、Pod 毎に異なるアドレス範囲を用意する必要がある

サブネットの最小サイズについては Cisco APIC Getting Started Guide, Release 4.0(1) の Setup for Active and Standby APIC に以下の記載があります。

This value is for the infrastructure virtual routing and forwarding (VRF) only. This subnet should not overlap with any other routed subnets in your network. If this subnet does overlap with another subnet, change this subnet to a different /16 subnet. The minimum supported subnet for a 3 APIC cluster is /23. If you are using Release 2.0(1) the minimum is /22.

Multipod の場合は Pod 毎に異なるアドレス範囲を用意する

Cisco Application Centric Infrastructure Multipod Configuration White Paper の Configuring Cisco APIC for a Multipod setup に以下の記載があります。

In a Multipod setup, the configuration of the APIC clusters should be specific to the pod to which they belong. Because the Tunnel Endpoint (TEP) pool for each pod must be unique, each pod has its own TEP address pool. This setup enables the IPN routers between the pods to communicate.

但し、下記の記載もあるので、設定方法には注意です。

The same TEP address pool (10.111.0.0/16 in the specific example in Table 1) must be used as the initialization configuration parameter for all of the APIC nodes that are connected to the multipod fabric, independently from the specific pod to which the nodes are connected. This is because all of the APIC nodes get assigned an IP address from the TEP pool that is associated to the first pod that was brought up as part of the multipod fabric (also known as the “seed” pod).

RFC6598 の ISP Shared Address (100.64.0.0/10) を利用する案

通常はプライベートアドレスのクラス A, B, C いずれかの範囲から、適当なサイズのサブネットを割り当てれば良いと思います。 ですが、例えば「ネットワーク全体でクラス A, B, C 全て利用されており、どのアドレス範囲からアサインすべきか?迷う…」というケースであれば、RFC6598 - IANA-Reserved IPv4 Prefix for Shared Address Space で定義されている ISP Shared Address = 100.64.0.0/10 の範囲から割り当てる方法もあります。

項目
アドレス 100.64.0.0/10
サブネットマスク 255.192.0.0
ネットワークアドレス 100.64.0.0
ブロードキャストアドレス 100.127.255.255
利用可能ホスト数 4,194,302 (約 420 万)

この Shared Address は「/10」と非常に大きい為、/16 と大きく分割したとしても 64 個も利用出来ます。

番号 ネットワーク
1 100.64.0.0/16
2 100.65.0.0/16
3 100.66.0.0/16
62 100.125.0.0/16
63 100.126.0.0/16
64 100.127.0.0/16

実際に設定されている TEP アドレス範囲を確認する

スイッチ (Leaf/Spine) では TEP のアドレスは overlay-1 VRF として確認出来ますが、実際に設定されている TEP アドレス範囲を確認する方法は分かりませんでした (何か、やり方があるのかも?…)

APIC であれば acidiag avread を実行することで設定されている TEP のアドレス範囲を確認することが出来ます。

aci-apic1# acidiag avread
Local appliance ID=1 ADDRESS=10.0.0.1 TEP ADDRESS=10.0.0.0/20 ROUTABLE IP ADDRESS=0.0.0.0 CHASSIS_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

「TEP アドレス範囲」が「外部ネットワーク」と重複してしまった場合の影響

ここでは設計ミス等で「TEP アドレス範囲」が「外部ネットワーク」と重複してしまった場合の影響について考えてみます。 APIC とスイッチの各々で「TEP アドレスへの経路を管理するルーティングテーブル (VRF)」と「TEP アドレス宛通信の出力インターフェイス」は以下の通りです。

対象 ルーティングテーブル 出力インターフェイス
APIC Global Routing Table Inbound 側インターフェイス
スイッチ overlay-1 Inbound 側インターフェイス

仮に「TEP アドレス範囲」が「外部ネットワーク」と重複したとしても、スイッチの場合は「TEP アドレスは overlay-1 に従ってルーティング」、外部ネットワーク宛の通信は「そのネットワークを管理している VRF のルーティングテーブル」で個別に制御される為、問題になりません (=アドレス重複があっても、各々適切な VRF でルーティングされる為、問題無い)。

ですが、APIC は VRF 機能をサポートしない為、Global Routing Table で全ての宛先への経路が管理されます。 つまり、「TEP アドレス範囲」と「外部ネットワーク」が重複してしまうと、どちらか片方にしか通信出来ない ことになってしまいます。

aci-apic1# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         172.20.0.254    0.0.0.0         UG        0 0          0 oobmgmt
10.0.0.0        10.0.0.30       255.255.240.0   UG        0 0          0 bond0.3967
10.0.0.30       0.0.0.0         255.255.255.255 UH        0 0          0 bond0.3967
169.254.254.0   0.0.0.0         255.255.255.0   U         0 0          0 lxcbr0
        ・
        ・
        ・

ここでは「どちらか片方」と記載しましたが、実際には APIC/etc/sysconfig/network-scripts/route-bond0.???? で出力インターフェイスが設定されます。 下記は TEP アドレス範囲が 10.0.0.0/20 に設定された APIC で該当ファイルを表示した結果ですが、10.0.0.0/20 宛通信の出力デバイスが bond0.3967 に向いている = Inbound 側へ出力される、ということが分かります。 つまり「TEP アドレスと重複しているアドレス」が Outbond 側インターフェイスの先にある場合、到達出来なくなってしまいます…

aci-apic1# cat /etc/sysconfig/network-scripts/route-bond0.[0-9]*
10.0.0.30/32 dev bond0.3967 src 10.0.0.1
10.0.0.30/32 dev bond0.3967 src 10.0.0.1 table overlay
default via 10.0.0.30 dev bond0.3967 src 10.0.0.1 table overlay
10.0.0.0/20 dev bond0.3967 via 10.0.0.30 src 10.0.0.1