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 等も活用可能)、という動作の方がよいかもしれない。

1,000ノードクラスタの負荷状況

多数のノードが含まれるクラスタでの負荷状況を確認するため、aws の環境を使って、1,000ノードのTungstenFabricクラスタを試してみている。

台数が多く、ansible-deployer だと構築に時間がかかったため、今回は以下のリンク先に従って、 kube-manager, vRouter のモジュールについては、kubernetes の機能を使って配布するようにした。
https://github.com/Juniper/contrail-ansible-deployer/wiki/Provision-Contrail-Kubernetes-Cluster-in-Non-nested-Mode

AMIについては、引き続き CentOS7.5 (ami-3185744e) を使用し、インスタンスタイプは、TungstenFabric controller, k8s master については、m3.xlarge (4vCPU, 16GB mem) 各1台, k8s node については、m3.medium (1vCPU, 4GB mem) 1,000台、を使用している。

1. TungstenFabric controller の構築

以下のリンクと同様、 ansible-deployer でインストールを行う。
http://aaabbb-200904.hatenablog.jp/entry/2019/02/10/222958

instance.yaml は、以下のように、controller 1台だけを指定している。(k8s_master, kube-managerは削除)

provider_config:
  bms:
   ssh_user: root
   ssh_public_key: /root/.ssh/id_rsa.pub
   ssh_private_key: /root/.ssh/id_rsa
   domainsuffix: local
   ntpserver: ntp.nict.jp
instances:
  bms1:
   provider: bms
   roles:
      config_database:
      config:
      control:
      analytics:
      webui:
   ip: 172.31.xx.xx
contrail_configuration:
  CONTAINER_REGISTRY: opencontrailnightly
  CONTRAIL_VERSION: latest
  KUBERNETES_CLUSTER_PROJECT: {}
  JVM_EXTRA_OPTS: "-Xms128m -Xmx1g"
global_configuration:

2. k8s master の構築

以下のリンクに従い、kubeadm を使った k8s master の構築を実施している。
https://github.com/Juniper/contrail-docker/wiki/Provision-Contrail-CNI-for-Kubernetes#faqs

# cd
# cat install-k8s-packages.sh
bash -c 'cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
     https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF'
setenforce 0
yum install -y kubelet kubeadm kubectl docker
systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
swapoff -a

# bash install-k8s-packages.sh

# kubeadm init
※ 以下のようなコマンドが表示されるのでひかえておく
kubeadm join 172.31.18.113:6443 --token we70in.mvy0yu0hnxb6kxip --discovery-token-ca-cert-hash sha256:13cf52534ab14ee1f4dc561de746e95bc7684f2a0355cb82eebdbd5b1e9f3634

# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config

3. k8s node の構築

上記のスクリプトk8s node でも実行し、その後、 kubeadm join を実施する必要がある。
並列で処理を実行するため、今回は GNU parallel と ssh を使用した。

まず、aws 内のノードについて、private ip の一覧を取得する。 (TungstenFabric controller, k8s master の ip は手動で削っておく)

$ pip install awscli
$ aws configure
 (access key, secret key, region 等を入力 (必要に応じて、 IAM から作成))
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].PrivateIpAddress' --output text | tr '\t' '\n' > /tmp/aaa.txt

その後、上記のリストを k8s master のインスタンスに送り、以下のようなコマンドで k8s node での実行を行う。(/tmp/aaa.pem は、EC2 インスタンス立ち上げ時に指定した pem ファイル)
※ 10-15分程度で完了した

yum -y install epel-release 
yum -y install parallel
ulimit -n 4096
cat aaa.txt | parallel -j1000 scp -i /tmp/aaa.pem -o StrictHostKeyChecking=no install-k8s-packages.sh centos@{}:/tmp
cat aaa.txt | parallel -j1000 ssh -i /tmp/aaa.pem -o StrictHostKeyChecking=no centos@{} chmod 755 /tmp/install-k8s-packages.sh
cat aaa.txt | parallel -j1000 ssh -i /tmp/aaa.pem -o StrictHostKeyChecking=no centos@{} sudo /tmp/install-k8s-packages.sh
cat aaa.txt | parallel -j1000 ssh -i /tmp/aaa.pem -o StrictHostKeyChecking=no centos@{} sudo kubeadm join 172.31.18.113:6443 --token we70in.mvy0yu0hnxb6kxip --discovery-token-ca-cert-hash sha256:13cf52534ab14ee1f4dc561de746e95bc7684f2a0355cb82eebdbd5b1e9f3634

4. vRouter の展開

上記が完了した後、 k8s master 上で以下を発行し、vRouter の展開を行う。(余分なコストがかかるのを防ぐため、kubectl apply 直前までは、k8s node を立ち上げる前に実施した方がよいかもしれない)

# cd
# yum -y install git
# git clone https://github.com/Juniper/contrail-container-builder.git
# cd /root/contrail-container-builder/kubernetes/manifests
# vi ../../common.env
(以下を追記)
CONTRAIL_CONTAINER_TAG=latest
CONTRAIL_REGISTRY=opencontrailnightly

# ./resolve-manifest.sh contrail-non-nested-kubernetes.yaml > cni-vrouter.yaml 
※ 手動で以下の修正を行う (1. Null になってしまう行を削除, 2. k8s master の ip が入ってしまう部分の一部を TungstenFabric controller の ip で置き換え)
--- cni-vrouter.yaml.orig	2019-03-17 21:17:25.218399040 +0900
+++ cni-vrouter.yaml	2019-03-17 21:19:40.744368162 +0900
@@ -11,36 +11,20 @@
   namespace: kube-system
 data:
   AUTH_MODE: {{ AUTH_MODE }}
-  KEYSTONE_AUTH_HOST: {{ KEYSTONE_AUTH_HOST }}
-  KEYSTONE_AUTH_ADMIN_TENANT: "{{ KEYSTONE_AUTH_ADMIN_TENANT }}"
-  KEYSTONE_AUTH_ADMIN_USER: "{{ KEYSTONE_AUTH_ADMIN_USER }}"
-  KEYSTONE_AUTH_ADMIN_PASSWORD: "{{ KEYSTONE_AUTH_ADMIN_PASSWORD }}"
-  KEYSTONE_AUTH_ADMIN_PORT: "{{ KEYSTONE_AUTH_ADMIN_PORT }}"
-  KEYSTONE_AUTH_URL_VERSION: "{{ KEYSTONE_AUTH_URL_VERSION }}"
-  ANALYTICS_API_VIP: {{ ANALYTICS_API_VIP }}
-  ANALYTICS_NODES: {{ ANALYTICS_NODES }}
-  ANALYTICSDB_NODES: {{ ANALYTICSDB_NODES }}
+  ANALYTICS_NODES: TungstenFabric controller IP
+  ANALYTICSDB_NODES: TungstenFabric controller IP
   CLOUD_ORCHESTRATOR: {{ CLOUD_ORCHESTRATOR }}
-  CONFIG_API_VIP: {{ CONFIG_API_VIP }}
-  CONFIG_NODES: {{ CONFIG_NODES }}
-  CONFIGDB_NODES: {{ CONFIGDB_NODES }}
-  CONTROL_NODES: {{ CONTROL_NODES }}
-  CONTROLLER_NODES: {{ CONTROLLER_NODES }}
+  CONFIG_NODES: TungstenFabric controller IP
+  CONFIGDB_NODES: TungstenFabric controller IP
+  CONTROL_NODES: TungstenFabric controller IP
+  CONTROLLER_NODES: TungstenFabric controller IP
   LOG_LEVEL: {{ LOG_LEVEL }}
   METADATA_PROXY_SECRET: {{ METADATA_PROXY_SECRET }}
-  RABBITMQ_NODES: {{ RABBITMQ_NODES }}
+  RABBITMQ_NODES: TungstenFabric controller IP
   RABBITMQ_NODE_PORT: "{{ RABBITMQ_NODE_PORT }}"
-  ZOOKEEPER_NODES: {{ ZOOKEEPER_NODES }}
+  ZOOKEEPER_NODES: TungstenFabric controller IP
   ZOOKEEPER_PORTS: "{{ ZOOKEEPER_PORTS }}"
   ZOOKEEPER_PORT: "{{ ZOOKEEPER_PORT }}"
-  KUBERNETES_CLUSTER_NETWORK: "{{ KUBERNETES_CLUSTER_NETWORK }}"
-  KUBERNETES_CLUSTER_NAME: {{ KUBERNETES_CLUSTER_NAME }}
-  KUBERNETES_POD_SUBNETS: {{ KUBERNETES_POD_SUBNETS }}
-  KUBERNETES_IP_FABRIC_SUBNETS: {{ KUBERNETES_IP_FABRIC_SUBNETS }}
-  KUBERNETES_SERVICE_SUBNETS: {{ KUBERNETES_SERVICE_SUBNETS }}
-  KUBERNETES_IP_FABRIC_FORWARDING: "{{ KUBERNETES_IP_FABRIC_FORWARDING }}"
-  KUBERNETES_IP_FABRIC_SNAT: "{{ KUBERNETES_IP_FABRIC_SNAT }}"
-  KUBERNETES_PUBLIC_FIP_POOL: "{{ KUBERNETES_PUBLIC_FIP_POOL }}"
 ---
 apiVersion: v1
 kind: ConfigMap

# kubectl apply -f cni-vrouter.yaml

うまく適用されると、以下のように、1,000台の vRouter がクラスタに追加されるはずである。
f:id:aaabbb_200904:20190317221631p:plain

クラスタの状態

クラスタが立ち上がってから、各ノードのリソースを見てみたところ、TungstenFabric controller, k8s master で、以下のように CPU 使用率が高い状況になっていた。
※ TungstenFabric controller では、contrail-collector, redis 等、analytics の負荷が高く、k8s master では kube-apiserver, etcd の負荷が高くなった。
安定して稼働させるには、リソースの追加割り当てや、controller/analytics のスケールアウトなど、追加の考慮が必要かもしれない。

TungstenFabric controller, analytics:

top - 12:13:59 up 43 min,  1 user,  load average: 5.77, 12.05, 7.24
Tasks: 153 total,   1 running, 152 sleeping,   0 stopped,   0 zombie
%Cpu(s): 22.0 us, 16.9 sy,  0.0 ni, 60.3 id,  0.0 wa,  0.0 hi,  0.7 si,  0.1 st
KiB Mem : 15233672 total,  7091360 free,  3899712 used,  4242600 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 10779720 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                 
21165 root      20   0 1035220 333448  10996 S  48.2  2.2   3:26.06 contrail-collec                         
18891 root      20   0  906588 249180   7524 S  31.9  1.6   0:09.03 node                                    
12763 polkitd   20   0  243412 189736   1668 S  28.6  1.2   2:45.55 redis-server                            
19410 root      20   0 1375424 108644  12148 S  14.3  0.7   1:40.42 contrail-dns                            
18864 root      20   0  810588 165356   7196 S  13.0  1.1   0:05.14 node                                    
19448 root      20   0 2167860   1.0g  13732 S  10.6  7.0  10:04.95 contrail-contro                         
11985 root      20   0  776036  94764  35204 S   3.0  0.6   2:38.34 dockerd                                 
15803 root      20   0  248324  40180   5332 S   2.3  0.3   0:27.72 python   


k8s master:

top - 12:14:09 up 43 min,  1 user,  load average: 11.84, 12.30, 8.06
Tasks: 133 total,   1 running, 132 sleeping,   0 stopped,   0 zombie
%Cpu(s): 87.2 us,  6.6 sy,  0.1 ni,  3.5 id,  0.2 wa,  0.0 hi,  2.4 si,  0.0 st
KiB Mem : 15233672 total,  8167188 free,  4032788 used,  3033696 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 10702748 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                 
11583 root      20   0 2999520   2.7g  37840 S 309.3 18.6  38:35.47 kube-apiserver                                                                                                          
 5854 root      20   0   10.3g 520460 181348 S  47.5  3.4   1:50.44 etcd                                                                                                                    
18836 root      20   0  481984 350196  27724 S  17.6  2.3   0:19.61 kube-controller                                                                                                         
11211 root      20   0 1572404  74628  31760 S   3.7  0.5   0:52.85 kubelet                                                                                                                 
18460 root      20   0  209628 119648  13428 S   2.7  0.8   0:08.79 kube-scheduler                                                                                                          
10663 root      20   0 1280720  60912  16316 S   0.7  0.4   1:12.93 dockerd-current                                                                                                         
  377 root      20   0  145808  88372  87852 S   0.3  0.6   0:42.88 systemd-journal  

一方、メモリ, disk については、数台での小規模なクラスタと比べて、大きな違いは見られなかった。
※ analyticsdb を有効化している場合、こちらも大きくリソースを使う可能性が高いため注意

TungstenFabric controller, analytics:
[root@ip-172-31-13-135 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            14G        4.3G        6.1G         17M        4.1G        9.7G
Swap:            0B          0B          0B
[root@ip-172-31-13-135 ~]# 
[root@ip-172-31-13-135 ~]# 
[root@ip-172-31-13-135 ~]# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  4.3G   16G  22% /
[root@ip-172-31-13-135 ~]# 

k8s master:
[root@ip-172-31-18-113 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            14G        3.5G        7.9G        105M        3.2G         10G
Swap:            0B          0B          0B
[root@ip-172-31-18-113 ~]# 
[root@ip-172-31-18-113 ~]# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  3.6G   17G  18% /
[root@ip-172-31-18-113 ~]#

TungstenFabric の deployment pattern

TungstenFabric には多数の機能があるため、どのケースでどの機能を使えるのか、をまとめてみている。

1. openstack, kubernetes を使うケース

この場合、vm, container へのアクセスは floating-ip 経由になるため、もっとも簡単な構成は、gatewayless の仮想ネットワークから、floating-ip を取得する使い方となる。
ルーター/スイッチは、ipv4 の bgp が使えればよいため、インオペは問題になりにくい、ものと思われる
http://aaabbb-200904.hatenablog.jp/entry/2019/02/03/195348

この場合も、内部の通信は、overlay で実施できるため、calico と ml2 を合わせたような動作が可能になる。

2. oVirt 等と組み合わせて使うケース

1 と違い、全てのサブネットを external にするようなケースを想定する。
※ このケースは、TungstenFabric を使わず、hypervisor からは vlan でパケットを出すような設定でも構成可能だが、vRouter の distributed firewall を使いたい場合、等を考え、このケースも考慮している

この場合、機材が EVPN/VXLAN に対応しているかどうか、で動作が変わってくる。

2-1. 機材がEVPN/VXLANに対応している場合

この場合は、vRouterとcore-switch でEVPN/VXLANを設定し、core-switch で vxlan routing を行う構成が基本となる。
https://github.com/Juniper/contrail-specs/blob/master/5.1/cfm-erb-unicast-crb-multicast-roles.md

この場合、vm 間通信は、通常と変わらず vRouter間のオーバーレイで実施される。
vm から baremetal への疎通は、inter-vxlan は spine を通じて、vxlan-routing され、intra-vxlan は、leaf と vRouter が vtep として動作する動きとなる。intra-vxlan については、BUM等もオーバーレイを通じて、replicate されるため、SDN の機能を使用しつつ、既存に近い構成が可能となる。

2-2. 機材がEVPN/VXLANに対応していない場合

この場合、vRouter と core-switch (vlan間ルーティングを行う機材) とのやりとりは、gatewayless を通じて実施することになる。
この場合も、仮想ネットワークを全て gatewayless 扱いにし、core-switch と ipv4 の bgp を行うことで、一応、vRouter を導入することは出来る (distbuted firewall 等も使用可能) ものと思われるが、vRouter 内との BUM のやり取りが出来なくなるため、仮想ネットワークと baremetal を同じサブネットに置くことは出来ない。
https://github.com/Juniper/contrail-specs/blob/master/gateway-less-forwarding.md#broadcast--multicast

このため、ブロードキャスト、マルチキャストを必要とするアプリケーションがある場合は、対応について考慮が必要となる。

3. openstack, kubenetes を使うケース (multi-tenancy を考慮する必要がある場合)

1 に似たケースで、multi-tenancy (ip重複を含む) を考慮する場合がある。
- aws vpc のように、テナントごとに重複可能なipを払い出したい場合, MSPのようなケースを想定
この場合、gatewayless だと、ip重複の場合が扱えないため、この場合は、floating-ip も overlay から取得する必要がある。
http://aaabbb-200904.hatenablog.jp/entry/2017/10/24/234846

overlay は、MPLS over UDP(GRE) か EVPN / VXLAN のどちらも可能だが、使える機材によって、どちらを採用するかを選ぶ形になるものと思われる。
※ 大まかにはルーターから直接 overlay を張る場合 (既にVRFで ipsec / mpls-over-mpls 等を受けている場合、など) はそのまま MPLS over GRE(UDP), 上記に対応する機材が無い場合、EVPN / VXLAN ということになる、ものと思われる。

4. NFVI として使うケース

NFVIとして使いたい場合、主に、controller からの bgp で、トラフィックを VNF に引き込む部分を実施することになる。
機能としては、BGPaaS, サービスチェイン等を使い、オーバーレイとしては、MPLS over GRE(UDP) が中心となる。
※ ml2 等だと、VNFにはSR-IOV 等を割り当て、トラフィックの引き込みは別途実施する、等、工夫が必要となるため、NFVI で引き込みまで実施したい場合、TungstenFabricが一つの選択肢になるものと思われる。

まとめ

TungstenFabric は、どちらかというと、3, 4 のケースで使われる場合が多いが、1, 2-1 についても、既存との互換性を保ちつつ、overlay を使ったSDNらしい動作を、提供することが出来る。
2-2 のケースについては考慮が必要だが、それ以外のケースでは、使っていってよいのではなかろうか。

TungstenFabric環境でのIstioインストール

以下の動画の構成で、TungstenFabric環境でのIstioインストールを試してみている。
https://www.youtube.com/watch?v=VSNc9qd2poA

環境としては、AWS 上の CentOS7 (ami-3185744e) を使用し、
controller x 1: mem 8GB, disk 8GB, vRouter x 1: mem 4GB, disk 8GB
※ tungstenfabric, r5.0.1, istio-1.0.5 のモジュールで確認
で構築している。

instance.yaml 、インストール手順はこちらと同様となる。
http://aaabbb-200904.hatenablog.jp/entry/2019/02/03/195348

k8s, tungsten-fabric のインストールが完了した後、以下の参考リンクに従い、istio, および、 bookinfo のインストールを行っていく。
https://istio.io/docs/setup/kubernetes/download-release/
https://istio.io/docs/setup/kubernetes/quick-start/
https://istio.io/docs/examples/bookinfo/

まず最初に、istio 本体のインストールを行う。

$ curl -L https://git.io/getLatestIstio | sh -
$ cd istio*
$ export PATH=$PWD/bin:$PATH
$ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
$ kubectl apply -f install/kubernetes/istio-demo.yaml
$ kubectl get pods -n istio-system -o wide
※ 5分程度で全 pod が起動
[root@ip-172-31-10-93 istio-1.0.5]# kubectl get pods -n istio-system -o wide
NAME                                      READY     STATUS    RESTARTS   AGE       IP              NODE
grafana-647f464b47-z5kqf                  1/1       Running   0          2m        10.47.255.245   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-citadel-55f4559bf4-lpfll            1/1       Running   0          2m        10.47.255.241   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-egressgateway-5f6cc9565f-zz6x9      1/1       Running   0          2m        10.47.255.247   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-galley-6555f7b787-6zrxl             1/1       Running   0          2m        10.47.255.248   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-ingressgateway-7477597868-c9p66     1/1       Running   0          2m        10.47.255.246   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-pilot-5758759cf6-6vkn6              2/2       Running   0          2m        10.47.255.242   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-policy-6866bb777-h6shx              2/2       Running   0          2m        10.47.255.244   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-sidecar-injector-785d946b9f-8nl6p   1/1       Running   0          2m        10.47.255.238   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-telemetry-659c98f9d7-72j8r          2/2       Running   0          2m        10.47.255.243   ip-172-31-4-44.ap-northeast-1.compute.internal
istio-tracing-77f9f94b98-zrxgg            1/1       Running   0          2m        10.47.255.237   ip-172-31-4-44.ap-northeast-1.compute.internal
prometheus-67d4988588-zt6vb               1/1       Running   0          2m        10.47.255.240   ip-172-31-4-44.ap-northeast-1.compute.internal
servicegraph-6948967d88-zvh9p             1/1       Running   0          2m        10.47.255.239   ip-172-31-4-44.ap-northeast-1.compute.internal
[root@ip-172-31-10-93 istio-1.0.5]#

istio の pod が起動した後、以下のコマンドで、サンプルアプリである、 bookinfo のインストールを実施する。

$ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
$ kubectl get svc -o wide
[root@ip-172-31-10-93 istio-1.0.5]# kubectl get svc -o wide
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE       SELECTOR
details       ClusterIP   10.108.145.18    <none>        9080/TCP   11s       app=details
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    11m       <none>
productpage   ClusterIP   10.106.227.189   <none>        9080/TCP   9s        app=productpage
ratings       ClusterIP   10.107.149.71    <none>        9080/TCP   10s       app=ratings
reviews       ClusterIP   10.109.60.194    <none>        9080/TCP   9s        app=reviews
[root@ip-172-31-10-93 istio-1.0.5]#

[root@ip-172-31-10-93 istio-1.0.5]# kubectl get pod -o wide
NAME                             READY     STATUS    RESTARTS   AGE       IP              NODE
details-v1-845fc857bd-rfp2l      2/2       Running   0          1m        10.47.255.236   ip-172-31-4-44.ap-northeast-1.compute.internal
productpage-v1-c8dbcd7f8-jblpx   2/2       Running   0          1m        10.47.255.231   ip-172-31-4-44.ap-northeast-1.compute.internal
ratings-v1-6c788fb884-g5kb4      2/2       Running   0          1m        10.47.255.235   ip-172-31-4-44.ap-northeast-1.compute.internal
reviews-v1-84476bcf59-55shq      2/2       Running   0          1m        10.47.255.234   ip-172-31-4-44.ap-northeast-1.compute.internal
reviews-v2-5f69f77764-kf784      2/2       Running   0          1m        10.47.255.233   ip-172-31-4-44.ap-northeast-1.compute.internal
reviews-v3-6f64f77457-fmqdx      2/2       Running   0          1m        10.47.255.232   ip-172-31-4-44.ap-northeast-1.compute.internal
[root@ip-172-31-10-93 istio-1.0.5]#
※ 各 pod で2つのコンテナが起動していることを確認する (アプリケーションコンテナと envoy コンテナ)

この後、istio-ingress への external-ip の払い出しのため、以下のリンクと同様に、 gatewayless による floating-ip の設定を行う。
http://aaabbb-200904.hatenablog.jp/entry/2019/02/03/195348

※ kubemanager にコンテナ外で設定を行う場合、以下で実施することも可能
# tail /etc/contrail/common_kubemanager.env
(snip)
KUBERNETES_PUBLIC_FIP_POOL={'domain': 'default-domain', 'project': 'k8s-default', 'network': 'public-network1', 'name': 'default' }
#
# docker-compose -f /etc/contrail/kubemanager/docker-compose.yaml down
# docker-compose -f /etc/contrail/kubemanager/docker-compose.yaml up -d

floating-ip の設定が終わったら、istio経由の外部アクセスを提供するため、istio-ingress のインストールを行う。

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
$ kubectl get gateway
[root@ip-172-31-10-93 istio-1.0.5]# kubectl get gateway -o wide
NAME               AGE
bookinfo-gateway   17s
[root@ip-172-31-10-93 istio-1.0.5]# 

$ kubectl get svc --all-namespaces -o wide
[root@ip-172-31-10-93 istio-1.0.5]# kubectl get svc --all-namespaces -o wide
NAMESPACE      NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                                                   AGE       SELECTOR
default        details                  ClusterIP      10.108.145.18    <none>        9080/TCP                                                                                                                  5m        app=details
default        kubernetes               ClusterIP      10.96.0.1        <none>        443/TCP                                                                                                                   17m       <none>
default        productpage              ClusterIP      10.106.227.189   <none>        9080/TCP                                                                                                                  5m        app=productpage
default        ratings                  ClusterIP      10.107.149.71    <none>        9080/TCP                                                                                                                  5m        app=ratings
default        reviews                  ClusterIP      10.109.60.194    <none>        9080/TCP                                                                                                                  5m        app=reviews
istio-system   grafana                  ClusterIP      10.98.191.116    <none>        3000/TCP                                                                                                                  9m        app=grafana
istio-system   istio-citadel            ClusterIP      10.105.46.119    <none>        8060/TCP,9093/TCP                                                                                                         9m        istio=citadel
istio-system   istio-egressgateway      ClusterIP      10.99.227.1      <none>        80/TCP,443/TCP                                                                                                            9m        app=istio-egressgateway,istio=egressgateway
istio-system   istio-galley             ClusterIP      10.97.53.49      <none>        443/TCP,9093/TCP                                                                                                          9m        istio=galley
istio-system   istio-ingressgateway     LoadBalancer   10.107.161.49    10.0.11.3     80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31245/TCP,8060:32417/TCP,853:31014/TCP,15030:32577/TCP,15031:31476/TCP   9m        app=istio-ingressgateway,istio=ingressgateway
istio-system   istio-pilot              ClusterIP      10.107.3.44      <none>        15010/TCP,15011/TCP,8080/TCP,9093/TCP                                                                                     9m        istio=pilot
istio-system   istio-policy             ClusterIP      10.107.98.144    <none>        9091/TCP,15004/TCP,9093/TCP                                                                                               9m        istio-mixer-type=policy,istio=mixer
istio-system   istio-sidecar-injector   ClusterIP      10.96.59.151     <none>        443/TCP                                                                                                                   9m        istio=sidecar-injector
istio-system   istio-telemetry          ClusterIP      10.98.180.42     <none>        9091/TCP,15004/TCP,9093/TCP,42422/TCP                                                                                     9m        istio-mixer-type=telemetry,istio=mixer
istio-system   jaeger-agent             ClusterIP      None             <none>        5775/UDP,6831/UDP,6832/UDP                                                                                                9m        app=jaeger
istio-system   jaeger-collector         ClusterIP      10.111.92.176    <none>        14267/TCP,14268/TCP                                                                                                       9m        app=jaeger
istio-system   jaeger-query             ClusterIP      10.110.71.53     <none>        16686/TCP                                                                                                                 9m        app=jaeger
istio-system   prometheus               ClusterIP      10.106.27.29     <none>        9090/TCP                                                                                                                  9m        app=prometheus
istio-system   servicegraph             ClusterIP      10.108.204.215   <none>        8088/TCP                                                                                                                  9m        app=servicegraph
istio-system   tracing                  ClusterIP      10.98.103.145    <none>        80/TCP                                                                                                                    9m        app=jaeger
istio-system   zipkin                   ClusterIP      10.109.197.58    <none>        9411/TCP                                                                                                                  9m        app=jaeger
kube-system    kube-dns                 ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP                                                                                                             17m       k8s-app=kube-dns
kube-system    kubernetes-dashboard     ClusterIP      10.105.122.165   <none>        443/TCP                                                                                                                   16m       k8s-app=kubernetes-dashboard
[root@ip-172-31-10-93 istio-1.0.5]# 

※ istio-ingressgateway に external-ip が付いていることを確認する。

istio-ingressgateway が構成出来た後、上記の external-ip にアクセスを行い、以下の3画面 (review-1, review-2, review-3) にアクセスできることを確認している。
※ デフォルトの動作では、3画面に順次割り振りが行われる
f:id:aaabbb_200904:20190212233228p:plain
f:id:aaabbb_200904:20190212233250p:plain
f:id:aaabbb_200904:20190212233308p:plain

アクセスできることを確認した後、以下のリンクの通り、virtual-service の適用を行い、envoy によって割り振り制御が行われることを確認できている。
(設定を投入してから切り替わるまで、最大1-2分程度かかった)
https://istio.io/docs/examples/intelligent-routing/
https://istio.io/docs/tasks/traffic-management/request-routing/
https://istio.io/docs/tasks/traffic-management/traffic-shifting/

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
$ kubectl get destinationrules -o yaml

$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
$ kubectl get virtualservices -o yaml
 -> review-1 (文字のみの画面) だけに割り振りが行われる。

$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
 -> review-1 だけにアクセスが行われるが、jason という名前でログインした場合、 review-2 (黒い星の画面) に割り振りが行われる。
$ kubectl delete -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml


$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
 -> review-1, review-3 (文字のみの画面 / 赤い星の画面) に 50% ずつ割り振りが行われる。

analytics_database 無しでのインストール

直近の tungsten fabric では、以下の spec に従い、analytics 関連の各コンポーネント無しでのインストールが可能となっている。
https://github.com/Juniper/contrail-analytics/blob/master/specs/analytics_optional_components.md

今回は analytics のみでのインストールを行ってみている。

環境は AWS上のCentOS7.5 AMI (ami-3185744e) を t2.medium (vCPU x2, mem 4GB) で 2台起動し、 / に disk 8GB を割り当てている。

インストールの手順は以下に従い、
http://aaabbb-200904.hatenablog.jp/entry/2018/04/28/215922

instance.yaml としては、以下を使用した。

[root@ip-172-31-12-85 contrail-ansible-deployer]# cat config/instances.yaml
provider_config:
  bms:
   ssh_user: root
   ssh_public_key: /root/.ssh/id_rsa.pub
   ssh_private_key: /root/.ssh/id_rsa
   domainsuffix: local
   ntpserver: ntp.nict.jp
instances:
  bms1:
   provider: bms
   roles:
      config_database:
      config:
      control:
      analytics:
      webui:
      k8s_master:
      kubemanager:
   ip: 172.31.12.85
  bms2:
   provider: bms
   roles:
     vrouter:
     k8s_node:
   ip: 172.31.2.9
contrail_configuration:
  CONTAINER_REGISTRY: opencontrailnightly
  CONTRAIL_VERSION: latest
  KUBERNETES_CLUSTER_PROJECT: {}
  JVM_EXTRA_OPTS: "-Xms128m -Xmx1g"
global_configuration:
[root@ip-172-31-12-85 contrail-ansible-deployer]#

※ configure_instances.yaml のコマンドが少し変わっているので注意

ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/configure_instances.yml
※ 10分ほどかかる
ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/install_k8s.yml
※ 5分ほどかかる
ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/install_contrail.yml
※ 20分ほどかかる

インストールが完了した後、controller の memory を確認してみたところ、1.9GB 程度の使用量におさまっていた。
今まで memory 不足で tungsten fabric がインストール出来なかった環境でも、試してみることが出来るのではなかろうか。

free -h:
[root@ip-172-31-12-85 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        1.9G        470M         17M        1.3G        1.3G
Swap:            0B          0B          0B
[root@ip-172-31-12-85 ~]# 

[root@ip-172-31-2-9 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        532M        2.4G         16M        750M        2.9G
Swap:            0B          0B          0B
[root@ip-172-31-2-9 ~]#


contrail-status:
[root@ip-172-31-12-85 ~]# contrail-status 
Pod              Service         Original Name                          State    Id            Status        
                 redis           contrail-external-redis                running  44398f4345c5  Up 7 minutes  
analytics        api             contrail-analytics-api                 running  f507d25e2e3b  Up 4 minutes  
analytics        collector       contrail-analytics-collector           running  743fd12abac1  Up 4 minutes  
analytics        nodemgr         contrail-nodemgr                       running  66bae291cf04  Up 4 minutes  
config           api             contrail-controller-config-api         running  c92962e7e533  Up 5 minutes  
config           device-manager  contrail-controller-config-devicemgr   running  ae0a0282086a  Up 5 minutes  
config           nodemgr         contrail-nodemgr                       running  549aa0a93751  Up 5 minutes  
config           schema          contrail-controller-config-schema      running  c988dbcb9b4a  Up 5 minutes  
config           svc-monitor     contrail-controller-config-svcmonitor  running  ec7cf57e4bd2  Up 5 minutes  
config-database  cassandra       contrail-external-cassandra            running  d771c85d5e50  Up 6 minutes  
config-database  nodemgr         contrail-nodemgr                       running  6e50281203fc  Up 6 minutes  
config-database  rabbitmq        contrail-external-rabbitmq             running  f5e7f99be03d  Up 6 minutes  
config-database  zookeeper       contrail-external-zookeeper            running  0b996607586b  Up 6 minutes  
control          control         contrail-controller-control-control    running  4269d4ca1ac7  Up 4 minutes  
control          dns             contrail-controller-control-dns        running  b5ba2ad81120  Up 4 minutes  
control          named           contrail-controller-control-named      running  35538b126133  Up 4 minutes  
control          nodemgr         contrail-nodemgr                       running  9242c85d41f3  Up 4 minutes  
device-manager   dnsmasq         contrail-external-dnsmasq              running  be46fd7c4095  Up 5 minutes  
kubernetes       kube-manager    contrail-kubernetes-kube-manager       running  bf9f42f1f502  Up 3 minutes  
webui            job             contrail-controller-webui-job          running  96fb6a5fb728  Up 5 minutes  
webui            web             contrail-controller-webui-web          running  a995118b17ae  Up 5 minutes  

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

== Contrail config-database ==
nodemgr: initializing (Disk for DB is too low. )
zookeeper: active
rabbitmq: active
cassandra: active

== Contrail kubernetes ==
kube-manager: active

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

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

== Contrail device-manager ==

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

[root@ip-172-31-12-85 ~]# 

[root@ip-172-31-2-9 ~]# contrail-status 
Pod      Service  Original Name           State    Id            Status        
vrouter  agent    contrail-vrouter-agent  running  5a37fe17859d  Up 2 minutes  
vrouter  nodemgr  contrail-nodemgr        running  dfea2a8b4ad0  Up 2 minutes  

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

[root@ip-172-31-2-9 ~]# 


nodetool -p 7201 info:
root@ip-172-31-12-85:/# nodetool -p 7201 info | grep -i heap
Heap Memory (MB)       : 54.32 / 1004.00
Off Heap Memory (MB)   : 0.00
root@ip-172-31-12-85:/#


df -h:
[root@ip-172-31-12-85 ~]# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      8.0G  6.0G  2.1G  75% /
[root@ip-172-31-12-85 ~]#

[root@ip-172-31-2-9 ~]# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      8.0G  3.1G  5.0G  39% /
[root@ip-172-31-2-9 ~]#


Monitor > Dashboard
※ alarm 等の機能は無効化されている, webui の Query タブ, contrail-flows, contrail-logs 等は query-engine / analyticsdb cassandra を使うため、使用できなくなっている
f:id:aaabbb_200904:20190210222211p:plain

Config: 引き続き使用可能
f:id:aaabbb_200904:20190210222252p:plain

UVE: 引き続き使用可能
f:id:aaabbb_200904:20190210222323p:plain