キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
告知

JTAC-Mid-Career-Recruitment-2021.3

 MayCL_topbanner.JPG

 

NSO: NSO 5.4 より新しくなった HA 実装

54
閲覧回数
0
いいね!
0
コメント

NSO 5.4 以降の HA

NSO 5.4 より、NSO に実装されている HA 機能が一新されました。これにより、使用方法の変更がありますので、以下説明します。

HA in NSO

NSO の HA の仕組みは NSO の公開当初より存在していますが、NSO ノードの役割 (Master/Slave) 毎の動作についてのみが内蔵されており、
例えば、特定の NSO ノードを Master にする、もう一方のノードを Slave とする、Virtual IP アドレスを用意しそれを制御する、と言ったことは NSO 自体には備わっておらず、
公開されている HA Framework API を使用してユーザによる制御アプリケーションの実装が必要でした。

HA Framework API を使用することにより非常に柔軟な HA 実装を作成することが可能ですが、
ユーザがそのフレームワークを実装するためにはプログラミングスキル・コストが必要となり、またお客様はそういった機能が同時に提供されていることを期待していたため、
Cisco は tailf-hcc パッケージを公開致しています。これは Java を使用した HA フレームワーク実装例とも言え、ユーザがこれを参考に独自にフレームワークを作成することも可能です。
ただし、実際には多くのユーザが tailf-hcc をそのまま使用しています。

本コミュニティにも、以下に使用方法を投稿しております。
NSO: tailf-hcc を使用して HA を操作する方法

NSO 5.4 より、tailf-hcc で実現していた一部機能が内蔵されることとなりました。これにより、Layer-3 (BGP) での HA を使用する場合は、tailf-hcc では Quagga と quagga-bgp NED を使用して制御しておりましたが、それについても GoBGP を使用した方法に変わっています。

本投稿では、新しい HA の設定方法について説明します。

 

HA の動作概要

NSO 上での HA には いくつかの機能があります。

  • ノードの状態管理
  • ノード間でのCDBの同期
  • ノードの状態繊維の管理

ノードの状態管理

NSO Version 担当
5.4 NSO
5.3以下 NSO + tailf-hcc

 

NSO が当該クラスタに参加しているノードを把握している必要があります。HA の手法は色々なものがありますが、NSO では設定済みの、既知のノードを参加させることが出来ます。

また、HA が有効化された NSO の各ノードは、Master, Slave, None のいずれかの状態にあります。
Master ノード, None ノードでは設定の変更などが可能ですが、Slave ノードは Read Only に設定され、Config モードへ入ることが出来ません。

また、Master/Slave にある場合、package の更新などが出来ないため、package のアップグレードを行う際には、None 状態である必要があります。

ノード間でのCDBの同期

 

NSO Version 担当
5.4 NSO
5.3以下 NSO

 

Master ノードで発生した変更は、ConfigデータとOperationalデータ共に Slave ノードへ同期されます。トランザクション単位で同期が実施され、デフォルト設定では、同期が完了するまで当該トランザクションは終了しません。これにより、Slave ノードは必ず最新のデータを保持することが保証されます。

 

ノードの状態遷移の管理

NSO Version 担当
5.4 tailf-hcc
5.3以下 tailf-hcc

 

ノードの状態が種々の条件によって遷移しますが、それを管理する必要があります。例えば、Masterノードが動作を停止した場合、それを検知し、Slave ノードが新しい Master ノードとして動作を開始する必要があります。それに伴い、Virtual IP アドレスが設定してある場合は付け替えが正しく行われる必要があります。

必要な設定

以下のような設定が必要です。
この設定は、L2 HA / L3 HA によらずその設定方法は共通ですが、参考として以下の図を掲示します。

nso_new_ha_l2.png

 

 

 

 

 

high-availability token $9$EB2nNu0z9/2hQVIMc/lxhHcsx35lP65qxJgQSvvyzCc=
high-availability ha-node nso1
 address      192.168.10.1
 nominal-role master
!
high-availability ha-node nso2
 address         192.168.10.2
 nominal-role    slave
 failover-master true
!
high-availability settings enable-failover true
high-availability settings start-up assume-nominal-role true
high-availability settings start-up join-ha true

hcc enabled
hcc vip-address [ 192.168.10.99 ]

 

 

 

 

 

 

 

 

token

NSO Master/Slave ノード間で通信を行いますが、token としてパスワード情報を添付し、未知のノードが接続されないようにします。全てのノードが同じ token を使用します。

 

ha-node

参加するノード全てを記述します。始めて HA の設定を行う場合、当然ですがどのノードにも HA 関連の設定がありません。ノードリストを含む HA の設定もまたノード間で同期しますが、初回設定時には、Slave ノードにも Master ノードの IPアドレスなどの設定が必要です。

 

settings

HA の各種設定を行います。

HA の有効化

  • NSO1

 

 

 

 

admin@ncs# high-availability enable
result enabled
admin@ncs#

 

 

 

 

  • NSO2

 

 

 

 

admin@ncs# high-availability enable
result enabled
admin@ncs#

 

 

 

 

HA クラスタへの参加

HA の設定が完了したら、NSO ノードを HA クラスターへ組み込みます。
マスターノードでは、そのノードを Master へ設定します。Slave ノードでは、参加する Master ノード名を指定して、Slave へ設定します。

  • NSO1

 

 

 

 

admin@ncs# high-availability be-master
result ok
admin@ncs#

 

 

 

 

  • NSO2

 

 

 

 

admin@ncs# high-availability be-slave-to
Value for 'node' [nso1,nso2]: nso1
result Attempting to be slave to node nso1
admin@ncs#

 

 

 

 

状態の確認

  • NSO1

 

 

 

 

admin@ncs# show high-availability
high-availability enabled
high-availability status mode master
high-availability status current-id nso1
high-availability status assigned-role master
ID    ADDRESS
--------------------
nso2  192.168.10.2

admin@ncs#

 

 

 

 

 

 

 

自身の ID が nso1 であること、また master であることがわかります。

  • NSO2

 

 

 

 

admin@ncs# show high-availability
high-availability enabled
high-availability status mode slave
high-availability status current-id nso2
high-availability status assigned-role slave
high-availability status be-slave-result initialized
high-availability status master-id nso1
admin@ncs#

 

 

 

 

自身の ID が nso2 であること、また slave であり、その master は nso1 であることがわかります。

ノード監視

Slave ノード (NSO2) は、Master ノード (NSO1)の死活監視を行います。その結果、Master ノードがダウンしたと判断した場合、以下の設定がされている場合は Slave ノード自身が Master へと昇格させます。

 

 

 

 

high-availability settings enable-failover true

 

 

 

 

また、その時に master となるノードは、以下で設定されています。

 

 

 

 

high-availability ha-node nso2
 failover-master true

 

 

 

 

NSO 起動時の動作

assume-nominal-role  join-ha の設定により、起動時の動作が変わります。

 

 

 

 

high-availability settings start-up assume-nominal-role true
high-availability settings start-up join-ha true

 

 

 

 

  • assume-nominal-role

各ノードに設定された role が現在の動作 role であると仮定し、起動したノードが master に設定されたノードである場合 (nso1)、master ノードとして宣言し、クラスタに参加します。起動したノードが slave に設定されたノードである場合 (nso2)、slave ノードとして宣言し、設定上 nominal-role が master に設定されたノードを master として、クラスタに参加します。

false に設定された場合、設定された nominal-role に頼らず、その時点での master ノードを探します。例えば、nso2 が failover-master となった後、nso1 が再度起動してきた場合には nso2 を master として、nso1 は slave として参加します。

  • join-ha

自身を slave として、HA クラスタに参加させるための設定です。この値が false であったとしても、一度はクラスタへの参加は試みますが、何らかの問題が出来ない場合に中止します。

true へ設定された場合は、reconnect-interval に設定された値の間隔で、HA クラスタへの参加を引き続き試みます。

L2 HA

以下のトポロジー上で設定します。上記の例で使用したものですが、2つの NSO ノードは、共に 192.168.10.0/24 ネットワークに配置され、192.168.10.99 を VIP として使用しています。

nso_new_ha_l2.png

hcc の機能

tailf-hcc パッケージが提供する設定内容です。VIP の管理は tailf-hcc が行うため、hcc 配下に設定をします。この例では、vip として 192.168.10.99 を設定しているため、Master ノードの NIC に、このアドレスが以下のように追加されます。

 

 

 

 

ubuntu@nso1:~$ ip -4 addr show ens2
2: ens2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.10.1/24 brd 192.168.10.255 scope global ens2
       valid_lft forever preferred_lft forever
    inet 192.168.10.99/32 scope global ens2
       valid_lft forever preferred_lft forever

 

 

 

 

L3 HA

以下のトポロジー上で設定します。2つの NSO ノードは、3つのルータを介して接続されています。
NSO は近隣のルータと eBGP を使用して接続し、Master Role となっている場合には VIP を広報します。

 

nso_new_ha_l3.png

GoBGP のインストール

NSO 5.4 においても、BGP 実装が Nativeでされたわけではなく、外部 BGP 実装として GoBGP を使用します。別途インストールする必要がありますので、以下のようにインストールを行ってください。

 

package manager を使用してインストール

  • debian / ubuntu

 

 

 

 

apt-get install gobgp

 

 

 

 

  • centos / Redhat

 

 

 

 

yum install gobgp

 

 

 

 

github から最新のバイナリを取得して使用する

レポジトリ: https://github.com/osrg/gobgp/

  • バイナリの取得

 

 

 

 

# mkdir /opt/gobgp
# cd /opt/gobgp

# wget https://github.com/osrg/gobgp/releases/download/v2.24.0/gobgp_2.24.0_linux_amd64.tar.gz
# tar xfzv ~/gobgp_2.24.0_linux_amd64.tar.gz

 

 

 

 

  • バイナリを展開すると、gobgp コマンドが確認出来ます。

 

 

 

 

root@nso-5:~# ls -la /opt/gobgp
total 29468
drwxr-xr-x 2 root root     4096 Feb 12 14:12 .
drwxr-xr-x 4 root root     4096 Feb 12 13:54 ..
-rw-r--r-- 1 1001  119    11324 Feb  3 06:23 LICENSE
-rw-r--r-- 1 1001  119     2419 Feb  3 06:23 README.md
-rwxr-xr-x 1 1001  119 14233600 Feb  3 06:25 gobgp
-rwxr-xr-x 1 1001  119 15917056 Feb  3 06:25 gobgpd
root@nso-5:~#

 

 

 

 

設定

high-availability の設定は、L2 HA と同様です。
hcc に bgp 関連の設定が必要となります。

 

high-availability

 

 

 

 

high-availability token $9$yumaELjtA3pTSsffRmNypptXReCa7dQeSr3PtZZHn2k=
high-availability ha-node nso-5
 address      192.168.15.5
 nominal-role master
!
high-availability ha-node nso-6
 address         192.168.36.6
 nominal-role    slave
 failover-master true
!
high-availability settings enable-failover true
high-availability settings start-up assume-nominal-role false
high-availability settings start-up join-ha true

 

 

 

 

hcc

bgp speaker として必要な設定を追加します。BGP の設定としては、特に変わったものは有りません。gobgp-bin-dir へは、gobgp 実行ファイルが設置されたディレクトリパスを設定します。

 

 

 

 

hcc enabled
hcc vip-address [ 9.9.9.9 ]
hcc bgp node nso-5
 gobgp-bin-dir /opt/gobgp
 as            65000
 router-id     5.5.5.5
 neighbor 192.168.15.1
  as      100
  enabled
 !
!
hcc bgp node nso-6
 gobgp-bin-dir /opt/gobgp
 as            65001
 router-id     6.6.6.6
 neighbor 192.168.36.3
  as      300
  enabled
 !
!

 

 

 

 

動作状態を確認する

show high-availability

show high-availability によって、HA のステータスが確認出来ます。
Master ノード上では、接続されている slave のリストが表示されます。

  • nso-5

 

 

 

 

ubuntu@ncs# show high-availability
high-availability enabled
high-availability status mode master
high-availability status current-id nso-5
high-availability status assigned-role master
ID     ADDRESS
---------------------
nso-6  192.168.36.6

ubuntu@ncs#

 

 

 

 

  • nso-6

 

 

 

 

ubuntu@ncs# show high-availability
high-availability enabled
high-availability status mode slave
high-availability status current-id nso-6
high-availability status assigned-role slave
high-availability status be-slave-result initialized
high-availability status master-id nso-5
ubuntu@ncs#

 

 

 

 

show hcc コマンド

NSOノードからの、Neighborへの接続情報が確認出来ます。
他ノードについては、その存在のみが確認可能で、bgpd ステータスなどは "-" が表示されます。

  • nso-5

 

 

 

 

ubuntu@ncs# show hcc
NODE   BGPD   BGPD
ID     PID    STATUS   ADDRESS       STATE        CONNECTED
-------------------------------------------------------------
nso-5  18003  running  192.168.15.1  ESTABLISHED  true
nso-6  -      -        192.168.36.3  -            -

ubuntu@ncs#

 

 

 

 

  • nso-6

 

 

 

 

ubuntu@ncs# show hcc
NODE   BGPD  BGPD
ID     PID   STATUS   ADDRESS       STATE        CONNECTED
------------------------------------------------------------
nso-5  -     -        192.168.15.1  -            -
nso-6  6437  running  192.168.36.3  ESTABLISHED  true

ubuntu@ncs#

 

 

 

 

gobgp プロセス

gobgp は動的に作成された conf ファイルを読み込み、起動します。

 

 

 

 

root@nso-5:~# ps -ef | grep gobgp | grep -v grep
root       18003   17942  0 Feb12 ?        00:02:02 /opt/gobgp/gobgpd -l debug -f /tmp/bgp.wtyv7l740g.conf
root@nso-5:~#

 

 

 

 

具体的には、以下の内容のファイルが生成され、gobgp に使用されています。

 

 

 

 

root@nso-5:~# cat /tmp/bgp.wtyv7l740g.conf
[global.config]
  as = 65000
  router-id = "5.5.5.5"

[[neighbors]]
  [neighbors.config]
    neighbor-address = "192.168.15.1"
    peer-as = 100

[[neighbors.afi-safis]]
  [neighbors.afi-safis.config]
  afi-safi-name = "ipv4-unicast"
[[neighbors.afi-safis]]
  [neighbors.afi-safis.config]
  afi-safi-name = "ipv6-unicast"

root@nso-5:~#

 

 

 

 

BGP rib の状態

Master ノード上では VIP が BGP RIB へインジェクトされ、また Neighbor に広報されます。Slave ノードではそれの受信が確認出来ます。

 

 

 

 

ubuntu@nso-5:~$ gobgp global rib
   Network              Next Hop             AS_PATH              Age        Attrs
*> 9.9.9.9/32           0.0.0.0                                   00:01:28   [{Origin: ?}]
ubuntu@nso-5:~$

 

 

 

 

BGP neighbor

 

 

 

 

ubuntu@nso-6:~$ gobgp global rib
   Network              Next Hop             AS_PATH              Age        Attrs
*> 9.9.9.9/32           192.168.36.3         300 200 100 65000    00:00:51   [{Origin: ?}]
ubuntu@nso-6:~$

 

 

 

 

バックボーンルータ上での経路情報

今回のトポロジ上、コアルータ郡の意味合いで作成した AS 200 内の R2 ルータ上では、VIP が R1 から広報されています。

 

 

 

 

R2#show bgp ipv4 unicast
BGP table version is 7, local router ID is 2.2.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
              t secondary path,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>   9.9.9.9/32       192.168.12.1                           0 100 65000 ?
R2#