気になるところだけつまみ読みした。よく纏っていて手元においておきたい一冊。 全体を通して KISS(Keep it simple, stupid) の重要性が主張されているように思う。
物理面
- Leaf・Spine間に複数のリンクを繋がない。ルーティングの観点から見た時、あるリンク障害となった時に別のリンクが生きていることから、障害前と同量のトラフィックが流れてきてしまう。あるリンクが障害となっていることため期待する帯域を確保できずパフォーマンスが劣化する。代わりにスイッチを増やすほうが良い。
- Spineをただの経由デバイスとして扱う。あるSpineを特殊な用途(例えば外部接続)として使ってしまうと、そのSpineにトラフィックが集中してしまう。Border LeafやExit Leafをおけば解決する。例外を排除する。単純さことが強さ。
- 3層のClosトポロジが望ましい。層の数というよりは巨大かつ高機能なスイッチを使うことが適切でない。仮にSpineスイッチに巨大なスイッチを採用することで無理やり2層のClosネットワークを構築すると、高機能なためにトラブルシュートが複雑になってしまう。LinkedInやDropboxでは、chassis-switchからfixed-form-factorスイッチへ切り替えた(要出典)。
- スイッチ障害時に即座に交換できるようスペアを用意する。わざわざサポートに交換を依頼すべきでは無い。
- ケーブルやトランシーバーにはNOSベンダでテスト済みのものを使う。
- 機能リストを比較して選定すべきでは無い。ミニマニストになるべき。
BGP周り
- 本書のASN番号の割り当てモデルに従う。
- Leaf-Spine-SuperSpineの3層構成
- Leaf-Spineの集合をPodと呼ぶ
- LeafはユニークなASN
- Pod内の全てのSpineは同一のASN(Podごとに別のASN)
- SuperSpineは同一のASN
- Unnumbered BGPを使う。
- ループバックIPアドレスが正当で、正しく広報されていることを確認する。
- マルチパスを有効にする。
- 複数のアドレスファミリーの到達性に対し、同一のeBGPセッションを使う。
- BFDを使う。
- 不正なPrefixを受け取らないようroute mapを設定する。
- Leaf以外ではルートを集約しない。
- 即時反映のためにBGPの advertisement interval timer を0秒とする。
- keepalive timerを3秒、hold timerを9秒、connect timerを10秒とする。
- 設定を最小化する。大事。
EVPN周り
- Distributed Symmetric Routingモデルを採用する。
- アンダーレイのrouted multicastを避ける。
- BUMパケットを使わない。
- 設定を最小化する。繰り返しになるが大事。
自動化まわり
- 単純なところから手をつける。ループバックIPアドレスを割り当てるなど。
- コードとデータを分ける。
- 実際に設定を適用する前にバリデーションを設ける。
- Gitを使う。
- ローリングでアップデートする。Closトポロジでは影響範囲をコントロールできる。
- 言語やツールを統一する。AnsibleとChef、RubyとPythonを混ぜない。
- Ansibleなど巨大なコミュニティを持つツールを使う。