Catalyst 9300 Docker 上で ThousandEyes Agent の起動と設定

# これはなに？

こちらの絵が、やりたいことです！ Catalyst9300 に ThousandEyes のDockerエージェントをインストールして設定して動作確認します。Catalyst9300上の Docker アプリのホストの仕方の参考にもなります。

![SS 2021-04-15 16.18.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157325/ac273737-e7cb-cc8a-02c0-95eef7a306f4.png)

## ThousandEyes
いろんなところに配置したソフトウェアエージェントを使って、任意のポイント間を任意のテストトラフィックを発生させて、そのネットワークのサービスレベルを可視化、それがクラウドポータルからめちゃくちゃ簡単にできるという、[サウザンドアイズ](https://www.thousandeyes.com/ja/)という会社およびサービスがありました。いろんなところにお目々👀 があるという感じですね。実際にはお目々は見ているというより、何かを発生させる（TracerouteしたりWebにHTTPしたり拠点間でRTP出したり）のでちょっとミスリーディングかも。実際に流れているものを監視する手法をパッシブモニタリング（受動型監視）、能動的にテストを行ってその結果から品質を可視化する手法をアクティブモニタリング（能動型監視）とよびますが、サウザンドアイズの中心となる特徴はアクティブモニタリングの方になります。

※参考 [Cisco IOS を活用した “見える化”の階段 2013年](https://gblogs.cisco.com/jp/2013/08/cisco-ios-mgmt-step/)
アクティブモニタリングとパッシブモニタリングの組み合わせについてごちゃごちゃ書いてます :-)

で、2020年に某シスコシステムズに買収・統合されてその統合具合が注目されていました。

サウザンドアイズのエージェントには、全世界に配置してくれているクラウドエージェント、自分で好きなところ（ラズパイとか仮想マシンとか）に配置するエンタープライズエージェント、パソコンにインストールするクライアントエージェントといったタイプがありますが、どこにお目々を置きますか？という選択が必要で、基本的にはお目々の数やテストの数に応じてお金がかかるという感じです。


## ThousandEyes on Cisco
Ciscoルーターやスイッチでは、以前からアプリケーションホスティングという仕組みを使って、装置の上に任意のアプリケーションを立ち上げることができており、サウザンドアイズのエージェントをホストするソリューションがありました。データセンターにサウザンドアイズ用の仮想マシンを専用に作ったり、もちろんラズパイを配置したりといった、物理的な部分が節約できることと、ネットワーク装置そのものからテストトラフィックが発生しているように作れるため、特に拠点間比較などネットワークの切り分けと組み合わせてトラブルシュートがわかりやすくなるといった利点がありました。

- クラウドエージェント
- エンタープライズエージェント ... OVA/OVF, Hyper-V, Nuc/ラズパイ, __Cat9K__/ISR/ASR, JUNOS, Linux Package, Docker, AWS Marketplaceなどなど <== __ここの話__
- エンドポイントエージェント

## Docker タイプの ThousandEyes エージェントを Catalyst9300 上に立ち上げる
私も過去に、ThousandEyesのエージェントをCatalystに以前ホストして遊んでいたことがあるんですが、前はKVMベースのものしかなくて、しかも限られたCatalystのApp-hosting用のリソースを使ってしまって、動くには動いてたんですが取り回しに苦労したんですよね。

それが今ではCatalyst9300のApp-hositngのDockerの上で動くThousandEyesのDockerタイプのエージェントがリリースされていて、さらに公式のリリースノートにもサポートが明記されていたので、重い腰を上げてほとんど自分用のメモとして残しておくことにしました。

- Catalyst 9300 のDockerコンテナでThousandEyesエージェントが動く
- IOS XE App-hostingの機能を使って設定
- オプションのSSDが不要でBootflashだけでよくなった（以前のKVMエージェントだとSSDが必要だった）
※ちなみに[オプションのSSDってこれ](https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/hardware/install/b_c9300_hig/b_c9300_hig_chapter_01010.html)... 普通買いませんよね... ~~私持ってますが~~
- 敷居が低い！ Catalyst9300 持ってたら試せる！（あとライセンス？）
- ThousandEyesエージェントは[ここからダウンロード](https://downloads.thousandeyes.com/enterprise-agent/thousandeyes-enterprise-agent-3.0.cat9k.tar)

[Release Notes for Cisco Catalyst 9300 Series Switches, Cisco IOS XE Amsterdam 17.3.x
](
https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/software/release/17-3/release_notes/ol-17-3-9300.html#concept_hth_r3j_t4b)

> ThousandEyes Enterprise Agentの新バージョンを紹介します。これは、アプリケーション ホスティング機能を使用してシスコ デバイス上で動作する Docker ベースの組み込みアプリケーションです。Enterprise Agent は、SSD とブートフラッシュの両方で使用できます。
Programmability Configuration Guide → Application Hosting を参照してください。
(ネットワークアドバンテージ)

[Programmability Configuration Guide, Cisco IOS XE Amsterdam 17.3.x](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/173/b_173_programmability_cg/application_hosting.html#Cisco_Concept.dita_a8891b99-4ebb-4f78-a884-d0a3593d91a4)

> 以前の Cisco IOS XE リリースでは、ThousandEyes はサードパーティの KVM (Kernel-based Virtual Machine) アプライアンスとして SSD 上でサポートされていました。
Cisco IOS XE Amsterdam 17.3.3では、新バージョンのThousandEyes Enterprise Agentが導入されています。これは、アプリケーション ホスティング機能を使用してシスコ デバイス上で動作する、Docker ベースの組み込みアプリケーションです。Enterprise Agentは、SSDとブートフラッシュの両方で利用可能です。Enterprise Agentは、ブラウザテスト（ページロードとトランザクション）を除くすべてのテストをサポートしています。

※関係ないけど [DeepL](https://www.deepl.com/) めちゃくちゃ便利ですね！

## やってみましょう

### 1. 準備〜インストール

#### 1.1 IOSバージョンを新しくしておく
```
Cat9300TMT02#sh ver | i IOSXE
Cisco IOS Software [Bengaluru], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 17.5.1, RELEASE SOFTWARE (fc3)
*    1 41    C9300-24P          17.05.01          CAT9K_IOSXE           INSTALL
*    
```

#### 1.2 ブートフラッシュをきれいにしておく
```
Cat9300TMT02#show install summary 
[ Switch 1 ] Installed Package(s) Information:
State (St): I - Inactive, U - Activated & Uncommitted,
            C - Activated & Committed, D - Deactivated & Uncommitted
--------------------------------------------------------------------------------
Type  St   Filename/Version
--------------------------------------------------------------------------------
IMG   C    17.05.01.0.144

--------------------------------------------------------------------------------
Auto abort timer: inactive
--------------------------------------------------------------------------------


Cat9300TMT02#install remove inactive 

```

#### 1.3 ファイルをCatalystのbootflashにコピー
```
Cat9300TMT02#sh flash: | i thousand
179  178872320 Apr 06 2021 19:03:14.0000000000 +00:00 thousandeyes-enterprise-agent-3.0.cat9k.tar
```

#### 1.4 TARファイルをインストール
```
Cat9300TMT02#app-hosting install appid <name> package bootflash:thousandeyes-enterprise-agent-3.0.cat9k.tar
```

うまくいけば DEPLOYED となる。
この例では <name> を thousandeyes_enterprise_agent としてます。

```
Cat9300TMT01#show app-hosting list 
App id                                   State
---------------------------------------------------------
thousandeyes_enterprise_agent            DEPLOYED
```
- デプロイされた状態
- Actiavateはまだ
- Startはまだ

### 2. 内部〜外部ネットワークの設定

ネットワークの設定をしていきます。

- フロントパネルポートのVLAN（スイッチポート）を引っ張ってきてトランクで内部アプリにつなぎ込む <==__今回はこちら__
- フロントパネルポートのルーテッドインターフェースをNATして内部に内部アプリにつなぎ込む

※参考 [Application Hosting on Front-Panel Trunk and VLAN Ports]
(https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/173/b_173_programmability_cg/application_hosting.html#id_94841)

#### 2.1 Vlan と AppGigabitEthernet インターフェースの接続

```
Cat9300TMT02#sh run int gi 1/0/24
!
interface GigabitEthernet1/0/24
 switchport access vlan 10
!
interface Vlan10
 ip address 10.71.154.50 255.255.255.248
!
interface AppGigabitEthernet1/0/1
 switchport trunk allowed vlan 10
 switchport mode trunk
```

#### 2.2 AppGigabitEthernet と 内部アプリの接続, Dockerの設定

設定は見た目通り、比較的ストレートでわかりやすいです。

```
app-hosting appid TEApp
 app-vnic AppGigabitEthernet trunk
  vlan 10 guest-interface 0
   guest-ipaddress 10.71.154.51 netmask 255.255.255.248
 app-default-gateway 10.71.154.50 guest-interface 0
 app-resource docker
  prepend-pkg-opts
  run-opts 1 "-e TEAGENT_ACCOUNT_TOKEN=<ThousandEyesPortalのToken>" <=== ThousandEyesのクラウドポータルから取得
  run-opts 2 "--hostname Cisco-TEDocker"
 name-server0 208.67.222.222
```

※ThousandEyesのトークンはこちらから取得しておきます
![SS 2021-04-15 15.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157325/7505cc75-93c2-e0cc-fe22-c0933db77036.png)


### 3. Dockerの起動と確認

#### 3.1 Dockerのアクティベートと起動

[Lifecycle for an Application] 
(https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/173/b_173_programmability_cg/application_hosting.html#id_74357)を意識しながら、Applicationを立ち上げていきます。
こちらは、覚えておくと何かと便利なコマンドです（マニュアルからの抜粋）。

```
Device# app-hosting install appid iox_app package usbflash1:my_iox_app.tar.tar
Device# app-hosting activate appid iox_app
Device# app-hosting start appid iox_app
Device# app-hosting stop appid iox_app
Device# app-hosting deactivate appid iox_app
Device# app-hosting uninstall appid iox_app
```

Deployed => Activated => Running やっていきます。

```
Cat9300TMT02#app-hosting activate appid thousandeyes_enterprise_agent 
thousandeyes_enterprise_agent activated successfully
Current state is: ACTIVATED

Cat9300TMT02#sho app-hosting list                                     
App id                                   State
---------------------------------------------------------
thousandeyes_enterprise_agent            ACTIVATED

Cat9300TMT01#
Cat9300TMT01#app-hosting start appid thousandeyes_enterprise_agent    
thousandeyes_enterprise_agent started successfully
Current state is: RUNNING
```

いい感じに立ち上がっていることを確認。

```
Cat9300TMT02#show app-hosting detail appid TEApp
App id                 : TEApp
Owner                  : iox
State                  : RUNNING
Application
  Type                 : docker
  Name                 : thousandeyes/enterprise-agent
  Version              : 3.0
  Description          : 
  Path                 : flash:thousandeyes-enterprise-agent-3.0.cat9k.tar
  URL Path             : 
Activated profile name : custom

Resource reservation
  Memory               : 500 MB
  Disk                 : 1 MB
  CPU                  : 1850 units
  CPU-percent          : 25 %
  VCPU                 : 1

Attached devices
  Type              Name               Alias
  ---------------------------------------------
  serial/shell     iox_console_shell   serial0
  serial/aux       iox_console_aux     serial1
  serial/syslog    iox_syslog          serial2
  serial/trace     iox_trace           serial3

Network interfaces
   ---------------------------------------
eth0:
   MAC address         : 52:54:dd:2d:a8:e2
   IPv4 address        : 10.71.154.51
   IPv6 address        : ::
   Network name        : mgmt-bridge-v10

Docker
------
Run-time information
  Command              : 
  Entry-point          : /sbin/my_init 
  Run options in use   : -e TEAGENT_ACCOUNT_TOKEN=TOKEN_NOT_SET --hostname=$(SYSTEM_NAME) --cap-add=NET_ADMIN --mount type=tmpfs,destination=/var/log/agent,tmpfs-size=140m --mount type=tmpfs,destination=/var/lib/te-agent/data,tmpfs-size=200m -v $(APP_DATA)/data:/var/lib/te-agent -e TEAGENT_PROXY_TYPE=DIRECT -e TEAGENT_PROXY_LOCATION= -e TEAGENT_PROXY_USER= -e TEAGENT_PROXY_AUTH_TYPE= -e TEAGENT_PROXY_PASS= -e TEAGENT_PROXY_BYPASS_LIST= -e TEAGENT_KDC_USER= -e TEAGENT_KDC_PASS= -e TEAGENT_KDC_REALM= -e TEAGENT_KDC_HOST= -e TEAGENT_KDC_PORT=88 -e TEAGENT_KERBEROS_WHITELIST= -e TEAGENT_KERBEROS_RDNS=1 -e PROXY_APT= -e APT_PROXY_USER= -e APT_PROXY_PASS= -e APT_PROXY_LOCATION= -e TEAGENT_AUTO_UPDATES=1 -e TEAGENT_ACCOUNT_TOKEN=<YOUR_TOKEN> --hostname Cisco-TEDocker
  Package run options  : -e TEAGENT_ACCOUNT_TOKEN=TOKEN_NOT_SET --hostname=$(SYSTEM_NAME) --cap-add=NET_ADMIN --mount type=tmpfs,destination=/var/log/agent,tmpfs-size=140m --mount type=tmpfs,destination=/var/lib/te-agent/data,tmpfs-size=200m -v $(APP_DATA)/data:/var/lib/te-agent -e TEAGENT_PROXY_TYPE=DIRECT -e TEAGENT_PROXY_LOCATION= -e TEAGENT_PROXY_USER= -e TEAGENT_PROXY_AUTH_TYPE= -e TEAGENT_PROXY_PASS= -e TEAGENT_PROXY_BYPASS_LIST= -e TEAGENT_KDC_USER= -e TEAGENT_KDC_PASS= -e TEAGENT_KDC_REALM= -e TEAGENT_KDC_HOST= -e TEAGENT_KDC_PORT=88 -e TEAGENT_KERBEROS_WHITELIST= -e TEAGENT_KERBEROS_RDNS=1 -e PROXY_APT= -e APT_PROXY_USER= -e APT_PROXY_PASS= -e APT_PROXY_LOCATION= -e TEAGENT_AUTO_UPDATES=1
Application health information
  Status               : 0
  Last probe error     : 
  Last probe output    : 
```

#### 3.2 ThousandEyesポータルから確認

ThousandEyesのポータルサイトから、Catalyst9300上のエージェントが確認できます。これで基本的には各種テストや確認はすべてブラウザから行えるようになりました。

![SS 2021-04-15 16.01.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157325/30939e0e-7ca8-f775-cbc7-b2282f27a567.png)
![SS 2021-04-15 16.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157325/25e41bbe-93cf-e4a6-9b99-798f89c79c14.png)

# そのほか

今回は、ラボにあったCatalyst9300に設定してみましたが、どうやらマニュアルによるとこちらのエージェントが標準組み込みになりそうな気配です。LANスイッチがクラウドからの設定で自在にアクティブモニターをでき、各種ネットワークサービスの品質を可視化できる世界はもうすぐそこにあることを感じました。楽しみですね！ 

[Programmability Configuration Guide, Cisco IOS XE Amsterdam 17.3.x](
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/173/b_173_programmability_cg/application_hosting.html#Cisco_Concept.dita_700b71f4-bae4-4636-a4b3-a9f21ec5e6b7)
> ThousandEyes Enterprise Agent には、BrownField と GreenField の 2 種類があります。既存のデバイスについては、BrownfieldバージョンをThousandEyesウェブサイトからダウンロードできます。ただし、新しいデバイスは、ブートフラッシュにGreenFieldアプリケーションがロードされた状態で出荷されます。

気が向いたら、ルーテッドポートとNATの組み合わせでもやってみたいと思います。今時のCatalystはNATが出来るんですねぇ〜😲
[Supported Network Types](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/prog/configuration/173/b_173_programmability_cg/application_hosting.html#id_94850)

> Cisco IOSネットワークアドレス変換（NAT）について
Cisco IOS XE Gibraltar 16.12.1搭載のCatalyst 9300シリーズ スイッチおよびC9300L
Catalyst 9400シリーズ スイッチ（Cisco IOS XE Amsterdam 17.1.1搭載
これらのプラットフォームでは、フロントパネルのデータポートとAppGigabitEthernetポートに適用されるハードウェアデータポート機能によってNATがサポートされています。

最後まで読んで頂き、ありがとうございました！

PS: ライセンスゥゥゥ！？ はこの記事では特に深追いしませんが、なんかあるらしいので気になった方は、そちらの方面に聞いてみてください。
Ordering Guide for Customers with Existing Catalyst 9000 Deployments to Request ThousandEyes Credits
https://www.cisco.com/c/en/us/products/collateral/switches/catalyst-9000/nb-06-cat-9k-og-cte-en.html