Tungsten Fabric Primer

最近 Tungsten Fabric Primer という文書を書いている。
https://github.com/tnaganawa/tungstenfabric-docs/blob/master/TungstenFabricPrimer.md
インストール、状態確認、設定変更、アップデート、監視ツールとの連携、等、Tungsten Fabric の構築・運用に必要な情報が一通りまとまっているはず (多分)

JNCIA-DevOps, JNCIS-DevOps 取得記

先日、JNCIA-DevOps, JNCIS-DevOps を取得したので、その時のメモとなる。
https://www.juniper.net/jp/jp/training/certification/certification-tracks/devops?tab=jnciadevops
https://www.juniper.net/jp/jp/training/certification/certification-tracks/devops?tab=jncis-devops

こちらの資格は、 Juniper Networks から提供されている DevOps Track の資格で、Junos に特化した Automation の試験となっている。
基本的には、 operational command, configuration command をon-box (SLAX, Python など), off-box (PyEZ, ansible など) で実行するための仕組みが対象となっているが、それ以外にも YANG によるコンフィグ拡張、スクリプト使用時に必要な Junos コンフィグ、等もかなり多く出題されるので、Junos の試験だと思った方が実態に近いかもしれない。


出題範囲は、サイトに記載されている通りで、JNCIA-DevOps / JNCIS-DevOps 共に、Python, ansible 等が出題の中心となり、JNCIA/JNCISで、出題範囲そのものはあまり変わらない印象だった。
ただ、 JNCIS の方では、実際のスクリプトが問題内で提供され、出力内容・エラー内容を選択する、など、実機である程度使っていないと答えられない問題が増えており、より実機経験が求められる試験になっているようである。

 

内容としては、XML, JSON, YAML, Python, ansible など、一般的な話題も多いため、これらの事前経験があれば、入りやすいかもしれない。
ただ、Junos 特化の内容も多いため、ある程度実機で試してから受ける方が、より確実と思われる。(vMX, vSRX 等でも試せる範囲)
※ JNCIA では Junos の REST API explorer の設定方法、JNCIS では SLAX 全般、op / commit / event / snmp script のコンフィグ方法、等が範囲に含まれる

これ以外にも、 JNCIS では Ruby, RubyEZ, JET, JSNAPy 等も範囲になるので、マニュアルを一読しつつ、可能であれば、一度は実機で試しておいた方がよいかもしれない。


公式トレーニングもあるので、可能であれば、受講するのが確実と思われる。ただ、 JNCIS-Cloud 等と比べると、比較的、自習はしやすい印象を受けた。


こちらも、自習する場合、Junos Genius で、模擬問題が手に入るので、事前に目を通しておくことをおすすめする。
※ JNCIA-DevOps については、無料で取得できるが、JNCIS-DevOps については、有料、かつ期間制限ありとなるので、注意
https://www.juniper.net/jp/jp/training/junos-genius/

追記:
- 比較的多かった出題として、 NETCONF の transport, messages, operations, content の違い、があったので、チェックしていくとよいかもしれない
- mgd, jsd の用途、も多かった

JNCIA-Cloud, JNCIS-Cloud 取得記

 

先日、JNCIA-Cloud, JNCIS-Cloud を取得したので、その時のメモとなる。
https://www.juniper.net/jp/jp/training/certification/certification-tracks/cloud-track?tab=jncia-cloud
https://www.juniper.net/jp/jp/training/certification/certification-tracks/cloud-track?tab=jncis-cloud

 

こちらの資格は、 Juniper Networks から提供されている Cloud Track の資格で、大まかには Contrail Series を中心とした、 SDN の話題を扱っている。
※ ただし、(特に JNCIA-Cloudでは) Northstar 等、 MPLS-Core 用 SDN の問題も出るので、範囲そのものはかなり広い

 

基本的に出題範囲は、サイトに記載されている通りで、JNCIA-Cloud では、Contrail Networking, Openstack (nova とは何か? 等), NorthStar, Contrail Service Orchestration 等が出題される。少し意外だったのだが、これ以外に vSRX, Security Director, SkyATP, vMX 等も範囲になっており、問題もそれなりの数が出題されてくるので、このあたりもある程度調べていった方がよいかもしれない。
※ 選択式なので、難易度そのものはさほど高くないが、知らないと回答できない問題も、一定数は出てくる

 

JNCIS-Cloud は、ほぼ完全に Contrail Networking の試験となっており、SDN とは何か?, この場合のopenstack構成方法は?, サービスチェインの設定方法?, AnalyzerVM の設定方法?, vRouter の動作? 等、Contrail Networking の動作・設定方法について、かなり細かい出題が行われる。こちらも選択式だが、ある程度実機で確認を行ってから受験するか、可能であれば、公式トレーニングを受けてからの方がよいかもしれない。

 

自習する場合、Junos Genius で、模擬問題が手に入る。
※ JNCIA-Cloud については、無料で取得できるが、JNCIS-Cloud については、有料、かつ期間制限ありとなるので、注意
https://www.juniper.net/jp/jp/training/junos-genius/

juju charm による openstack / Tungsten Fabric インストール

以下の記述に従い、juju charm による openstack / Tungsten Fabric インストールを試してみている。
https://github.com/Juniper/contrail-charms/blob/R5/README.md
https://github.com/Juniper/contrail-charms/blob/R5/manual-deploy.md

環境としては、ubuntu xenial (AMI-ID: ami-06c43a7df16e8213c) 4台 (juju node, openstack controller, Tungsten Fabric Controller, openstack compute) を使用した。
※ 4vCPU, 15GB mem, 60 GB disk

openstack のバージョンとしては、ocata を使用した。
※ queens 等も試してみたのだが、なぜか Tungsten Fabric からの keystone v3 接続がうまくいかなかったため、今回は ocata で試してみている

実行したコマンドは以下となる。

(juju node 上で実施)
# apt-get update
# apt-get install juju

# juju add-cloud

Select cloud type: manual
Enter a name for your manual cloud: manual-cloud-1
Enter the controller's hostname or IP address: (juju node の ip を記載)

# ssh-keygen
# cd .ssh
# cat id_rsa.pub >> authorized_keys
# cd
※ 他のノードの /root/.ssh/authorized_keys にも、上記の公開鍵を追加しておく

# juju bootstrap manual-cloud-1
 -> 2分程度必要

# git clone https://github.com/Juniper/contrail-charms -b R5

# juju add-machine ssh:root@(openstack-controllerのip)
# juju add-machine ssh:root@(openstack-computeのip)
# juju add-machine ssh:root@(TungstenFabric-controllerのip)
※ それぞれ 2分程度必要


# vi set-juju.sh 
juju deploy cs:xenial/ntp
juju deploy cs:xenial/rabbitmq-server --to lxd:0
juju deploy cs:xenial/percona-cluster mysql --config root-password=contrail123 --config max-connections=1500 --to lxd:0
juju deploy cs:xenial/openstack-dashboard --config openstack-origin=cloud:xenial-ocata --to lxd:0
juju deploy cs:xenial/nova-cloud-controller --config console-access-protocol=novnc --config openstack-origin=cloud:xenial-ocata --config network-manager=Neutron --to lxd:0
juju deploy cs:xenial/neutron-api --config manage-neutron-plugin-legacy-mode=false --config openstack-origin=cloud:xenial-ocata --config neutron-security-groups=true --to lxd:0
juju deploy cs:xenial/glance --config openstack-origin=cloud:xenial-ocata --to lxd:0
juju deploy cs:xenial/keystone --config admin-password=contrail123 --config admin-role=admin --config openstack-origin=cloud:xenial-ocata --to lxd:0

juju deploy cs:xenial/nova-compute --config ./nova-compute-config.yaml --to 1

CHARMS_DIRECTORY=/root
juju deploy --series=xenial $CHARMS_DIRECTORY/contrail-charms/contrail-keystone-auth --to 2
juju deploy --series=xenial $CHARMS_DIRECTORY/contrail-charms/contrail-controller --config auth-mode=rbac --config cassandra-minimum-diskgb=4 --config cassandra-jvm-extra-opts="-Xms1g -Xmx2g" --to 2
juju deploy --series=xenial $CHARMS_DIRECTORY/contrail-charms/contrail-analyticsdb --config cassandra-minimum-diskgb=4 --config cassandra-jvm-extra-opts="-Xms1g -Xmx2g" --to 2
juju deploy --series=xenial $CHARMS_DIRECTORY/contrail-charms/contrail-analytics --to 2
juju deploy --series=xenial $CHARMS_DIRECTORY/contrail-charms/contrail-openstack
juju deploy --series=xenial $CHARMS_DIRECTORY/contrail-charms/contrail-agent

juju expose openstack-dashboard
juju expose nova-cloud-controller
juju expose neutron-api
juju expose glance
juju expose keystone

juju expose contrail-controller
juju expose contrail-analytics

juju add-relation keystone:shared-db mysql:shared-db
juju add-relation glance:shared-db mysql:shared-db
juju add-relation keystone:identity-service glance:identity-service
juju add-relation nova-cloud-controller:image-service glance:image-service
juju add-relation nova-cloud-controller:identity-service keystone:identity-service
juju add-relation nova-cloud-controller:cloud-compute nova-compute:cloud-compute
juju add-relation nova-compute:image-service glance:image-service
juju add-relation nova-compute:amqp rabbitmq-server:amqp
juju add-relation nova-cloud-controller:shared-db mysql:shared-db
juju add-relation nova-cloud-controller:amqp rabbitmq-server:amqp
juju add-relation openstack-dashboard:identity-service keystone

juju add-relation neutron-api:shared-db mysql:shared-db
juju add-relation neutron-api:neutron-api nova-cloud-controller:neutron-api
juju add-relation neutron-api:identity-service keystone:identity-service
juju add-relation neutron-api:amqp rabbitmq-server:amqp

juju add-relation contrail-controller ntp
juju add-relation nova-compute:juju-info ntp:juju-info

juju add-relation contrail-controller contrail-keystone-auth
juju add-relation contrail-keystone-auth keystone
juju add-relation contrail-controller contrail-analytics
juju add-relation contrail-controller contrail-analyticsdb
juju add-relation contrail-analytics contrail-analyticsdb

juju add-relation contrail-openstack neutron-api
juju add-relation contrail-openstack nova-compute
juju add-relation contrail-openstack contrail-controller

juju add-relation contrail-agent:juju-info nova-compute:juju-info
juju add-relation contrail-agent contrail-controller

# vi nova-compute-config.yaml 
nova-compute:
    openstack-origin: cloud:xenial-ocata
    virt-type: qemu 
    enable-resize: True
    enable-live-migration: True
    migration-auth-type: ssh

# bash set-juju.sh

以下、完了まで定期的に status を確認 (20分程度必要となった)
# juju status
# tail -f /var/log/juju/*log | grep -v -w DEBUG

注意点として、以下の二点が必要となった。
1. openstack-controller では LXD が使用されており、こちらと、Tungsten Fabric controller が直接疎通できる必要があった。このため、VPC の route table に LXD 用の /24 route を追加 (openstack controller の instance に紐付け) し、openstack controller 用 instance の送信元/送信先のチェック、を無効化している。
2. LXD コンテナ内で、 docker が起動出来ない (Tungsten Fabric の neutron-init で必要) 事象が発生したため、以下で LXD の設定を行っている。

juju ssh 0 ## openstack controller にログイン
  sudo su -
  lxc list ## neutron 用 LXD の id を確認
  lxc config set juju-cb8047-0-lxd-4 security.nesting true
  lxc config show juju-cb8047-0-lxd-4

上手くインストールが完了すると、以下のように openstack / Tungsten Fabric の組み合わせが使用できるようになるはずである。

root@ip-172-31-19-222:~# juju status
Model    Controller      Cloud/Region    Version  SLA
default  manual-cloud-1  manual-cloud-1  2.3.7    unsupported

App                     Version        Status  Scale  Charm                   Store       Rev  OS      Notes
contrail-agent          5.1.0-708.el7  active      1  contrail-agent          local         0  ubuntu  
contrail-analytics      5.1.0-708.el7  active      1  contrail-analytics      local         0  ubuntu  exposed
contrail-analyticsdb    5.1.0-708.el7  active      1  contrail-analyticsdb    local         0  ubuntu  
contrail-controller     5.1.0-708.el7  active      1  contrail-controller     local         0  ubuntu  exposed
contrail-keystone-auth                 active      1  contrail-keystone-auth  local         0  ubuntu  
contrail-openstack      5.1.0-708.el7  active      2  contrail-openstack      local         0  ubuntu  
glance                  14.0.1         active      1  glance                  jujucharms  278  ubuntu  exposed
keystone                11.0.4         active      1  keystone                jujucharms  298  ubuntu  exposed
mysql                   5.6.37-26.21   active      1  percona-cluster         jujucharms  275  ubuntu  
neutron-api             10.0.7         active      1  neutron-api             jujucharms  272  ubuntu  exposed
nova-cloud-controller   15.1.5         active      1  nova-cloud-controller   jujucharms  327  ubuntu  exposed
nova-compute            15.1.5         active      1  nova-compute            jujucharms  299  ubuntu  
ntp                     4.2.8p4+dfsg   active      2  ntp                     jujucharms   32  ubuntu  
openstack-dashboard     11.0.4         active      1  openstack-dashboard     jujucharms  280  ubuntu  exposed
rabbitmq-server         3.5.7          active      1  rabbitmq-server         jujucharms   88  ubuntu  

Unit                       Workload  Agent  Machine  Public address  Ports                       Message
contrail-analytics/0*      active    idle   2        172.31.35.214                               Unit is ready
contrail-analyticsdb/0*    active    idle   2        172.31.35.214                               Unit is ready
contrail-controller/0*     active    idle   2        172.31.35.214   8080/tcp,8082/tcp,8143/tcp  Unit is ready
  ntp/0*                   active    idle            172.31.35.214   123/udp                     ntp: Ready
contrail-keystone-auth/0*  active    idle   2        172.31.35.214                               Unit is ready
glance/0*                  active    idle   0/lxd/5  10.0.206.248    9292/tcp                    Unit is ready
keystone/0*                active    idle   0/lxd/6  10.0.206.215    5000/tcp                    Unit is ready
mysql/0*                   active    idle   0/lxd/1  10.0.206.124    3306/tcp                    Unit is ready
neutron-api/0*             active    idle   0/lxd/4  10.0.206.164    9696/tcp                    Unit is ready
  contrail-openstack/1     active    idle            10.0.206.164                                Unit is ready
nova-cloud-controller/0*   active    idle   0/lxd/3  10.0.206.157    8774/tcp,8778/tcp           Unit is ready
nova-compute/0*            active    idle   1        13.112.122.142                              Unit is ready
  contrail-agent/0*        active    idle            13.112.122.142                              Unit is ready
  contrail-openstack/0*    active    idle            13.112.122.142                              Unit is ready
  ntp/1                    active    idle            13.112.122.142  123/udp                     ntp: Ready
openstack-dashboard/0*     active    idle   0/lxd/2  10.0.206.82     80/tcp,443/tcp              Unit is ready
rabbitmq-server/0*         active    idle   0/lxd/0  10.0.206.50     5672/tcp                    Unit is ready

Machine  State    DNS             Inst id                Series  AZ  Message
0        started  172.31.6.145    manual:172.31.6.145    xenial      Manually provisioned machine
0/lxd/0  started  10.0.206.50     juju-cb8047-0-lxd-0    xenial      Container started
0/lxd/1  started  10.0.206.124    juju-cb8047-0-lxd-1    xenial      Container started
0/lxd/2  started  10.0.206.82     juju-cb8047-0-lxd-2    xenial      Container started
0/lxd/3  started  10.0.206.157    juju-cb8047-0-lxd-3    xenial      Container started
0/lxd/4  started  10.0.206.164    juju-cb8047-0-lxd-4    xenial      Container started
0/lxd/5  started  10.0.206.248    juju-cb8047-0-lxd-5    xenial      Container started
0/lxd/6  started  10.0.206.215    juju-cb8047-0-lxd-6    xenial      Container started
1        started  13.112.122.142  manual:13.112.122.142  xenial      Manually provisioned machine
2        started  172.31.35.214   manual:172.31.35.214   xenial      Manually provisioned machine

Relation provider                          Requirer                                    Interface                       Type         Message
contrail-analytics:analytics-cluster       contrail-analytics:analytics-cluster        contrail-analytics-cluster      peer         
contrail-analytics:contrail-analytics      contrail-controller:contrail-analytics      contrail-analytics              regular      
contrail-analyticsdb:analyticsdb-cluster   contrail-analyticsdb:analyticsdb-cluster    contrail-analyticsdb-cluster    peer         
contrail-analyticsdb:contrail-analyticsdb  contrail-analytics:contrail-analyticsdb     contrail-analyticsdb            regular      
contrail-analyticsdb:contrail-analyticsdb  contrail-controller:contrail-analyticsdb    contrail-analyticsdb            regular      
contrail-controller:contrail-controller    contrail-agent:contrail-controller          contrail-controller             regular      
contrail-controller:contrail-controller    contrail-openstack:contrail-controller      contrail-controller             regular      
contrail-controller:controller-cluster     contrail-controller:controller-cluster      contrail-controller-cluster     peer         
contrail-controller:juju-info              ntp:juju-info                               juju-info                       subordinate  
contrail-keystone-auth:contrail-auth       contrail-controller:contrail-auth           contrail-auth                   regular      
contrail-openstack:cluster                 contrail-openstack:cluster                  contrail-openstack-cluster      peer         
contrail-openstack:neutron-api             neutron-api:neutron-plugin-api-subordinate  neutron-plugin-api-subordinate  subordinate  
contrail-openstack:nova-compute            nova-compute:neutron-plugin                 neutron-plugin                  subordinate  
glance:cluster                             glance:cluster                              glance-ha                       peer         
glance:image-service                       nova-cloud-controller:image-service         glance                          regular      
glance:image-service                       nova-compute:image-service                  glance                          regular      
keystone:cluster                           keystone:cluster                            keystone-ha                     peer         
keystone:identity-admin                    contrail-keystone-auth:identity-admin       keystone-admin                  regular      
keystone:identity-service                  glance:identity-service                     keystone                        regular      
keystone:identity-service                  neutron-api:identity-service                keystone                        regular      
keystone:identity-service                  nova-cloud-controller:identity-service      keystone                        regular      
keystone:identity-service                  openstack-dashboard:identity-service        keystone                        regular      
mysql:cluster                              mysql:cluster                               percona-cluster                 peer         
mysql:shared-db                            glance:shared-db                            mysql-shared                    regular      
mysql:shared-db                            keystone:shared-db                          mysql-shared                    regular      
mysql:shared-db                            neutron-api:shared-db                       mysql-shared                    regular      
mysql:shared-db                            nova-cloud-controller:shared-db             mysql-shared                    regular      
neutron-api:cluster                        neutron-api:cluster                         neutron-api-ha                  peer         
neutron-api:neutron-api                    nova-cloud-controller:neutron-api           neutron-api                     regular      
nova-cloud-controller:cluster              nova-cloud-controller:cluster               nova-ha                         peer         
nova-compute:cloud-compute                 nova-cloud-controller:cloud-compute         nova-compute                    regular      
nova-compute:compute-peer                  nova-compute:compute-peer                   nova                            peer         
nova-compute:juju-info                     contrail-agent:juju-info                    juju-info                       subordinate  
nova-compute:juju-info                     ntp:juju-info                               juju-info                       subordinate  
ntp:ntp-peers                              ntp:ntp-peers                               ntp                             peer         
openstack-dashboard:cluster                openstack-dashboard:cluster                 openstack-dashboard-ha          peer         
rabbitmq-server:amqp                       neutron-api:amqp                            rabbitmq                        regular      
rabbitmq-server:amqp                       nova-cloud-controller:amqp                  rabbitmq                        regular      
rabbitmq-server:amqp                       nova-compute:amqp                           rabbitmq                        regular      
rabbitmq-server:cluster                    rabbitmq-server:cluster                     rabbitmq-ha                     peer         

root@ip-172-31-19-222:~# 

root@ip-172-31-35-214:~# contrail-status 
Pod              Service         Original Name                          State    Id            Status        
                 redis           contrail-external-redis                running  d4d57d26cadf  Up 8 minutes  
analytics        api             contrail-analytics-api                 running  da9de5110f9f  Up 8 minutes  
analytics        collector       contrail-analytics-collector           running  ac04930bc5c1  Up 8 minutes  
analytics        nodemgr         contrail-nodemgr                       running  a48717a004c2  Up 8 minutes  
analytics-alarm  alarm-gen       contrail-analytics-alarm-gen           running  9fe1da20a9e8  Up 8 minutes  
analytics-alarm  kafka           contrail-external-kafka                running  f7e964a49cd7  Up 8 minutes  
analytics-alarm  nodemgr         contrail-nodemgr                       running  607f2ef09c5d  Up 8 minutes  
analytics-snmp   nodemgr         contrail-nodemgr                       running  10bbff7fe1b1  Up 8 minutes  
analytics-snmp   snmp-collector  contrail-analytics-snmp-collector      running  082f6ebcbd37  Up 8 minutes  
analytics-snmp   topology        contrail-analytics-snmp-topology       running  cd3b563f3bbb  Up 8 minutes  
config           api             contrail-controller-config-api         running  3631e5abe9b6  Up 8 minutes  
config           device-manager  contrail-controller-config-devicemgr   running  8eaedcd070ae  Up 8 minutes  
config           nodemgr         contrail-nodemgr                       running  07203da0a748  Up 8 minutes  
config           schema          contrail-controller-config-schema      running  8c6a339dd6d0  Up 8 minutes  
config           svc-monitor     contrail-controller-config-svcmonitor  running  44856f8ea9bc  Up 8 minutes  
config-database  cassandra       contrail-external-cassandra            running  22483d05229e  Up 8 minutes  
config-database  nodemgr         contrail-nodemgr                       running  f7658b9c04af  Up 8 minutes  
config-database  rabbitmq        contrail-external-rabbitmq             running  0225630978a7  Up 8 minutes  
config-database  zookeeper       contrail-external-zookeeper            running  4e3d96385f92  Up 8 minutes  
control          control         contrail-controller-control-control    running  382be60341ce  Up 8 minutes  
control          dns             contrail-controller-control-dns        running  14cb5dda1dc3  Up 8 minutes  
control          named           contrail-controller-control-named      running  67279cdc5385  Up 8 minutes  
control          nodemgr         contrail-nodemgr                       running  0456c3f4ade4  Up 8 minutes  
database         cassandra       contrail-external-cassandra            running  de289b60d667  Up 8 minutes  
database         nodemgr         contrail-nodemgr                       running  8289c2002bca  Up 8 minutes  
database         query-engine    contrail-analytics-query-engine        running  b6fe0b3f6ef4  Up 8 minutes  
webui            job             contrail-controller-webui-job          running  4f4a5c07e1fb  Up 6 minutes  
webui            web             contrail-controller-webui-web          running  f56ff61fef1f  Up 6 minutes  

== Contrail control ==
control: active
nodemgr: active
named: active
dns: active

== Contrail analytics-alarm ==
nodemgr: active
kafka: active
alarm-gen: active

== Contrail database ==
nodemgr: active
query-engine: active
cassandra: active

== Contrail analytics ==
nodemgr: active
api: active
collector: active

== Contrail config-database ==
nodemgr: active
zookeeper: active
rabbitmq: active
cassandra: active

== Contrail webui ==
web: active
job: active

== Contrail analytics-snmp ==
snmp-collector: active
nodemgr: active
topology: active

== Contrail config ==
svc-monitor: active
nodemgr: active
device-manager: active
api: active
schema: active

root@ip-172-31-35-214:~# 

root@ip-172-31-4-230:~# contrail-status 
Pod      Service  Original Name           State    Id            Status        
vrouter  agent    contrail-vrouter-agent  running  b30c790ac0f1  Up 8 minutes  
vrouter  nodemgr  contrail-nodemgr        running  47be0b238f30  Up 7 minutes  

vrouter kernel module is PRESENT
== Contrail vrouter ==
nodemgr: active
agent: active

root@ip-172-31-4-230:~# 
root@ip-172-31-4-230:~# docker images
REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
opencontrailnightly/contrail-vrouter-kernel-build-init   latest              9717147e05b3        18 hours ago        255MB
opencontrailnightly/contrail-vrouter-agent               latest              4b4f4651d8b7        18 hours ago        1.41GB
opencontrailnightly/contrail-status                      latest              fa3a147f3236        18 hours ago        1GB
opencontrailnightly/contrail-openstack-compute-init      latest              ba1e85fdb5bb        18 hours ago        1GB
opencontrailnightly/contrail-nodemgr                     latest              fd743b6a284f        18 hours ago        1.01GB
opencontrailnightly/contrail-node-init                   latest              868186c43bf5        18 hours ago        1GB
opencontrailnightly/contrail-base                        latest              d85a1c331fa3        18 hours ago        979MB
root@ip-172-31-4-230:~# 

root@ip-172-31-35-214:~# cat openstackrc 
export OS_USERNAME=admin
export OS_PASSWORD=contrail123
export OS_TENANT_NAME=admin
export OS_REGION_NAME=RegionOne
export OS_AUTH_URL=http://10.0.206.215:5000/v2.0
root@ip-172-31-35-214:~# 

pip install python-openstackclient
source openstackrc

root@ip-172-31-35-214:~# openstack network list
+--------------------------------------+-------------------------+---------+
| ID                                   | Name                    | Subnets |
+--------------------------------------+-------------------------+---------+
| 6d4589ca-eb25-4182-812c-f47f53d0b9d8 | __link_local__          |         |
| cd9b79f0-9b05-4820-865a-fe1ab9446f88 | ip-fabric               |         |
| cf4871f6-35be-4f02-8ad7-04dc21e95440 | default-virtual-network |         |
| 1d36fa0d-90be-42c2-b651-cc147969d152 | dci-network             |         |
+--------------------------------------+-------------------------+---------+
root@ip-172-31-35-214:~# 

root@ip-172-31-35-214:~# ./contrail-introspect-cli/ist.py ctr route summary
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
| name                                               | prefixes | paths | primary_paths | secondary_paths | infeasible_paths |
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
| default-domain:default-                            | 0        | 0     | 0             | 0               | 0                |
| project:__link_local__:__link_local__.inet.0       |          |       |               |                 |                  |
| default-domain:default-project:dci-                | 0        | 0     | 0             | 0               | 0                |
| network:__default__.inet.0                         |          |       |               |                 |                  |
| default-domain:default-project:dci-network:dci-    | 0        | 0     | 0             | 0               | 0                |
| network.inet.0                                     |          |       |               |                 |                  |
| default-domain:default-project:default-virtual-    | 0        | 0     | 0             | 0               | 0                |
| network:default-virtual-network.inet.0             |          |       |               |                 |                  |
| inet.0                                             | 0        | 0     | 0             | 0               | 0                |
| default-domain:default-project:ip-fabric:ip-       | 1        | 1     | 1             | 0               | 0                |
| fabric.inet.0                                      |          |       |               |                 |                  |
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
root@ip-172-31-35-214:~# 

curl -O http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
openstack image create cirros --disk-format qcow2 --public --container-format bare --file cirros-0.4.0-x86_64-disk.img
openstack flavor create --ram 512 --disk 1 --vcpus 1 m1.tiny
openstack network create testvn
openstack subnet create --subnet-range 192.168.100.0/24 --network testvn subnet1
NET_ID=`openstack network list | grep testvn | awk -F '|' '{print $2}' | tr -d ' '`
openstack server create --flavor m1.tiny --image cirros --nic net-id=${NET_ID} vm1
openstack server create --flavor m1.tiny --image cirros --nic net-id=${NET_ID} vm2

root@ip-172-31-35-214:~# openstack server list
+--------------------------------------+------+--------+----------------------+--------+---------+
| ID                                   | Name | Status | Networks             | Image  | Flavor  |
+--------------------------------------+------+--------+----------------------+--------+---------+
| 36970673-a7b7-4248-8ea8-207bfc808beb | vm2  | ACTIVE | testvn=192.168.100.4 | cirros | m1.tiny |
| 7e222583-e37b-4570-a5a8-fda4d2ca7d5b | vm1  | ACTIVE | testvn=192.168.100.3 | cirros | m1.tiny |
+--------------------------------------+------+--------+----------------------+--------+---------+
root@ip-172-31-35-214:~# 

root@ip-172-31-35-214:~# ./contrail-introspect-cli/ist.py ctr route summary
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
| name                                               | prefixes | paths | primary_paths | secondary_paths | infeasible_paths |
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
| default-domain:admin:testvn:testvn.inet.0          | 2        | 2     | 2             | 0               | 0                |
| default-domain:default-                            | 0        | 0     | 0             | 0               | 0                |
| project:__link_local__:__link_local__.inet.0       |          |       |               |                 |                  |
| default-domain:default-project:dci-                | 0        | 0     | 0             | 0               | 0                |
| network:__default__.inet.0                         |          |       |               |                 |                  |
| default-domain:default-project:dci-network:dci-    | 0        | 0     | 0             | 0               | 0                |
| network.inet.0                                     |          |       |               |                 |                  |
| default-domain:default-project:default-virtual-    | 0        | 0     | 0             | 0               | 0                |
| network:default-virtual-network.inet.0             |          |       |               |                 |                  |
| inet.0                                             | 0        | 0     | 0             | 0               | 0                |
| default-domain:default-project:ip-fabric:ip-       | 1        | 1     | 1             | 0               | 0                |
| fabric.inet.0                                      |          |       |               |                 |                  |
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
root@ip-172-31-35-214:~# ./contrail-introspect-cli/ist.py ctr route show -t default-domain:admin:testvn:testvn.inet.0

default-domain:admin:testvn:testvn.inet.0: 2 destinations, 2 routes (2 primary, 0 secondary, 0 infeasible)

192.168.100.3/32, age: 0:00:43.784175, last_modified: 2019-May-04 08:35:34.135843
    [XMPP (interface)|ip-172-31-4-230.ap-northeast-1.compute.internal] age: 0:00:43.787824, localpref: 200, nh: 172.31.4.230, encap: ['gre', 'udp'], label: 25, AS path: None

192.168.100.4/32, age: 0:00:25.368270, last_modified: 2019-May-04 08:35:52.551748
    [XMPP (interface)|ip-172-31-4-230.ap-northeast-1.compute.internal] age: 0:00:25.372239, localpref: 200, nh: 172.31.4.230, encap: ['gre', 'udp'], label: 30, AS path: None
root@ip-172-31-35-214:~#

ubuntu@ip-172-31-4-230:~$ ip route
default via 172.31.0.1 dev vhost0 
169.254.0.1 dev vhost0  proto 109  scope link 
169.254.0.3 dev vhost0  proto 109  scope link 
169.254.0.4 dev vhost0  proto 109  scope link 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown 
172.31.0.0/20 dev vhost0  proto kernel  scope link  src 172.31.4.230 
ubuntu@ip-172-31-4-230:~$ 
ubuntu@ip-172-31-4-230:~$ ssh ^C
ubuntu@ip-172-31-4-230:~$ 
ubuntu@ip-172-31-4-230:~$ ssh cirros@169.254.0.3
The authenticity of host '169.254.0.3 (169.254.0.3)' can't be established.
ECDSA key fingerprint is SHA256:+dk0gBCbyj52tmf1QHD4J6Lem39S25dqfoIPw1VCzJs.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '169.254.0.3' (ECDSA) to the list of known hosts.
cirros@169.254.0.3's password: 
$ 
$ ip -o a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1\    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
1: lo    inet6 ::1/128 scope host \       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000\    link/ether 02:ac:c9:3a:e7:8e brd ff:ff:ff:ff:ff:ff
2: eth0    inet 192.168.100.3/24 brd 192.168.100.255 scope global eth0\       valid_lft forever preferred_lft forever
2: eth0    inet6 fe80::ac:c9ff:fe3a:e78e/64 scope link \       valid_lft forever preferred_lft forever
$ ping 192.168.100.4
PING 192.168.100.4 (192.168.100.4): 56 data bytes
64 bytes from 192.168.100.4: seq=0 ttl=64 time=4.563 ms
64 bytes from 192.168.100.4: seq=1 ttl=64 time=0.857 ms
^C
--- 192.168.100.4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.857/2.710/4.563 ms
$ 

2 kubernetes クラスタ間の名前解決

TungstenFabric の kubernetes クラスタ2組で、他のクラスタ内の svc / pod の名前解決、および ping 疎通が出来るか、を確認してみている。
環境としては、AWS 上の CentOS7.5 4台 (ami-3185744e, t2.medium) を使用した。

ansible-deployer でのインストールだと、 kubernetes クラスタが持つ ip subnet が重複してしまうため、今回は、 kubeadm を使って、kubernetes のインストールを行っている。
この際、 kubernetes で使用する subnet / service-dns-domain を変更したかったため、kubeadm init 実行時に以下のコマンドを使用している。

クラスタ0:
kubeadm init --pod-network-cidr=10.32.0.0/24 --service-cidr=10.96.0.0/24
クラスタ1:
kubeadm init --pod-network-cidr=10.32.1.0/24 --service-cidr=10.96.1.0/24 --service-dns-domain=cluster1.local

また、クラスタ1については、 coredns 用の svc ip も変更している (subnet の変更と合わせるため)

# cat /etc/sysconfig/kubelet 
-KUBELET_EXTRA_ARGS=
+KUBELET_EXTRA_ARGS="--cluster-dns=10.96.1.10"
# systemctl restart kubelet


TungstenFabric のインストール方法は、以下とほぼ同じだが、今回は、 TungstenFabric controller も、kubernetes 上で稼働させてみている。
http://aaabbb-200904.hatenablog.jp/entry/2019/03/17/222320

このため、TungstenFabric デプロイ時に使用する yaml が変わっている。

- # ./resolve-manifest.sh contrail-non-nested-kubernetes.yaml > cni-vrouter.yaml
+ # ./resolve-manifest.sh contrail-standalone-kubernetes.yaml > cni-vrouter.yaml 

他に、 cni-vrouter.yaml の編集時、および反映後に、以下を実施している。

cni-vrouter.yaml に以下を追記 (subnet, AS番号は、クラスタごとに重複しない値を指定):
  KUBERNETES_POD_SUBNETS: 10.32.1.0/24
  KUBERNETES_IP_FABRIC_SUBNETS: 10.64.1.0/24
  KUBERNETES_SERVICE_SUBNETS: 10.96.1.0/24
  JVM_EXTRA_OPTS: "-Xms128m -Xmx1g"
  BGP_ASN: "64513"
※ VROUTER_GATEWAY の行を削除 (こちらが残っていると、適用後に vRouter に疎通が取れなくなる)

# vi set-label.sh
masternode=$(kubectl get node | grep -w master | awk '{print $1}')
agentnodes=$(kubectl get node | grep -v -w -e master -e NAME | awk '{print $1}')
for i in config configdb analytics webui control
do
kubectl label node ${masternode} node-role.opencontrail.org/${i}=
done

for i in ${agentnodes}
do
kubectl label node ${i} node-role.opencontrail.org/agent=
done

# bash set-label.sh
※ controller, vrouter に、それぞれの role 割り当てを実施

controller, vrouter が上がってきたら、各クラスタの webui にアクセス出来ることを確認した後、1. k8s-pod-network, k8s-service-network に、route-target: 64512:11 を設定 2. controller 間で bgp peer を設定 を実施し、各クラスタの pod / svc 間で疎通が取れることを確認している。
http://aaabbb-200904.hatenablog.jp/entry/2017/11/06/011959

この後、coredns の設定を行うのだが、 coredns の deployment の状態を確認したところ、 pod が認識されていない状態だったため、以下のコマンドで、livenessProbe, readinessProbe の削除を行い、pod が認識されたことを確認している。(この作業を行わないと、coredns のpodが Service からの割り振り対象にならない)
# kubectl edit deployment -n kube-system coredns

また、1. 名前解決に時間がかかる事象の解消、2. service-dns-domain を元に 他クラスタへのforward、を実施するために、coredns の設定で、以下の変更を実施している。

# kubectl edit -n kube-system configmap coredns
1.
 -        forward . /etc/resolv.conf
 +        forward . 10.32.0.253
の変更を実施 (forward 先は、k8s-pod-network の service-ip に設定)
2.
    cluster1.local:53 {
        errors
        cache 30
        forward . 10.96.1.10
    }
を追記 (domain と forward 先が一致するように設定)

上記を実施することで、以下のように、クラスタ0, クラスタ1から、他のクラスタ内の pod の名前解決 / ping 疎通ができることを確認できた。

cluster0 -> cluster1:

/ # nslookup 10-32-1-249.default.pod.cluster1.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      10-32-1-249.default.pod.cluster1.local
Address 1: 10.32.1.249 ip-10-32-1-249.ap-northeast-1.compute.internal
/ # 

/ # ping 10-32-1-249.default.pod.cluster1.local
PING 10-32-1-249.default.pod.cluster1.local (10.32.1.249): 56 data bytes
64 bytes from 10.32.1.249: seq=0 ttl=63 time=1.025 ms
64 bytes from 10.32.1.249: seq=1 ttl=63 time=0.598 ms
^C
--- 10-32-1-249.default.pod.cluster1.local ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.598/0.811/1.025 ms
/ # 
/ # ip -o a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000\    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
1: lo    inet6 ::1/128 scope host \       valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue \    link/ether 02:10:48:88:da:59 brd ff:ff:ff:ff:ff:ff
15: eth0    inet 10.32.0.252/24 scope global eth0\       valid_lft forever preferred_lft forever
15: eth0    inet6 fe80::501c:63ff:fe7e:6166/64 scope link \       valid_lft forever preferred_lft forever
/ # 

cluster1 -> cluster0:

/ # nslookup 10-32-0-252.default.pod.cluster.local
Server:    10.96.1.10
Address 1: 10.96.1.10 kube-dns.kube-system.svc.cluster1.local

Name:      10-32-0-252.default.pod.cluster.local
Address 1: 10.32.0.252 ip-10-32-0-252.ap-northeast-1.compute.internal
/ # 
/ # 
/ # ping 10-32-0-252.default.pod.cluster.local
PING 10-32-0-252.default.pod.cluster.local (10.32.0.252): 56 data bytes
64 bytes from 10.32.0.252: seq=0 ttl=63 time=0.900 ms
64 bytes from 10.32.0.252: seq=1 ttl=63 time=0.535 ms
^C
--- 10-32-0-252.default.pod.cluster.local ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.535/0.717/0.900 ms
/ # 
/ # ip -o a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000\    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
1: lo    inet6 ::1/128 scope host \       valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue \    link/ether 02:74:65:28:34:59 brd ff:ff:ff:ff:ff:ff
9: eth0    inet 10.32.1.249/24 scope global eth0\       valid_lft forever preferred_lft forever
9: eth0    inet6 fe80::2c59:7bff:fe92:114c/64 scope link \       valid_lft forever preferred_lft forever
/ #

仮にクラスタが複数に分かれている場合も、 TungstenFabric 内で、かつ fqdn を使用すれば、あまりクラスタの違いを意識すること無く疎通が出来そうなことが分かった。
複数のクラスタを運用する場合は、適用してみてもよいのではなかろうか。

introspect-cli

TungstenFabric の control には多数のルートが登録されており、これらを cli で確認する方法を探していたのだが、以下のツールで実施することが出来たので、出力例を記載しておく。
https://github.com/vcheny/contrail-introspect-cli

特に

./ist.py ctr nei
./ist.py ctr route summary
./ist.py ctr route tables
./ist.py ctr route show [-t table] [-r] [prefix]
./ist.py vr xmpp
./ist.py vr vn
./ist.py vr vrf
./ist.py vr route
./ist.py (対応するコンポーネント) status

あたりは、troubleshoot に活用できそうである。

インストール方法
※ controller ノード上で実施
pip install lxml prettytable
git clone https://github.com/vcheny/contrail-introspect-cli.git
cd contrail-introspect-cli
出力結果
共通:
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py -h
usage: ist [-h] [--version] [--debug] [--host HOST] [--port PORT]
           
           {alarm_gen,analytics,cfg_api,cfg_disc,cfg_schema,cfg_svcmon,collector,ctr,dm,dns,nodemgr_analytics,nodemgr_cfg,nodemgr_ctr,nodemgr_db,nodemgr_vr,qe,vr}
           ...

A script to make Contrail Introspect output CLI friendly.

positional arguments:
  {alarm_gen,analytics,cfg_api,cfg_disc,cfg_schema,cfg_svcmon,collector,ctr,dm,dns,nodemgr_analytics,nodemgr_cfg,nodemgr_ctr,nodemgr_db,nodemgr_vr,qe,vr}
    alarm_gen           contrail-alarm-gen
    analytics           contrail-analytics-api
    cfg_api             contrail-api
    cfg_disc            contrail-discovery
    cfg_schema          contrail-schema
    cfg_svcmon          contrail-svc-monitor
    collector           contrail-collector
    ctr                 contrail-control
    dm                  contrail-device-manager
    dns                 contrail-dns
    nodemgr_analytics   contrail-analytics-nodemgr
    nodemgr_cfg         contrail-config-nodemgr
    nodemgr_ctr         contrail-control-nodemgr
    nodemgr_db          contrail-database-nodemgr
    nodemgr_vr          contrail-vrouter-nodemgr
    qe                  contrail-query-engine
    vr                  contrail-vrouter-agent

optional arguments:
  -h, --help            show this help message and exit
  --version             Script version
  --debug               Verbose mode
  --host HOST           Introspect host address. Default: localhost
  --port PORT           Introspect port number
[root@ip-172-31-42-64 contrail-introspect-cli]#


control:
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr -h
usage: ist ctr [-h]
               
               {status,cpu,trace,uve,nei,ri,route,mcast,bgp_stats,xmpp,ifmap,sc,config,rt}
               ...

positional arguments:
  {status,cpu,trace,uve,nei,ri,route,mcast,bgp_stats,xmpp,ifmap,sc,config,rt}
    status              Node/component status
    cpu                 CPU load info
    trace               Sandesh trace buffer
    uve                 Sandesh UVE cache
    nei                 Show BGP/XMPPP neighbors
    ri                  Show routing instances
    route               Show route info
    mcast               Show multicast managers
    bgp_stats           Show BGP server stats
    xmpp                Show XMPP info
    ifmap               Show IFMAP info
    sc                  Show ServiceChain info
    config              Show related config info
    rt                  Show RtGroup info

optional arguments:
  -h, --help            show this help message and exit
[root@ip-172-31-42-64 contrail-introspect-cli]# 


[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr status
module_id: contrail-control
state: Functional
description
+-----------+-----------+---------------------+--------+----------------------------------+
| type      | name      | server_addrs        | status | description                      |
+-----------+-----------+---------------------+--------+----------------------------------+
| Collector | n/a       |   172.31.42.64:8086 | Up     | Established                      |
| Database  | Cassandra |   172.31.42.64:9041 | Up     | Established Cassandra connection |
| Database  | RabbitMQ  |   172.31.42.64:5673 | Up     | RabbitMQ connection established  |
+-----------+-----------+---------------------+--------+----------------------------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr nei
+------------------------+---------------+----------+----------+-----------+-------------+------------+------------+-----------+
| peer                   | peer_address  | peer_asn | encoding | peer_type | state       | send_state | flap_count | flap_time |
+------------------------+---------------+----------+----------+-----------+-------------+------------+------------+-----------+
| ip-172-31-18-221.local | 172.31.18.221 | 0        | XMPP     | internal  | Established | in sync    | 0          | n/a       |
| ip-172-31-4-246.local  | 172.31.4.246  | 0        | XMPP     | internal  | Established | in sync    | 0          | n/a       |
+------------------------+---------------+----------+----------+-----------+-------------+------------+------------+-----------+
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr ri
+--------------------------------------+----------+----------+-------------------------+------------------------+------------------+
| name                                 | vn_index | vxlan_id | import_target           | export_target          | routing_policies |
+--------------------------------------+----------+----------+-------------------------+------------------------+------------------+
| default-domain:default-project:__lin | 3        | 0        |   target:64512:7999999  |                        |                  |
| k_local__:__link_local__             |          |          |   target:172.31.42.64:4 |                        |                  |
| default-domain:default-project:dci-  | 4        | 0        |   target:64512:7999999  |   target:64512:8000001 |                  |
| network:__default__                  |          |          |   target:64512:8000001  |                        |                  |
|                                      |          |          |   target:172.31.42.64:1 |                        |                  |
| default-domain:default-project:dci-  | 4        | 0        |   target:64512:7999999  |   target:64512:8000003 |                  |
| network:dci-network                  |          |          |   target:64512:8000003  |                        |                  |
|                                      |          |          |   target:172.31.42.64:5 |                        |                  |
| default-domain:default-project       | 1        | 0        |   target:64512:7999999  |   target:64512:8000000 |                  |
| :default-virtual-network:default-    |          |          |   target:64512:8000000  |                        |                  |
| virtual-network                      |          |          |   target:172.31.42.64:2 |                        |                  |
| default-domain:default-project:ip-   | 2        | 0        |                         |                        |                  |
| fabric:__default__                   |          |          |                         |                        |                  |
| default-domain:default-project:ip-   | 2        | 0        |   target:64512:7999999  |   target:64512:8000002 |                  |
| fabric:ip-fabric                     |          |          |   target:64512:8000002  |                        |                  |
|                                      |          |          |   target:64512:8000004  |                        |                  |
|                                      |          |          |   target:64512:8000005  |                        |                  |
|                                      |          |          |   target:172.31.42.64:3 |                        |                  |
| default-domain:k8s-default:k8s-      | 5        | 0        |   target:64512:7999999  |   target:64512:8000004 |                  |
| default-pod-network:k8s-default-pod- |          |          |   target:64512:8000002  |                        |                  |
| network                              |          |          |   target:64512:8000004  |                        |                  |
|                                      |          |          |   target:64512:8000005  |                        |                  |
|                                      |          |          |   target:172.31.42.64:6 |                        |                  |
| default-domain:k8s-default:k8s-      | 6        | 0        |   target:64512:7999999  |   target:64512:8000005 |                  |
| default-service-network:k8s-default- |          |          |   target:64512:8000002  |                        |                  |
| service-network                      |          |          |   target:64512:8000004  |                        |                  |
|                                      |          |          |   target:64512:8000005  |                        |                  |
|                                      |          |          |   target:172.31.42.64:7 |                        |                  |
+--------------------------------------+----------+----------+-------------------------+------------------------+------------------+
[root@ip-172-31-42-64 contrail-introspect-cli]#

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr route -h
usage: ist ctr route [-h] {summary,tables,show,static,aggregate} ...

positional arguments:
  {summary,tables,show,static,aggregate}
    summary             Show route summary
    tables              List route table names
    show                Show route
    static              Show static routes
    aggregate           Show aggregate routes

optional arguments:
  -h, --help            show this help message and exit

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr route summary
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
| name                                               | prefixes | paths | primary_paths | secondary_paths | infeasible_paths |
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
| default-domain:default-                            | 0        | 0     | 0             | 0               | 0                |
| project:__link_local__:__link_local__.inet.0       |          |       |               |                 |                  |
| default-domain:default-project:dci-                | 0        | 0     | 0             | 0               | 0                |
| network:__default__.inet.0                         |          |       |               |                 |                  |
| default-domain:default-project:dci-network:dci-    | 0        | 0     | 0             | 0               | 0                |
| network.inet.0                                     |          |       |               |                 |                  |
| default-domain:default-project:default-virtual-    | 0        | 0     | 0             | 0               | 0                |
| network:default-virtual-network.inet.0             |          |       |               |                 |                  |
| inet.0                                             | 0        | 0     | 0             | 0               | 0                |
| default-domain:default-project:ip-fabric:ip-       | 5        | 5     | 2             | 3               | 0                |
| fabric.inet.0                                      |          |       |               |                 |                  |
| default-domain:k8s-default:k8s-default-pod-network | 5        | 5     | 2             | 3               | 0                |
| :k8s-default-pod-network.inet.0                    |          |       |               |                 |                  |
| default-domain:k8s-default:k8s-default-service-    | 5        | 5     | 1             | 4               | 0                |
| network:k8s-default-service-network.inet.0         |          |       |               |                 |                  |
+----------------------------------------------------+----------+-------+---------------+-----------------+------------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# 

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr route tables
name: default-domain:default-project:__link_local__:__link_local__.inet.0
name: default-domain:default-project:dci-network:__default__.inet.0
name: default-domain:default-project:dci-network:dci-network.inet.0
name: default-domain:default-project:default-virtual-network:default-virtual-network.inet.0
name: inet.0
name: default-domain:default-project:ip-fabric:ip-fabric.inet.0
name: default-domain:k8s-default:k8s-default-pod-network:k8s-default-pod-network.inet.0
name: default-domain:k8s-default:k8s-default-service-network:k8s-default-service-network.inet.0
[root@ip-172-31-42-64 contrail-introspect-cli]# 

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr route show -h
usage: ist ctr route show [-h]
                          [-f {inet,inet6,evpn,ermvpn,rtarget,inetvpn,l3vpn}]
                          [-l LAST] [-d] [-r]
                          [-p {BGP,XMPP,local,ServiceChain,Static}] [-v VRF]
                          [-s SOURCE] [-t TABLE] [--longer_match]
                          [--shorter_match]
                          [prefix]

positional arguments:
  prefix                Show routes matching given prefix

optional arguments:
  -h, --help            show this help message and exit
  -f {inet,inet6,evpn,ermvpn,rtarget,inetvpn,l3vpn}, --family {inet,inet6,evpn,ermvpn,rtarget,inetvpn,l3vpn}
                        Show routes for given family.
  -l LAST, --last LAST  Show routes modified during last time period (e.g.
                        10s, 5m, 2h, or 5d)
  -d, --detail          Display detailed output
  -r, --raw             Display raw output in text
  -p {BGP,XMPP,local,ServiceChain,Static}, --protocol {BGP,XMPP,local,ServiceChain,Static}
                        Show routes learned from given protocol
  -v VRF, --vrf VRF     Show routes in given routing instance specified as fqn
  -s SOURCE, --source SOURCE
                        Show routes learned from given source
  -t TABLE, --table TABLE
                        Show routes in given table
  --longer_match        Shows more specific routes
  --shorter_match       Shows less specific routes
[root@ip-172-31-42-64 contrail-introspect-cli]# 


[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr route show -t default-domain:k8s-default:k8s-default-pod-network:k8s-default-pod-network.inet.0

default-domain:k8s-default:k8s-default-pod-network:k8s-default-pod-network.inet.0: 5 destinations, 5 routes (2 primary, 3 secondary, 0 infeasible)

10.47.255.251/32, age: 0:05:08.042661, last_modified: 2019-Apr-07 10:22:37.597451
    [XMPP (interface)|ip-172-31-4-246.local] age: 0:05:08.045915, localpref: 200, nh: 172.31.4.246, encap: ['gre', 'udp'], label: 30, AS path: None

10.47.255.252/32, age: 0:05:11.002858, last_modified: 2019-Apr-07 10:22:34.637254
    [XMPP (interface)|ip-172-31-4-246.local] age: 0:05:11.006508, localpref: 200, nh: 172.31.4.246, encap: ['gre', 'udp'], label: 25, AS path: None

10.96.0.10/32, age: 0:05:08.042742, last_modified: 2019-Apr-07 10:22:37.597370
    [XMPP (interface)|ip-172-31-4-246.local] age: 0:05:08.046665, localpref: 200, nh: 172.31.4.246, encap: ['gre', 'udp'], label: 37, AS path: None

172.31.4.246/32, age: 0:06:28.376773, last_modified: 2019-Apr-07 10:21:17.263339
    [XMPP (interface)|ip-172-31-4-246.local] age: 0:06:28.380937, localpref: 200, nh: 172.31.4.246, encap: ['gre', 'udp', 'native'], label: 16, AS path: None

172.31.18.221/32, age: 0:06:27.287767, last_modified: 2019-Apr-07 10:21:18.352345
    [XMPP (interface)|ip-172-31-18-221.local] age: 0:06:27.292165, localpref: 200, nh: 172.31.18.221, encap: ['gre', 'udp', 'native'], label: 16, AS path: None
[root@ip-172-31-42-64 contrail-introspect-cli]# 


[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py ctr xmpp conn
+------------------------+---------+---------------------+-------------------+-------------+-----------------------+------------+-----------------------------+-----------+------------------+------------+
| name                   | deleted | remote_endpoint     | local_endpoint    | state       | last_event            | last_state | last_state_at               | receivers | server_auth_type | dscp_value |
+------------------------+---------+---------------------+-------------------+-------------+-----------------------+------------+-----------------------------+-----------+------------------+------------+
| ip-172-31-4-246.local  | false   | 172.31.4.246:34576  | 172.31.42.64:5269 | Established | xmsm::EvXmppKeepalive | Active     | 2019-Apr-07 10:21:17.161634 |   IFMap   | NIL              | 0          |
|                        |         |                     |                   |             |                       |            |                             |   BGP     |                  |            |
| ip-172-31-18-221.local | false   | 172.31.18.221:39769 | 172.31.42.64:5269 | Established | xmsm::EvXmppKeepalive | Active     | 2019-Apr-07 10:21:18.252562 |   IFMap   | NIL              | 0          |
|                        |         |                     |                   |             |                       |            |                             |   BGP     |                  |            |
+------------------------+---------+---------------------+-------------------+-------------+-----------------------+------------+-----------------------------+-----------+------------------+------------+


vrouter:
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr -h
Introspect Host: 172.31.4.246
usage: ist vr [-h]
              
              {status,cpu,trace,uve,intf,vn,vrf,route,sg,acl,hc,ifmap,baas,xmpp,xmpp-dns,stats,service,si,nh,vm,mpls,vrfassign,linklocal,vxlan,mirror}
              ...

positional arguments:
  {status,cpu,trace,uve,intf,vn,vrf,route,sg,acl,hc,ifmap,baas,xmpp,xmpp-dns,stats,service,si,nh,vm,mpls,vrfassign,linklocal,vxlan,mirror}
    status              Node/component status
    cpu                 CPU load info
    trace               Sandesh trace buffer
    uve                 Sandesh UVE cache
    intf                Show vRouter interfaces
    vn                  Show Virtual Network
    vrf                 Show VRF
    route               Show routes
    sg                  Show Security Groups
    acl                 Show ACL info
    hc                  Health Check info
    ifmap               IFMAP info
    baas                Bgp As A Service info
    xmpp                Show Agent XMPP connections (route&config) status
    xmpp-dns            Show Agent XMPP connections (dns) status
    stats               Show Agent stats
    service             Service related info
    si                  Service instance info
    nh                  NextHop info
    vm                  VM info
    mpls                MPLS info
    vrfassign           VrfAssign info
    linklocal           LinkLocal service info
    vxlan               vxlan info
    mirror              mirror info

optional arguments:
  -h, --help            show this help message and exit
[root@ip-172-31-42-64 contrail-introspect-cli]#

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr status
Introspect Host: 172.31.4.246
module_id: contrail-vrouter-agent
state: Functional
description
+-----------+---------------------------+---------------------+--------+-------------+
| type      | name                      | server_addrs        | status | description |
+-----------+---------------------------+---------------------+--------+-------------+
| XMPP      | control-node:172.31.42.64 |   172.31.42.64:5269 | Up     | OpenSent    |
| XMPP      | dns-server:172.31.42.64   |   172.31.42.64:53   | Up     | OpenSent    |
| Collector | n/a                       |   172.31.42.64:8086 | Up     | Established |
+-----------+---------------------------+---------------------+--------+-------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr intf
Introspect Host: 172.31.4.246
+-------+----------------+--------+-------------------+---------------+---------------+---------+--------------------------------------+
| index | name           | active | mac_addr          | ip_addr       | mdata_ip_addr | vm_name | vn_name                              |
+-------+----------------+--------+-------------------+---------------+---------------+---------+--------------------------------------+
| 0     | eth0           | Active | n/a               | n/a           | n/a           | n/a     | n/a                                  |
| 1     | vhost0         | Active | 06:c2:b8:cd:fe:fc | 172.31.4.246  | 169.254.0.1   | n/a     | default-domain:default-project:ip-   |
|       |                |        |                   |               |               |         | fabric                               |
| 3     | tapeth0-1a3aed | Active | 02:c7:14:2f:38:59 | 10.47.255.252 | 169.254.0.3   | n/a     | default-domain:k8s-default:k8s-      |
|       |                |        |                   |               |               |         | default-pod-network                  |
| 4     | tapeth0-1a3bbd | Active | 02:c7:53:a3:fc:59 | 10.47.255.251 | 169.254.0.4   | n/a     | default-domain:k8s-default:k8s-      |
|       |                |        |                   |               |               |         | default-pod-network                  |
| 2     | pkt0           | Active | n/a               | n/a           | n/a           | n/a     | n/a                                  |
+-------+----------------+--------+-------------------+---------------+---------------+---------+--------------------------------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr vn
Introspect Host: 172.31.4.246
+--------------------------------------+--------------------------------------+-------------------+-----------------+------------+----------+
| name                                 | uuid                                 | layer2_forwarding | ipv4_forwarding | enable_rpf | bridging |
+--------------------------------------+--------------------------------------+-------------------+-----------------+------------+----------+
| default-domain:k8s-default:k8s-      | 1ca95bc7-2c74-492f-9aa9-05e755752ee5 | false             | true            | true       | false    |
| default-service-network              |                                      |                   |                 |            |          |
| default-domain:k8s-default:k8s-      | ab5a4cc8-1bce-4e68-a24a-72a0053cb711 | false             | true            | true       | false    |
| default-pod-network                  |                                      |                   |                 |            |          |
+--------------------------------------+--------------------------------------+-------------------+-----------------+------------+----------+
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr vrf
Introspect Host: 172.31.4.246
+--------------------------------------+---------+---------+---------+-----------+----------+--------------------------------------+
| name                                 | ucindex | mcindex | brindex | evpnindex | vxlan_id | vn                                   |
+--------------------------------------+---------+---------+---------+-----------+----------+--------------------------------------+
| default-domain:default-project:ip-   | 0       | 0       | 0       | 0         | 0        | N/A                                  |
| fabric:__default__                   |         |         |         |           |          |                                      |
| default-domain:default-project:ip-   | 1       | 1       | 1       | 1         | 2        | default-domain:default-project:ip-   |
| fabric:ip-fabric                     |         |         |         |           |          | fabric                               |
| default-domain:k8s-default:k8s-      | 2       | 2       | 2       | 2         | 5        | default-domain:k8s-default:k8s-      |
| default-pod-network:k8s-default-pod- |         |         |         |           |          | default-pod-network                  |
| network                              |         |         |         |           |          |                                      |
| default-domain:k8s-default:k8s-      | 3       | 3       | 3       | 3         | 6        | default-domain:k8s-default:k8s-      |
| default-service-network:k8s-default- |         |         |         |           |          | default-service-network              |
| service-network                      |         |         |         |           |          |                                      |
+--------------------------------------+---------+---------+---------+-----------+----------+--------------------------------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr route ## -v 0 (ip-fabric:__default__ の route が表示されている)
Introspect Host: 172.31.4.246
0.0.0.0/0
    [Local] pref:100
     nh_index:0 , nh_type:None, nh_policy:, active_label:-1, vxlan_id:0
169.254.0.3/32
    [LinkLocal] pref:100
     to 2:c7:14:2f:38:59 via tapeth0-1a3aed, assigned_label:29, nh_index:26 , nh_type:interface, nh_policy:enabled, active_label:29, vxlan_id:0
169.254.0.4/32
    [LinkLocal] pref:100
     to 2:c7:53:a3:fc:59 via tapeth0-1a3bbd, assigned_label:21, nh_index:16 , nh_type:interface, nh_policy:enabled, active_label:21, vxlan_id:0
172.31.0.0/20
    [LocalVmPort] pref:100
     nh_index:14 , nh_type:resolve, nh_policy:disabled, active_label:-1, vxlan_id:0
172.31.0.1/32
    [Local] pref:100
     via 6:8f:fa:85:cf:16, nh_index:15 , nh_type:arp, nh_policy:disabled, active_label:-1, vxlan_id:0
172.31.0.2/32
    [Local] pref:100
     via 6:8f:fa:85:cf:16, nh_index:39 , nh_type:arp, nh_policy:disabled, active_label:-1, vxlan_id:0
172.31.4.246/32
    [FabricRouteExport] pref:100
     via vhost0, nh_index:10 , nh_type:receive, nh_policy:disabled, active_label:0, vxlan_id:0
172.31.18.221/32
    [Local] pref:100
     nh_index:0 , nh_type:None, nh_policy:, active_label:0, vxlan_id:0
224.0.0.0/8
    [Local] pref:100
     via vhost0, nh_index:11 , nh_type:receive, nh_policy:enabled, active_label:0, vxlan_id:0
[root@ip-172-31-42-64 contrail-introspect-cli]#

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr route -v 2 ## k8s-pod-network を表示
Introspect Host: 172.31.4.246
10.32.0.0/12
    [Local] pref:100
     nh_index:1 , nh_type:discard, nh_policy:disabled, active_label:-1, vxlan_id:0
10.47.255.251/32
    [172.31.42.64] pref:200
     to 2:c7:53:a3:fc:59 via tapeth0-1a3bbd, assigned_label:21, nh_index:16 , nh_type:interface, nh_policy:enabled, active_label:21, vxlan_id:0
    [LocalVmPort] pref:200
     to 2:c7:53:a3:fc:59 via tapeth0-1a3bbd, assigned_label:21, nh_index:16 , nh_type:interface, nh_policy:enabled, active_label:21, vxlan_id:0
10.47.255.252/32
    [172.31.42.64] pref:200
     to 2:c7:14:2f:38:59 via tapeth0-1a3aed, assigned_label:29, nh_index:26 , nh_type:interface, nh_policy:enabled, active_label:29, vxlan_id:0
    [LocalVmPort] pref:200
     to 2:c7:14:2f:38:59 via tapeth0-1a3aed, assigned_label:29, nh_index:26 , nh_type:interface, nh_policy:enabled, active_label:29, vxlan_id:0
10.47.255.253/32
    [Local] pref:100
     to 0:0:0:0:0:1 via pkt0, assigned_label:-1, nh_index:13 , nh_type:interface, nh_policy:enabled, active_label:-1, vxlan_id:0
10.47.255.254/32
    [Local] pref:100
     to 0:0:0:0:0:1 via pkt0, assigned_label:-1, nh_index:13 , nh_type:interface, nh_policy:enabled, active_label:-1, vxlan_id:0
10.96.0.1/32
    [LinkLocal] pref:100
     via vhost0, nh_index:11 , nh_type:receive, nh_policy:enabled, active_label:0, vxlan_id:0
10.96.0.10/32
    [172.31.42.64] pref:200
     via ['tapeth0-1a3bbd', 'tapeth0-1a3aed'], nh_index:45 , nh_type:ECMP Composite sub nh count: 2, nh_policy:enabled, active_label:-1, vxlan_id:0
172.31.4.246/32
    [172.31.42.64] pref:200
     to 6:c2:b8:cd:fe:fc via vhost0, assigned_label:16, nh_index:5 , nh_type:interface, nh_policy:enabled, active_label:16, vxlan_id:0
172.31.18.221/32
    [172.31.42.64] pref:200
     to 6:8f:fa:85:cf:16 via MPLSoUDP dip:172.31.18.221 sip:172.31.4.246 label:16, nh_index:35 , nh_type:tunnel, nh_policy:disabled, active_label:16, vxlan_id:0
[root@ip-172-31-42-64 contrail-introspect-cli]# 

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr sg
Introspect Host: 172.31.4.246
+-----------+---------+--------------------------------------+----------+--------------------------------------+--------------------------------------+
| ref_count | sg_id   | sg_uuid                              | acl_uuid | egress_acl_uuid                      | ingress_acl_uuid                     |
+-----------+---------+--------------------------------------+----------+--------------------------------------+--------------------------------------+
| 2         | 8000005 | 20bb4785-6cd2-43c2-8160-7fbfb1c18e1d | n/a      | 2d7ab4e6-2758-441b-8743-2df5d9eb4ab8 | 024deaeb-5f79-4268-82b0-595e609d5c28 |
+-----------+---------+--------------------------------------+----------+--------------------------------------+--------------------------------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr acl
Introspect Host: 172.31.4.246
+--------------------------------------+--------------------------------------+-------------+
| uuid                                 | name                                 | dynamic_acl |
+--------------------------------------+--------------------------------------+-------------+
| 024deaeb-5f79-4268-82b0-595e609d5c28 | default-domain:k8s-kube-system:k8s-  | false       |
|                                      | kube-system-default-sg:ingress-      |             |
|                                      | access-control-list                  |             |
| 11d8294f-e049-42b9-a0e6-e64eb036fd5f | default-domain:k8s-default:k8s-      | false       |
|                                      | default-service-network:k8s-default- |             |
|                                      | service-network                      |             |
| 21deedf2-2c26-4897-b5a7-b5a0ca060532 | default-domain:k8s-default:k8s-      | false       |
|                                      | default-pod-network:k8s-default-pod- |             |
|                                      | network                              |             |
| 2d7ab4e6-2758-441b-8743-2df5d9eb4ab8 | default-domain:k8s-kube-system:k8s-  | false       |
|                                      | kube-system-default-sg:egress-       |             |
|                                      | access-control-list                  |             |
| b4e48fd4-e75d-4989-bc25-c55a99a998a8 | default-policy-management:k8s-       | false       |
|                                      | denyall                              |             |
| c5552c5f-f588-41f9-bcfd-62799e8483b0 | default-policy-management:k8s-       | false       |
|                                      | Ingress                              |             |
| edc2d263-d0f1-4f0d-ad39-0570153bc674 | default-policy-management:k8s-       | false       |
|                                      | allowall                             |             |
| f527d50b-5f0a-4aa3-8607-7514cb96b30f | default-domain:default-project:ip-   | false       |
|                                      | fabric:ip-fabric                     |             |
+--------------------------------------+--------------------------------------+-------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr xmpp
Introspect Host: 172.31.4.246
+---------------+-------------+-------------------------------------+-------------------+----------------+------------+-----------+
| controller_ip | state       | peer_name                           | peer_address      | cfg_controller | flap_count | flap_time |
+---------------+-------------+-------------------------------------+-------------------+----------------+------------+-----------+
| 172.31.42.64  | Established | network-control@contrailsystems.com | 172.31.42.64:5269 | Yes            | 0          | n/a       |
+---------------+-------------+-------------------------------------+-------------------+----------------+------------+-----------+
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr xmpp-dns
Introspect Host: 172.31.4.246
+-------------------+-------------+---------------------------------+-------------------+------------+-----------------------------+
| dns_controller_ip | state       | peer_name                       | peer_address      | flap_count | flap_time                   |
+-------------------+-------------+---------------------------------+-------------------+------------+-----------------------------+
| 172.31.42.64      | Established | network-dns@contrailsystems.com | 172.31.42.64:8093 | 0          | 1970-Jan-01 00:00:54.080512 |
+-------------------+-------------+---------------------------------+-------------------+------------+-----------------------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr stats
Introspect Host: 172.31.4.246
IpcStatsResp
  ipc_in_msgs: 0
  ipc_out_msgs: 0
PktTrapStatsResp
  exceptions: 1175
  invalid_agent_hdr: 0
  invalid_interface: 8
  no_handler: 0
  pkt_dropped: 8
  pkt_fragments_dropped: 0
FlowStatsResp
  flow_active: 60
  flow_created: 1079
  flow_aged: 1019
  flow_drop_due_to_max_limit: 0
  flow_drop_due_to_linklocal_limit: 0
  flow_max_system_flows: 629760
  flow_max_vm_flows: 0
XmppStatsInfo
  ip: 172.31.42.64
  in_msgs: 43
  out_msgs: 75
  reconnect: 1
  config_in_msgs: 22
SandeshStatsResp
  sandesh_in_msgs: 0
  sandesh_out_msgs: 0
  sandesh_http_sessions: 0
  sandesh_reconnects: 0
ShowIFMapAgentStatsResp
  node_updates_processed: 75
  node_deletes_processed: 0
  link_updates_processed: 88
  link_deletes_processed: 0
  node_update_parse_errors: 0
  link_update_parse_errors: 0
  node_delete_parse_errors: 0
  link_delete_parse_errors: 0
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr service
Introspect Host: 172.31.4.246
PktStats
  total_rcvd: 1183
  dhcp_rcvd: 0
  arp_rcvd: 626
  dns_rcvd: 4
  icmp_rcvd: 0
  flow_rcvd: 545
  dropped: 0
  total_sent: 952
  dhcp_sent: 0
  arp_sent: 948
  dns_sent: 4
  icmp_sent: 0
  dhcp_q_threshold_exceeded: 0
  arp_q_threshold_exceeded: 0
  dns_q_threshold_exceeded: 0
  icmp_q_threshold_exceeded: 0
  flow_q_threshold_exceeded: 0
  mac_learning_msg_rcvd: 0
DhcpStats
  dhcp_discover: 0
  dhcp_request: 0
  dhcp_inform: 0
  dhcp_decline: 0
  dhcp_other: 0
  dhcp_errors: 0
  offers_sent: 0
  acks_sent: 0
  nacks_sent: 0
  relay_request: 0
  relay_response: 0
ArpStats
  arp_entries: 2
  arp_requests: 5
  arp_replies: 624
  arp_gratuitous: 0
  arp_resolved: 2
  arp_max_retries_exceeded: 0
  arp_errors: 0
  arp_invalid_packets: 0
  arp_invalid_interface: 0
  arp_invalid_vrf: 0
  arp_invalid_address: 0
DnsStats
  dns_resolver
      172.31.42.64
  dscp: 0
  dns_requests: 4
  dns_resolved: 0
  dns_retransmit_reqs: 0
  dns_unsupported: 0
  dns_failures: 4
  dns_drops: 0
IcmpStats
  icmp_gw_ping: 0
  icmp_gw_ping_err: 0
  icmp_drop: 0
MetadataResponse
  metadata_server_port: 8097
  metadata_requests: 0
  metadata_responses: 0
  metadata_proxy_sessions: 0
  metadata_internal_errors: 0
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr vm
Introspect Host: 172.31.4.246
+--------------------------------------+----------------+
| uuid                                 | drop_new_flows |
+--------------------------------------+----------------+
| 1a3aedb4-591e-11e9-9fb1-0e78d1b55f1c | false          |
| 1a3bbd2e-591e-11e9-9fb1-0e78d1b55f1c | false          |
+--------------------------------------+----------------+
[root@ip-172-31-42-64 contrail-introspect-cli]# 

[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py --host 172.31.4.246 vr linklocal
Introspect Host: 172.31.4.246
+--------------------------------------+----------------------+------------------------+-------------------+----------------+---------------+
| linklocal_service_name               | linklocal_service_ip | linklocal_service_port | ipfabric_dns_name | ipfabric_ip    | ipfabric_port |
+--------------------------------------+----------------------+------------------------+-------------------+----------------+---------------+
| default-domain-k8s-default-          | 10.96.0.1            | 443                    | n/a               |   172.31.42.64 | 6443          |
| kubernetes-443                       |                      |                        |                   |                |               |
+--------------------------------------+----------------------+------------------------+-------------------+----------------+---------------+
[root@ip-172-31-42-64 contrail-introspect-cli]#

※ nh,mpls,vrfassign,vxlan,mirror は、対応する cli とほぼ同じだったので、割愛

その他 (collector, schema-transformer, svc-monitor 以外は status, cpu, trace, uve で共通なので、省略):
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py collector -h
usage: ist collector [-h] {status,cpu,trace,uve,server,redis} ...

positional arguments:
  {status,cpu,trace,uve,server,redis}
    status              Node/component status
    cpu                 CPU load info
    trace               Sandesh trace buffer
    uve                 Sandesh UVE cache
    server              Show collector server info
    redis               Show redis server UVE info

optional arguments:
  -h, --help            show this help message and exit
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py cfg_schema -h
usage: ist cfg_schema [-h] {status,cpu,trace,uve,vn,ri,sc,object} ...

positional arguments:
  {status,cpu,trace,uve,vn,ri,sc,object}
    status              Node/component status
    cpu                 CPU load info
    trace               Sandesh trace buffer
    uve                 Sandesh UVE cache
    vn                  List Virtual Networks
    ri                  List Routing Instances
    sc                  List Service Chains
    object              List Schema-transformer Ojbects

optional arguments:
  -h, --help            show this help message and exit
[root@ip-172-31-42-64 contrail-introspect-cli]# 
[root@ip-172-31-42-64 contrail-introspect-cli]# ./ist.py cfg_svcmon -h
usage: ist cfg_svcmon [-h] {status,cpu,trace,uve,si} ...

positional arguments:
  {status,cpu,trace,uve,si}
    status              Node/component status
    cpu                 CPU load info
    trace               Sandesh trace buffer
    uve                 Sandesh UVE cache
    si                  List service instances

optional arguments:
  -h, --help            show this help message and exit
[root@ip-172-31-42-64 contrail-introspect-cli]#

4,872ノードでの負荷状況

前回に続いて、4,872ノードでの負荷状況を確認してみている。
http://aaabbb-200904.hatenablog.jp/entry/2019/03/17/222320

※ 本来は kubernetes クラスタの最大数である、5,000ノードで検証したかったのだが、実機で試したときは このノード数しか起動できなかった、、
https://kubernetes.io/ja/docs/setup/cluster-large/

環境は GCP を使い、インスタンスイメージとしては、CentOS7 (centos-7-v20190312, CentOS7.6) を使用している。
controller兼analytics, k8s master を1台ずつ用意し、インスタンスタイプとしては、n1-highcpu-64 (64vCPU, 58GM mem, 30GB disk)を使用した。
vRouter としては、n1-standard-1 (1vCPU, 3.75GB mem, 10GB disk) を使用した。

手順は基本的に前回と同じだが、変更点として、global ip の数を節約するため、今回は controller/analytics, k8s master の2台にのみ、global ip を割り当て、vRouter のノードについては、private ip のみを割り当てる構成とした。 (default のサブネットは /20 となっており、5,000 ip が入りきらないため、別のVPC を作成し、10.0.0.0/9 を割り当てている) ただし、vRouterノードも、モジュールインストールのためにインターネットにアクセスする必要があるため、CloudNAT (ネットワークサービス > CloudNAT) を追加で作成するようにしている。
また、元々の設定だと、途中で、cassandra がスローダウンする動作となったため、以下のように heap size の最大値を20GBに変更し、事象を回避している。

JVM_EXTRA_OPTS: "-Xms128m -Xmx20g"

他に、前回と比べて追加したコマンドを列記しておく。

# kubectl label node instance-group-2-m2cq node-role.opencontrail.org/config=
  cni-vrouter.yaml の適用後、contrail-kube-manager を起動するために実施 (instance-group-2-m2cq には k8s master の node名を入力する)
  ※ upstream の変更に追随するため

# pip install google-cloud
$ gcloud init
$ gcloud auth login
$ gcloud --format="value(networkInterfaces[0].networkIP)" compute instances list
  GCP instances の ip をダンプするために使用

※ parallel -j 5000 にすると、実行ノードのメモリが枯渇したため、-j 3000, -j 2000 の2回に分けて実施した
ipの差分は以下で取得:
$ cat (インスタンスipをダンプしたファイルを全て列記) | sort | uniq -c | grep ' 1 ' | awk '{print $2}'

起動後、以下のように、4,872台の vRouter が登録される動作となった。
※ interface数は本来、4,878 (vRouter ごとに1, coredns x 2, この時起動していた cirros x2, default で作成される k8s service: kubernetes API, kube-dns) となるはずだったのだが、確認時は、なぜかこの値から変化しなかった、、(analytics-api の応答では、正しく4,878で出力されている、後述)
f:id:aaabbb_200904:20190402003622p:plain

負荷状況としては、controller兼analytics では、以下のように control が最も多くの cpu / mem を使用する動きとなった。
特に、メモリ使用量は前回と比べて大きく上昇しており、30GB を使用する動作となっている。
この状態でも、cirros への ip 払いだし、等は、問題なく実施できていたので、基本的な動作は継続できていたようである。

top - 16:01:05 up  1:17,  2 users,  load average: 62.04, 44.99, 35.31
Tasks: 572 total,   2 running, 570 sleeping,   0 stopped,   0 zombie
%Cpu(s): 65.6 us,  6.5 sy,  0.0 ni, 27.4 id,  0.0 wa,  0.0 hi,  0.4 si,  0.0 st
KiB Mem : 59192668 total, 11975852 free, 42433520 used,  4783296 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 15865188 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                             
19347 root      20   0   35.2g  31.1g  13688 S  3199 55.1 505:42.00 contrail-contro                                     
21052 root      20   0 7336100   2.2g  10960 S  1020  4.0 336:58.27 contrail-collec                                     
19339 root      20   0 5990856 562944  12160 S 286.5  1.0 110:07.13 contrail-dns                                        
21051 root      20   0  559792 259616   6464 R  92.7  0.4  10:36.47 python                                              
10429 polkitd   20   0  890380 854872   1668 S  52.8  1.4   9:47.83 redis-server                                        
13024 polkitd   20   0   34.5g 161112   3816 S  18.2  0.3  22:18.44 beam.smp                                            
 9538 root      20   0 3179672 113380  35224 S   7.6  0.2   4:27.13 dockerd                                             
19290 root      20   0  246400  40248   5284 S   2.3  0.1   0:42.96 python                                              
21044 root      20   0  246404  40192   5284 S   2.3  0.1   0:40.39 python     

$ free -h
              total        used        free      shared  buff/cache   available
Mem:            56G         40G         11G        9.8M        4.6G         15G
Swap:            0B          0B          0B

$ df -h .
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda1         30G  5.2G   25G   18% /

$ curl 172.16.1.18:8081/analytics/uves/vrouters | python -m json.tool | grep -w href | wc -l
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1065k  100 1065k    0     0  3268k      0 --:--:-- --:--:-- --:--:-- 3279k
4872

$ curl 172.16.1.18:8081/analytics/uves/virtual-machines | python -m json.tool | grep -w href | wc -l
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   768  100   768    0     0   230k      0 --:--:-- --:--:-- --:--:--  375k
4

$ curl 172.16.1.18:8081/analytics/uves/virtual-machine-interfaces | python -m json.tool | grep -w href | wc -l
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1495k  100 1495k    0     0  6018k      0 --:--:-- --:--:-- --:--:-- 6006k
4878
※ 4872(vRouter vhost0)+4(k8s pod: coredns, cirros x 2)+2(defaultで作成される k8s service: kubernetes, kube-dns)

k8s master は、前回と同じく、 kube-apiserver/etcd が最も多くの cpu / mem を使用する動作となった。

top - 15:55:01 up  1:11,  2 users,  load average: 27.01, 24.74, 21.02
Tasks: 610 total,   2 running, 608 sleeping,   0 stopped,   0 zombie
%Cpu(s): 31.2 us,  2.5 sy,  0.0 ni, 65.3 id,  0.2 wa,  0.0 hi,  0.8 si,  0.0 st
KiB Mem : 59192676 total, 41605700 free, 15398320 used,  2188656 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 42949840 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                           
20248 root      20   0   19.0g  10.6g  39724 S  1653 18.7 292:06.02 kube-apiserver                    
 9460 root      20   0   11.0g   1.6g 620208 S 359.3  2.8  54:45.80 etcd                              
20705 root      20   0 1406768   1.1g  30552 S 245.4  2.0  32:05.66 kube-controller                   
20410 root      20   0  385024 105376   5992 S  12.6  0.2   2:20.30 python                            
20257 root      20   0  635832 555136  15836 S   8.9  0.9   8:46.33 kube-scheduler                    
 9107 root      20   0 5875912  92168  17240 S   3.0  0.2   4:51.77 kubelet                           
 3285 root       0 -20       0      0      0 S   1.0  0.0   0:11.79 kworker/0:1H    

# free -h
              total        used        free      shared  buff/cache   available
Mem:            56G         14G         39G         66M        2.1G         40G
Swap:            0B          0B          0B

# df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        30G  4.7G   26G  16% /

# kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP              NODE                    NOMINATED NODE   READINESS GATES
cirros1   1/1     Running   0          77s   10.47.255.250   instance-group-2-4197   <none>           <none>
cirros2   1/1     Running   0          73s   10.47.255.249   instance-group-2-k7sr   <none>           <none>

今回、かなり多くの台数を controller/analytics に追加してみたのだが、実際のところ、ここまで多くのノードを1クラスタにおさめる必要があるのか、という議論はあり、管理を分離する、という意味では、アプリケーションごとに kubernetes クラスタを立てた方がよいかもしれない。
ただ、kubernetes クラスタを複数立てると、その間で連携を行うような操作が難しくなる。
この場合、TungstenFabric のように、多数のノードを1つのクラスタにいれておき、必要に応じて、アプリケーションごとのネットワーク分離の有効・無効を切り替える (policy 等も活用可能)、という動作の方がよいかもしれない。