Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cisco Catalyst 8000V (AWS版)の冗長化 ~ csr_aws_ha 実装の挙動整理 ~

Cisco Catalyst 8000V (AWS版)の冗長化 ~ csr_aws_ha 実装の挙動整理 ~

MyHomeNWLab

March 26, 2023
Tweet

More Decks by MyHomeNWLab

Other Decks in Technology

Transcript

  1. 概要 • Amazon Web Services (AWS)版のCisco Catalyst 8000Vでの 冗長化には csr_aws_ha

    のPythonパッケージを用いたスクリプト ベー スの実装方法が存在します。 • オンプレミス環境で幅広く使われているVRRPやHSRPのようなFHRP (First Hop Redundancy Protocol)と異なり、挙動がスクリプトの 実装に依存してしまうため、設定方法や挙動を整理しました。
  2. 検証時のCatalyst 8000Vの情報 • Product: Cisco Catalyst 8000V Edge Software –

    BYOL • URL: https://aws.amazon.com/marketplace/pp/prodview- rohvq2cjd4ccg • Catalyst 8000V Version: 17.09.01a
  3. 検証時の構成 • Public SubnetとPrivate Subnetを用意して、Private SubnetのServer からInternetへの通信はCatalyst 8000Vを通る構成としました。 • ServerからInternet側へ抜けるにあたってのFirst

    HopはCatalyst 8000V となります。そのため、LAN to WANのInternet宛通信に対してNexthopの 冗長化が必要となる構成になっています。 • 「Catalyst 8000VのIPsecトンネルを経由して拠点と通信」するような通信フ ローの検証までは行っておらず、本資料でも取り扱っていない点は留意してくだ さい。
  4. 冗長化の構成要素 • Catalyst 8000V同士 (PrimaryとSecondary)でトンネリング (IPsec or VXLAN)を行い、動的ルーティング (OSPF or

    EIGRP or BGP)で互いのLoopbackのアドレス情報を共有し、 BFDで対向インス タンスの障害を検知します。 • 障害を検知するとAWSのRoute tableの設定を書き換えます。 • トンネリングと動的ルーティングのプロトコル選定には選択余地がありますが、 いずれのプロトコルを選択しても根本的な動作は変わりません。
  5. AWS Virtual Private Cloud (VPC) Availability Zone 1 Public Subnet

    Private Subnet EC2 Catalyst 8000V #1 EC2 Server #1 Internet Gateway Availability Zone 2 Public Subnet Private Subnet EC2 Catalyst 8000V #2 EC2 Server #2 Internet Gi1 (Source NAT実行) Gi2 Gi1 (Source NAT実行) Gi2 Destination Target 172.31.0.0/16 Local 0.0.0.0/0 eni-**01 (Catalyst 8000V #1 Gi2) ⇒ eni-**02 (Catalyst 8000V #2 Gi2) 【Route table: rt-private】 インスタンス 障害 BFDで障害検知して Targetを書き換え 概要図 Tunnel BFD & 動的ルーティング Fail インスタンスには IAM Role/Policy で権限設定が必要 経路切替 IAM Role IAM Role
  6. AWS Virtual Private Cloud (VPC) Availability Zone 1 Public Subnet

    Private Subnet EC2 Catalyst 8000V #1 EC2 Server #1 Internet Gateway Availability Zone 2 Public Subnet Private Subnet EC2 Catalyst 8000V #2 EC2 Server #2 Internet Gi1 (Source NAT実行) Gi2 Gi1 (Source NAT実行) Gi2 Destination Target 172.31.0.0/16 Local 0.0.0.0/0 eni-**01 (Catalyst 8000V #1 Gi2) 【Route table: rt-private】 正常時 Tunnel BFD & 動的ルーティング IAM Role IAM Role
  7. AWS Virtual Private Cloud (VPC) Availability Zone 1 Public Subnet

    Private Subnet EC2 Catalyst 8000V #1 EC2 Server #1 Internet Gateway Availability Zone 2 Public Subnet Private Subnet EC2 Catalyst 8000V #2 EC2 Server #2 Internet Gi1 (Source NAT実行) Gi2 Gi1 (Source NAT実行) Gi2 Destination Target 172.31.0.0/16 Local 0.0.0.0/0 eni-**01 (Catalyst 8000V #1 Gi2) ⇒ eni-**02 (Catalyst 8000V #2 Gi2) 【Route table: rt-private】 インスタンス 障害 BFDで障害検知して Targetを書き換え 障害時 Tunnel BFD & 動的ルーティング Fail インスタンスには IAM Role/Policy で権限設定が必要 経路切替 IAM Role IAM Role
  8. AWS Virtual Private Cloud (VPC) Availability Zone 1 Public Subnet

    Private Subnet EC2 Catalyst 8000V #1 EC2 Server #1 Internet Gateway Availability Zone 2 Public Subnet Private Subnet EC2 Catalyst 8000V #2 EC2 Server #2 Internet Gi1 (Source NAT実行) Gi2 Gi1 (Source NAT実行) Gi2 Destination Target 172.31.0.0/16 Local 0.0.0.0/0 eni-**01 (Catalyst 8000V #1 Gi2) ⇐ eni-**02 (Catalyst 8000V #2 Gi2) 【Route table: rt-private】 5分刻みのタイミングで 切り戻し 障害復旧時の切り戻り Tunnel BFD & 動的ルーティング 切り戻し IAM Role IAM Role 復旧
  9. 冗長化スクリプトの概要 • Catalyst 8000Vの冗長化スクリプトはCloud Providerによって種別 が分かれており、AWS環境では csr_aws_ha を用います。 • 名称に「csr」が含まれているのは、

    CSR1000V世代から存在する名残 だと思われます。 Cloud Provider Package Name Microsoft Azure csr_azure_ha Amazon Web Services csr_aws_ha Google Cloud Platform csr_gcp_ha ← 本資料での取り扱い対象
  10. csr_aws_ha の実装 • csr_aws_ha はPythonのパッケージとして提供されており、IOS-XEの Guestshell上で実行されます。 • Catalyst 8000VのEC2インスタンスからAWSのRoute tableの切り替

    えを行うためにIAMで必要な権限を割り当てる必要があります。 • 設定を行うためのUser InterfaceとしてPythonベースのコマンドが提供 されており、その中でも主要なものが create_node.py コマンドになりま す。
  11. Catalyst 8000V (AWS版)の冗長化スクリプトの動作 C8000V#1 (AWS版) guestshell csr_ha.service 【IAM Policy】 {

    "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "cloudwatch:", "s3:", "ec2:AssociateRouteTable", "ec2:CreateRoute", "ec2:CreateRouteTable", "ec2:DeleteRoute", "ec2:DeleteRouteTable", "ec2:DescribeRouteTables", "ec2:DescribeVpcs", "ec2:ReplaceRoute", "ec2:DescribeRegions", "ec2:DescribeNetworkInterfaces", "ec2:DisassociateRouteTable", "ec2:ReplaceRouteTableAssociation", "logs:CreateLogGroup", "logs:PutLogEvents" ], "Resource": "*" } ] } Destination Target 192.168.0.0/16 eni-**01 (C8000V#1) ⇒ eni-**02 (C8000V#2) 172.31.0/16 local C8000V#2 (AWS版) guestshell csr_ha.service インスタンス 障害 【Route table: rt-private】 Tunnel Interface上で BFDと動的ルーティングを動作させて障害を検知 障害検知時に Route tableのTargetを書き換え 必要な権限 (IAM Policy)
  12. ~/.bashrc に設定される csr_aws_ha 向けのエイリアス [guestshell@guestshell ~]$ cat ~/.bashrc # User

    specific aliases and functions alias create_node=create_node.py alias show_node=show_node.py alias node_event=node_event.py alias set_params=set_params.py alias clear_params=clear_params.py alias delete_node=delete_node.py export PATH=/home/guestshell/.local/bin:/home/guestshell/.local/lib/python3.6/site- packages/csr_ha:/home/guestshell/.local/lib/python3.6/site-packages/csr_cloud:$PATH [guestshell@guestshell ~]$ 出力を一部省略 csr_aws_ha に含まれている各種スクリプトに対するエイリアスやPATHが設定されます。
  13. csr_aws_ha に含まれる主要コマンド [guestshell@guestshell ~]$ ls ~/.local/bin/ __pycache__ create_node.py ha_api.py node_event.py

    rst2html.py rst2latex.py rst2odt_prepstyles.py rst2xetex.py set_params.py chardetect delete_node.py ha_tools.sh pasteurize rst2html4.py rst2man.py rst2pseudoxml.py rst2xml.py show_node.py clear_params.py futurize jp.py revert_nodes.sh rst2html5.py rst2odt.py rst2s5.py rstpep2html.py [guestshell@guestshell ~]$ ~/.bashrc に設定されるエイリアスのコマンドは ~/.local/bin/ 配下に存在します。
  14. create_node.py コマンドの概要 • 前提情報として csr_aws_ha の設定用語として Node あるいは Node Index

    と呼ばれるキーワードがあります。 • 複数のRouteに対する設定が行えるので、設定対象を一意に識別するために Node Indexを利用します。設定時にNode Index (1から1023まで)を指 定して、設定情報のレコードを格納するイメージになります。1号機と2号機の 両方で設定が必要になります。 • primary と secondary のModeはRouteに対して適用します。そのため、 複数のRouteでModeを分けて通信の負荷分散も可能です。ただし、運用性 を考慮して設定してください。
  15. create_node.py コマンドの実行例 Command Node Index Region Name Route Table Name

    Route Nex Hop Interface Mode create_node.py -i 1 -rg ap-northeast-1 -t rtb-1234 -r 0.0.0.0/0 -n eni-0001 -m primary create_node.py -i 2 -rg ap-northeast-1 -t rtb-1234 -r 8.8.8.8/32 -n eni-0001 -m secondary create_node.py -i 3 -rg ap-northeast-1 -t rtb-1234 -r 8.8.4.4/0 -n eni-0001 -m secondary 【Catalyst 8000V #1】 Command Node Index Region Name Route Table Name Route Nex Hop Interface Mode create_node.py -i 1 -rg ap-northeast-1 -t rtb-1234 -r 0.0.0.0/0 -n eni-0002 -m secondary create_node.py -i 2 -rg ap-northeast-1 -t rtb-1234 -r 8.8.8.8/32 -n eni-0002 -m primary create_node.py -i 3 -rg ap-northeast-1 -t rtb-1234 -r 8.8.4.4/0 -n eni-0002 -m primary 【Catalyst 8000V #2】 固有情報を指定 Route 毎に primary と secondary を分けると通信の負荷分散が可能 ↓
  16. show_node.py -i all [guestshell@guestshell ~]$ show_node.py -i all 200: Retrieved

    the node successfully Redundancy node configuration: index 1 region ap-northeast-1 routeTableId rtb-**** eniId eni-**** route 0.0.0.0/0 mode primary Redundancy node configuration: index 2 region ap-northeast-1 routeTableId rtb-**** eniId eni-**** route 8.8.8.8/32 mode secondary <snip> 「show_node.py」で「-i all」をオプションに指定すると、 全てのNode Indexの情報が出力されます。 対象のNode Indexを絞りたい場合は「-i 1」のように Node Indexの対象番号を引数に渡します。
  17. csr_aws_ha のNode情報の定義ファイル [guestshell@guestshell ~]$ tree ~/cloud /home/guestshell/cloud `-- HA |--

    csr_ha.log |-- debug_ha.sh |-- events |-- ha_tools.sh |-- install.log |-- node_file |-- revert_nodes.sh `-- sock_file 2 directories, 7 files [guestshell@guestshell ~]$ 備考: “sudo yum install tree” コマンドで “tree” コマンドをインストールして確認しています。 create_node.py で設定した内容が格納されます。 [guestshell@guestshell ~]$ cat ~/cloud/HA/node_file {'index': '1', 'routeTableId': 'rtb-****', 'region': 'ap-northeast-1', 'eniId': 'eni-****', 'route': '0.0.0.0/0', 'mode': 'primary'} [guestshell@guestshell ~]$
  18. csr_ha のサービス [guestshell@guestshell ~]$ systemctl status csr_ha • csr_ha.service -

    CSR High Availability service Loaded: loaded (/etc/systemd/user/csr_ha.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-23 11:37:29 UTC; 40min ago Main PID: 222 (python3) CGroup: /system.slice/libvirtd.service/system.slice/csr_ha.service tq222 /usr/bin/python3 /home/guestshell/.local/lib/python3.6/site- packages/csr_ha/server/ha_server.py start mq227 /usr/bin/python3 /home/guestshell/.local/lib/python3.6/site- packages/csr_ha/server/ha_server.py start [guestshell@guestshell ~]$ csr_aws_ha はサービスとして動作しています。
  19. Primary復旧時の切り戻し処理 • Primaryのインスタンスが復旧すると、一定間隔で自動切り戻しの処理が走り ます。いわゆるPreempt動作になります。 • cron による revert_nodes.sh コマンドの定期実行に依存しているため、 手動切り戻しの実装には変えられません。

    • 内部的には「node_event.py -i all -e revert」を実行しており、全ての Node Indexを対象にrevertのイベントを実行します。 • 補足ですが node_event.py コマンドは引数に与えるイベント種別で動作が変わります。
  20. Primary復旧時の切り戻し処理の実装面 [guestshell@guestshell ~]$ crontab -l */5 * * * *

    bash /home/guestshell/.local/lib/python3.6/site-packages/csr_ha/client_api/revert_nodes.sh [guestshell@guestshell ~]$ crontabで5分刻みで revert_nodes.sh のスクリプトが呼び出される処理となっており、 本スクリプトによってPrimary機の復旧時には自動的に切り戻し処理が実行されます。 ※備考: HH:00, HH:05, HH:10, HH:15, HH:20, ..., HH:50, HH:55 の間隔で実行されます。
  21. node_event.py コマンドの情報源 • revert_nodes.sh コマンドから呼び出されている node_event.py コマンドの情報は CSR1000V時代であればドキュメントに記載があります。 • Configure

    CSR1000v HA Version 3 on AWS, Azure and GCP - Cisco • URL: https://www.cisco.com/c/en/us/support/docs/routers/cloud- services-router-1000v-series/217051-configure-csr1000v-ha-version-3- on-aws.html • CSR1000v HA Version 2 Configuration Guide on Microsoft Azure - Cisco • URL: https://www.cisco.com/c/en/us/support/docs/routers/cloud- services-router-1000v-series/213930-csr1000v-hav2-configuration- guide-on-mic.html
  22. IOS-XEの設定 (startup/running-config) • IOS-XEの設定はトンネリング (IPsec or VXLAN)と動的ルーティング (OSPF or EIGRP

    or BGP)には設計の選択肢があります。手早く検証 して挙動を把握するのであればドキュメントの設定例が参考になります。 • EC2インスタンスへのIPアドレスの割り当て制御はAWS基盤が制御を 握っているため、トンネリングやBFD Peerで対向へのIPアドレスを指定す る際はマッピングを間違えないように注意してください。
  23. IPアドレス設定のマッピング Catalyst 8000V #1 Catalyst 8000V #2 redundancy cloud-ha bfd

    peer 192.168.101.2 all ! interface Tunnel1 ip address 192.168.101.1 255.255.255.252 load-interval 30 bfd interval 100 min_rx 100 multiplier 3 tunnel source GigabitEthernet1 tunnel mode ipsec ipv4 tunnel destination 18.178.#.# tunnel protection ipsec profile vti-1 ! redundancy cloud-ha bfd peer 192.168.101.1 all ! interface Tunnel1 ip address 192.168.101.2 255.255.255.252 load-interval 30 bfd interval 100 min_rx 100 multiplier 3 tunnel source GigabitEthernet1 tunnel mode ipsec ipv4 tunnel destination 52.192.#.# tunnel protection ipsec profile vti-1 ! Gi1はDHCPでElastic IP: 52.192.#.# を取得 Gi1はDHCPでElastic IP: 18.178.#.# を取得 BDFで障害検知を行うPeerのIPアドレスを指定します。
  24. EC2インスタンスのUser Dataに記述するSection • Section: License • 起動時にライセンスを適用して「Section: IOS configuration」のライセンスが必要なコマンドが正常に実行できるようにします。 •

    license boot level コマンドで割り当てる想定のライセンス種別を指定します。 • Section: IOS configuration • IOS-XEのコマンドを記述します。 • Section: Python package • csr_aws_ha のパッケージとバージョンを指定します。 • Section: Scripts • 外部スクリプトのダウンロード先を指定します。スクリプトを直接記述できない点に注意が必要です。メーカー側で csr_aws_ha 向けのスクリプトはホスティングしていないため、導入担当者が用意する必要があります。
  25. EC2インスタンスのUser Dataの設定例 Section: License TechPackage:network-premier Section: IOS configuration hostname c8000v01

    <snip> Section: Python package csr_aws_ha 3.1.0 {--user} Section: Scripts https://example.test/script.sh?v=dummy1 1 ap-northeast-1 rtb-**** eni-**** '0.0.0.0/0' primary https://example.test/script.sh?v=dummy2 2 ap-northeast-1 rtb-**** eni-**** '8.8.8.8/32' secondary https://example.test/script.sh?v=dummy3 3 ap-northeast-1 rtb-**** eni-**** '8.8.4.4/32' secondary
  26. Catalyst 8000VのSection: License 検証時Ver. 17.09.01a Section: License TechPackage:network-essentials Section: License

    TechPackage:network-advantage Section: License TechPackage:network-premier ドキュメント上に記述されている「ipbase, security, appx, ax」ではライセンスが適用されず、 「license boot level」コマンドのオプションと同様の値を指定する必要がありました。 おそらく、CSR1000V時代の情報のままになっていると思われます。 C8000V#configure terminal Enter configuration commands, one per line. End with CNTL/Z. C8000V(config)# C8000V(config)#license boot level ? network-advantage License Level Network-Advantage network-essentials License Level Network-Essentials network-premier License Level Network-Premier C8000V(config)#license boot level
  27. Section: Scripts の活用 • csr_aws_ha による冗長化では、Guestshell上で reate_node.py コマン ドを実行する必要があります。 •

    しかしながら「Section: IOS configuration」ではIOS-XEの設定は指定で きますが、Guestshellに対する設定はできません。そのためGuestshellに対す る設定を行うための「Section: Scripts」が用意されています。 • 「Section: Scripts」ではコマンドを直接記述できず、外部からスクリプトをダウ ンロードして実行する必要があります。なお、User Dataでスクリプトに渡す引 数は任意で指定できます。
  28. スクリプトの参考例 #!/bin/bash create_node.py -i ${1} -rg ${2} -t ${3} -n

    ${4} -r ${5} -m ${6} URL例: https://example.test/script.sh 引数をUser Data側で指定する想定で、単に create_node.py コマンドとオプションを並べた例です。 スクリプトを外部公開する場合は、機密情報を記載しないように注意してください。
  29. Catalyst 8000VのSection: Scripts Section: Scripts https://www.example.test/script.sh arg1 arg2 Catalyst 8000V

    (IOS-XE) #!/bin/bash <snip> wget --read-timeout=30 --tries=5 https://www.example.test/script.sh -O script.sh &>> customdata.log <snip> chmod +x script.sh ./script.sh arg1 arg2 &>> script.sh.log & <snip> bootflash:guest-share/customdata_bash.sh guestshell IOS-XEホストOS上からguestshell (コンテナ上)へスクリプト ファイルの受け渡し 対象URLのダウンロード処理 ダウンロードしたスクリプトに引数を渡して実行処理 書式: 【URL】 【引数】
  30. 同じURLの重複指定 Section: Scripts https://www.example.test/echo_msg.sh Hello https://www.example.test/echo_msg.sh World #!/bin/bash echo "${1}"

    > ~/"${1}" ファイル名: echo_msg.sh [guestshell@guestshell ~]$ ls ~/ World cloud customdata [guestshell@guestshell ~]$ 同じURLの場合、最後のものが優先されます。 重複で実行はされません。
  31. ファイル名 (ベースURL)は重複且つURL Parameterは一意 Section: Scripts https://www.example.test/echo_msg.sh?v=dummy1 Hello https://www.example.test/echo_msg.sh?v=dummy2 World [guestshell@guestshell

    ~]$ ls ~/ Hello World cloud customdata [guestshell@guestshell ~]$ [guestshell@guestshell ~]$ ls ~/customdata/ customdata.log 'echo_msg.sh?v=dummy1.log' 'echo_msg.sh?v=dummy2.log' 'echo_msg.sh?v=dummy1' 'echo_msg.sh?v=dummy2' syslogger.py [guestshell@guestshell ~]$ #!/bin/bash echo "${1}" > ~/"${1}" ファイル名: echo_msg.sh ダウンロード元のファイルの実体は1つですが、 URL Parameterを与えることによって 異なるファイル名でダウンロードさせています。 元々が同じURLの同じファイルであっても、URL Parameterを付与して別物扱いにできます。 「?v=dummy1」のように一意なURL Parameterを与えています。
  32. 異なるURLで同一ファイル名 Section: Scripts https://www.example.test/echo_msg.sh Hello https://www.example.test/dir/echo_msg.sh World [guestshell@guestshell ~]$ ls

    Hello World cloud customdata [guestshell@guestshell ~]$ [guestshell@guestshell ~]$ ls ~/customdata/ customdata.log echo_msg.sh echo_msg.sh.log syslogger.py [guestshell@guestshell ~]$ ファイル名: echo_msg.sh ファイルは最後にダウンロードされたものが残ります。 スクリプトの実行自体は順に行われます。 元々が同じURLの同じファイルであっても、URL Parameterを付与して別物扱いにできます。 1番目にダウンロード 2番目にダウンロード 同じファイル名でも異なるURLの場合は、 上から順にダウンロードされて実行されます。 #!/bin/bash echo "${1}" > ~/"${1}"