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

2ノードでの rbd-mirror設定

ceph を2台 (1ノード1クラスタ) にインストールし、その間で rbd mirror を設定してみている。

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

1ノードへのceph インストール

以下の設定で、1ノード上のceph でも HEALTH OK になることを確認できた。
※ デフォルト設定だと、同じクラスタ内に3ノード必要だったため、1ノードで動かしたい場合、ceph.conf に2行追記する必要があった。

hostname=$(hostname | awk -F. '{print $1}')
yum -y install epel-release

cat << EOM > /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOM

yum install -y ceph-deploy
mv -i /etc/yum.repos.d/ceph.repo /tmp

mkdir /root/my-cluster
cd /root/my-cluster/

ceph-deploy new ${hostname}

## 以下の2行を追記
echo 'osd_crush_chooseleaf_type = 0' >> ceph.conf
echo 'osd_pool_default_size = 1' >> ceph.conf


ceph-deploy install ${hostname}
ceph-deploy mon create-initial
ceph-deploy admin ${hostname}
ceph-deploy mgr create ${hostname}
ceph-deploy osd create --data /dev/xvdb ${hostname}

作成後、以下のように pool / image の作成を行い、block device として使用できることを確認している。
※ rbd-mirror の設定を続けて行う場合、mirror 先のクラスタにも、pool1 の作成 (# ceph osd pool create pool1 8) を実施しておく

ceph status
ceph osd pool create pool1 8
rbd pool init pool1
rbd create image1 --size 4096 --image-feature layering -p pool1
rbd map image1 --name client.admin -p pool1
ls -lhtr /dev/rbd/pool1/image1
mkfs -t xfs /dev/rbd/pool1/image1
mount /dev/rbd/pool1/image1 /mnt

rbd-mirror の設定

pool の作成が終わった後、rbd-mirror の設定を行う。

実際にミラーを行う rbd-mirror デーモンは、データ元の ceph クラスタに ceph クライアントとして接続するため、事前にデータ元クラスタでのkeyring作成と、mirror先クラスタからの疎通確認を行う必要がある。

上記のインストール手順だと データ元、 mirror 先ともに、ceph クラスタ名が 'ceph' となっており、mirror 時に別クラスタの指定が出来なくなってしまうため、事前にクラスタ名指定用のファイルを変更しておく。

各ノードで
/etc/sysconfig/ceph
CLUSTER=cluster1
-
CLUSTER=cluster2
を追記
※ cluster1 がデータ元、cluster2 を mirror 先とする


次に、以下のコマンドにより、cluster1 アクセス用の keyring (id: replusr1) を作成する。

※ データ元ノード上で実施
cd /etc/ceph
ln -s ceph.conf cluster1.conf
ln -s ceph.client.admin.keyring cluster1.client.admin.keyring
※ --cluster cluster1 の cli 指定を動作させるために必要

ceph auth get-or-create client.replusr1 mon 'profile rbd' osd 'profile rbd pool=pool1' -o /etc/ceph/cluster1.client.replusr1.keyring --cluster cluster1

ファイルが出来たら以下の2ファイルを、mirror 先ノードの /etc/ceph 以下に、scp 等でコピーする。

/etc/ceph/cluster1.conf
/etc/ceph/cluster1.client.replusr1.keyring

この段階で、mirror先のノードで以下を発行し、データ元のcephクラスタにアクセス出来ることを確認しておく。

※ mirror 先のノードで実施
ceph --id replusr1 --cluster cluster1 -s

また、後で、rbd-mirror デーモン起動時に使用するので、mirror 先のノードでも、cluster2 用の設定ファイルを作成しておく。

※ mirror 先のノード上で実施
cd /etc/ceph
ln -s ceph.conf cluster2.conf
ln -s ceph.client.admin.keyring cluster2.client.admin.keyring

ceph auth get-or-create client.replusr2 mon 'profile rbd' osd 'profile rbd pool=pool1' -o /etc/ceph/cluster2.client.replusr2.keyring --cluster cluster2

この後、実際にmirrorを始めるために、mirror を有効化する pool に対して以下を発行する。

※ データ元のノードで実施
# rbd feature enable pool1/image1 exclusive-lock
# rbd feature enable pool1/image1 journaling
※ 両方のノードで実施
# rbd mirror pool enable pool1 pool

最後に、mirror 先のノードにて、rbd-mirror デーモンの起動と、pool への peer 設定を実施する。

※ mirror 先のノードで実施
yum -y install rbd-mirror
systemctl enable ceph-rbd-mirror.target
systemctl enable ceph-rbd-mirror@replusr2
systemctl start ceph-rbd-mirror@replusr2

# rbd --cluster cluster2 mirror pool peer add pool1 client.replusr1@cluster1
# rbd --cluster cluster2 mirror pool info pool1
Mode: pool
Peers: 
  UUID                                 NAME     CLIENT          
  f383c009-2adf-419b-9f57-03030287fb8e cluster1 client.replusr1

# rbd mirror image status pool1/image1
image1:
  global_id:   ce71a13a-2a1d-4e5f-beb6-d95ca8e6558a
  state:       up+replaying
  description: replaying, master_position=[object_number=3, tag_tid=1, entry_tid=3], mirror_position=[object_number=3, tag_tid=1, entry_tid=3], entries_behind_master=0
  last_update: 2019-02-09 11:09:40

この状態で、以下のように、pool に image を追加すると、数秒後に mirror 先にも追加されるようになるはずである。

# rbd create image2 --size 4096 --image-feature layering,exclusive-lock,journaling -p pool1


※ 反映までの時間を計測した結果、約2秒後に反映された
[root@ip-172-31-12-196 ceph]# date; rbd create image2 --size 4096 --image-feature layering,exclusive-lock,journaling -p pool1
Sat Feb  9 12:30:20 UTC 2019
[root@ip-172-31-12-196 ceph]# 

[root@ip-172-31-7-146 ~]# while true; do date; rbd -p pool1 ls; sleep 0.5; done
(snip)
Sat Feb  9 12:30:19 UTC 2019
image1
Sat Feb  9 12:30:19 UTC 2019
image1
Sat Feb  9 12:30:20 UTC 2019
image1
Sat Feb  9 12:30:20 UTC 2019
image1
Sat Feb  9 12:30:21 UTC 2019
image1
Sat Feb  9 12:30:21 UTC 2019
image1
Sat Feb  9 12:30:22 UTC 2019
image1
image2
Sat Feb  9 12:30:23 UTC 2019
image1
image2

Ubuntu18.04でのTungstenFabricインストール

Ubuntu18.04 での Tungsten Fabric インストールを試してみている。

今回もAWS上のインスタンスを使用している。
AMIとしては、Ubuntu Server 18.04 LTS (HVM) (ami-07ad4b1c3af1ea214) を使用した。

環境としては、controller 1台 (t2.large, disk 30GB)、vRouter 1台 (t2.medium, disk 8GB) で、 kubernetes 環境を構築している。

まず、準備として、各ノードで 以下を実施している。

(all node) apt update
(controller node) apt install python-pip git
(controller node) pip install ansible==2.4.2.0
(vRouter node) apt install python

(controller node) ssh-keygen
(controller node) cd .ssh/
(controller node) cat id_rsa.pub >> authorized_keys
 (vRouter node の .ssh/authorized_keys にも上記の公開鍵を登録)
(controller node) cd

(controller node) git clone -b R5.0 http://github.com/Juniper/contrail-ansible-deployer
(controller node) cd contrail-ansible-deployer
(controller node) vi 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:
      analytics_database:
      webui:
      k8s_master:
      kubemanager:
   ip: 172.31.6.88 # controller node の ip
  bms11:
   provider: bms
   roles:
     vrouter:
     k8s_node:
   ip: 172.31.9.130 # vRouter node の ip
contrail_configuration:
  CONTRAIL_VERSION: r5.0.1
  KUBERNETES_CLUSTER_PROJECT: {}
  JVM_EXTRA_OPTS: "-Xms128m -Xmx1g"
global_configuration:
  CONTAINER_REGISTRY: tungstenfabric

また、vrouter.ko ビルド時のエラーを回避するため、vRouter node にて、以下を実施している。

(vRouter node) # vi /usr/src/linux-aws-headers-4.15.0-1021/include/linux/uuid.h
(以下の3行をコメントアウト)
// typedef struct {
//      __u8 b[UUID_SIZE];
// } uuid_t;
(直後の行に、以下を追記)
typedef unsigned char uuid_t[16];


準備が終わったら、以下で実際のインストールを実施する。

ansible-playbook -i inventory/ playbooks/configure_instances.yml
ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/install_k8s.yml
ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/install_contrail.yml

※ インストール完了後、vhost0 が作成された後に、vRouter node で名前解決が出来なくなった場合、以下を実施する

(vRouter node) # vi /etc/systemd/resolved.conf
(以下を追記)
DNS=172.31.0.2
(vRouter node) # systemctl restart systemd-resolved.service

この後、以下の yaml ファイル ( https://github.com/tnaganawa/contrail-k8s-tutorial/tree/master/yml/1_initial ) で テスト用のコンテナを作成し、コンテナ間、およびGW IPへの疎通ができることを確認している。

root@ip-172-31-6-88:~/contrail-k8s-tutorial/yml/1_initial# kubectl get pod -o wide
NAME      READY     STATUS    RESTARTS   AGE       IP              NODE
cirros1   1/1       Running   0          38s       10.47.255.251   ip-172-31-9-130
cirros2   1/1       Running   0          16s       10.47.255.250   ip-172-31-9-130
root@ip-172-31-6-88:~/contrail-k8s-tutorial/yml/1_initial# kubectl exec -it cirros1 sh
/ # ping 10.47.255.250
PING 10.47.255.250 (10.47.255.250): 56 data bytes
64 bytes from 10.47.255.250: seq=0 ttl=63 time=1.482 ms
64 bytes from 10.47.255.250: seq=1 ttl=63 time=0.065 ms
^C
--- 10.47.255.250 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.065/0.773/1.482 ms
/ # ping 10.47.255.254
PING 10.47.255.254 (10.47.255.254): 56 data bytes
64 bytes from 10.47.255.254: seq=0 ttl=64 time=1.304 ms
64 bytes from 10.47.255.254: seq=1 ttl=64 time=0.128 ms
^C
--- 10.47.255.254 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.128/0.716/1.304 ms
/ # 

gatewayless からの floating-ip 取得

Tungsten Fabric の floating-ip は、通常、SDN-GW に MPLS over (GRE/UDP) で拡張したサブネットから取得するが、
gatewayless を指定したサブネットから取得することが出来るかどうかも調べてみた。
結果として、少なくとも kubernetes から service, ingress として使用する範囲では、特に問題なく取得することが出来た。


インストールについては、以下の instance.yaml を使用し、tungsten fabric controller 1台、vRouter 2台の kubernetes 環境を構築した。
http://aaabbb-200904.hatenablog.jp/entry/2018/04/28/215922

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:
      analytics_database:
      webui:
      k8s_master:
      kubemanager:
   ip: 172.31.3.152
  bms11:
   provider: bms
   roles:
     vrouter:
     k8s_node:
   ip: 172.31.12.1
  bms12:
   provider: bms
   roles:
     vrouter:
     k8s_node:
   ip: 172.31.15.196
contrail_configuration:
  CONTRAIL_VERSION: r5.0.1
  KUBERNETES_CLUSTER_PROJECT: {}
  JVM_EXTRA_OPTS: "-Xms128m -Xmx1g"
global_configuration:
  CONTAINER_REGISTRY: tungstenfabric

また、以下のリンクと同様、kubernetes 環境のfloating-ip の取り先として、public-network1 (10.0.11.0/24) を指定した。
http://aaabbb-200904.hatenablog.jp/entry/2017/11/04/022638

gatewayless については、以下のリンクと同様、作成した public-network1 に、'IP Fabric Forwarding', 'External' にチェックを入れた。
また、public-network1 には、Policy として、'default-domain:k8s-default:k8s-default-ip-fabric-np' をアタッチした。 (この定義が無いと、vRouter 内のRPFでドロップされる)
http://aaabbb-200904.hatenablog.jp/entry/2018/05/14/003319

この状態で、以下のファイルを適用することで、service (Type: LoadBalancer), ingress を作成した。

[service]
https://github.com/tnaganawa/contrail-k8s-tutorial/blob/master/yml/3_contrail-cni-features/1-2_deployment/cirros-deployment.yaml
https://github.com/tnaganawa/contrail-k8s-tutorial/blob/master/yml/3_contrail-cni-features/2_service/loadbalancer.yaml

[ingress]
https://github.com/tnaganawa/contrail-k8s-tutorial/tree/master/yml/3_contrail-cni-features/3_ingress


上記設定によって、service, ingress で取得されたexternal-ip への経路が VyOS に配布され、別のEC2インスタンスから VyOS 経由でアクセス出来ることを確認している。
※ VyOS の設定については以下を参照
http://aaabbb-200904.hatenablog.jp/entry/2018/06/10/000427
aws 上で他のインスタンスから gatewayless のサブネットにアクセスする場合、'ネットワーク&セキュリティ > ネットワークインターフェース' から、'送信元/送信先の変更チェック' を 無効にする必要があるので注意
※※ vRouter, VyOS のノードに対して必要

稼働確認用の端末: 172.31.11.23
VyOS: 172.31.13.61
TungstenFabric Controller: 172.31.3.152
TungstenFabric vRouter: 172.31.12.1, 172.31.15.196


[root@ip-172-31-11-23 ~]# ip route
default via 172.31.0.1 dev eth0 
10.0.11.0/24 via 172.31.13.61 dev eth0 
172.31.0.0/20 dev eth0 proto kernel scope link src 172.31.11.23 
[root@ip-172-31-11-23 ~]# 
[root@ip-172-31-11-23 ~]# ssh cirros@10.0.11.3
cirros@10.0.11.3's password: 
$ 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue \    link/ether 02:49:77:dc:06:27 brd ff:ff:ff:ff:ff:ff
11: eth0    inet 10.47.255.250/12 scope global eth0\       valid_lft forever preferred_lft forever
$ Connection to 10.0.11.3 closed.
[root@ip-172-31-11-23 ~]# 
[root@ip-172-31-11-23 ~]# 
[root@ip-172-31-11-23 ~]# curl -I 10.0.11.4
HTTP/1.1 200 OK
Server: nginx/1.7.9
Date: Sun, 03 Feb 2019 10:19:54 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Dec 2014 16:25:09 GMT
ETag: "54999765-264"
Accept-Ranges: bytes

[root@ip-172-31-11-23 ~]# 


vyos@VyOS-AMI:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             172.31.13.61/20                   u/u  
lo               127.0.0.1/8                       u/u  
                 ::1/128
vyos@VyOS-AMI:~$ 
vyos@VyOS-AMI:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [210/0] via 172.31.0.1, eth0
B>* 10.0.11.3/32 [20/100] via 172.31.12.1, eth0, 00:04:31
B>* 10.0.11.4/32 [20/100] via 172.31.15.196, eth0, 00:04:31
C>* 127.0.0.0/8 is directly connected, lo
C>* 172.31.0.0/20 is directly connected, eth0
vyos@VyOS-AMI:~$ 
vyos@VyOS-AMI:~$ show ip bgp summary 
BGP router identifier 172.31.13.61, local AS number 65311
IPv4 Unicast - max multipaths: ebgp 1 ibgp 1
RIB entries 3, using 288 bytes of memory
Peers 1, using 4560 bytes of memory

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
172.31.3.152    4 64512      17      17        0    0    0 00:04:39        2

Total number of neighbors 1
vyos@VyOS-AMI:~$ 


[root@ip-172-31-3-152 ~]# kubectl get pod -o wide
NAME                                 READY     STATUS    RESTARTS   AGE       IP              NODE
cirros-deployment-54b65ccf48-9pptp   1/1       Running   0          24m       10.47.255.250   ip-172-31-12-1.ap-northeast-1.compute.internal
cirros-deployment-54b65ccf48-fnbzv   1/1       Running   0          24m       10.47.255.251   ip-172-31-15-196.ap-northeast-1.compute.internal
nginx-deployment-64b46ddcc7-2s5dj    1/1       Running   0          23m       10.47.255.248   ip-172-31-12-1.ap-northeast-1.compute.internal
nginx-deployment-64b46ddcc7-65ffz    1/1       Running   0          23m       10.47.255.249   ip-172-31-15-196.ap-northeast-1.compute.internal

[root@ip-172-31-3-152 ~]# kubectl get svc -o wide
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE       SELECTOR
cirros-loadbalancer   LoadBalancer   10.107.23.224   10.0.11.3     22:30464/TCP   24m       app=cirros-deployment
kubernetes            ClusterIP      10.96.0.1       <none>        443/TCP        36m       <none>
nginx-svc             ClusterIP      10.96.143.176   <none>        80/TCP         23m       app=nginx-deployment

[root@ip-172-31-3-152 ~]# kubectl get ing -o wide
NAME            HOSTS     ADDRESS                   PORTS     AGE
nginx-ingress   *         10.0.11.4,10.47.255.247   80        23m
[root@ip-172-31-3-152 ~]# 


上記の通り、少なくとも vRouter 内に入る際、floating-ip を使う構成であれば、
SDN-GW に L3VPN / EVPN の機能が無くても
gatewayless との組み合わせによって、vRouter 内への疎通が出来るようである。

内部の通信にはテナント分離を使用したいが、外部からの通信を受けるサブネットについては、共通のサブネットを使用する、という構成の場合に、使用できるのではなかろうか。

TungstenFabric のビルド方法

TungstenFabric をビルドしてみたときのメモとなる。

ベースとして、以下のレポジトリの記載を使用している。
https://github.com/Juniper/contrail-dev-env

ビルドするソースのタグとしては、r5.0.1 を使用した。
ビルド環境としては、aws 上のEC2 インスタンス (centos7.5, ami-3185744e, c5.xlarge, disk 30GB) を使用している。

# yum install -y git docker
# git clone -b R5.0 https://github.com/Juniper/contrail-dev-env
# ./startup.sh -t r5.0.1 <- 5分程度
# docker attach contrail-developer-sandbox
  # cd /root/contrail-dev-env
  # make sync <- 2分程度
  # make fetch_packages <- 1分程度
  # make setup <- 2分程度
  # make dep <- 1分程度
  # make rpm <- 60分程度
  # make containers <- 30分程度

ビルド実行後、以下のように、rpm, 及び、 docker image ができていることを確認できた。

## make rpm 後

[root@cee5c820ba1b RPMS]# pwd
/root/contrail/RPMS
[root@cee5c820ba1b RPMS]# ls
noarch  repodata  x86_64
[root@cee5c820ba1b RPMS]# find .
.
./noarch
./noarch/contrail-vcenter-manager-5.0.1-122620181030.el7.noarch.rpm
./noarch/contrail-tripleo-puppet-5.0.1-122620181030.el7.noarch.rpm
./noarch/contrail-fabric-utils-5.0.1-122620181030.noarch.rpm
./noarch/contrail-heat-5.0.1-122620181030.el7.noarch.rpm
./noarch/ironic-notification-manager-5.0.1-122620181030.el7.noarch.rpm
./noarch/neutron-plugin-contrail-5.0.1-122620181030.el7.noarch.rpm
./noarch/contrail-setup-5.0.1-122620181030.el7.noarch.rpm
./noarch/contrail-config-5.0.1-122620181030.el7.noarch.rpm
./noarch/contrail-manifest-5.0.1-122620181030.el7.noarch.rpm
./x86_64
./x86_64/contrail-web-core-5.0.1-122620181030.x86_64.rpm
./x86_64/contrail-vrouter-init-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vrouter-dpdk-init-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-web-controller-5.0.1-122620181030.x86_64.rpm
./x86_64/contrail-nodemgr-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-nodemgr-debuginfo-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vrouter-dpdk-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vrouter-dpdk-debuginfo-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vcenter-plugin-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/libcontrail-java-api-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/libcontrail-vrouter-java-api-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/libcontrail-vijava-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-debuginfo-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vrouter-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vrouter-source-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-config-openstack-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/python-contrail-vrouter-api-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/python-contrail-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vrouter-utils-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-vrouter-agent-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-control-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/python-opencontrail-vrouter-netns-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-lib-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-analytics-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-dns-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-nova-vif-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-utils-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-docs-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-fabric-utils-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-test-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-kube-manager-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-mesos-manager-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-kube-cni-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-cni-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-k8s-cni-5.0.1-122620181030.el7.x86_64.rpm
./x86_64/contrail-mesos-cni-5.0.1-122620181030.el7.x86_64.rpm
./repodata
./repodata/ab700c4d976d0c2186618a8bc2219e33c3407177d45efd7809a73038e1468310-other.sqlite.bz2
./repodata/8eae700f5b480efd71c24e154449a693a73ee03b9f30ed5d9a7c9da00a9d5920-other.xml.gz
./repodata/6dcee29e0689f1e96e40b1b65375e4225b47a463a9729a6688fba4ef5d28307b-filelists.sqlite.bz2
./repodata/ac47c8a245b62760210729474c6e2cbbf158a6224bcb1209b41f9b0a106bf134-filelists.xml.gz
./repodata/6e347f2302a7edc66f827185b10bbfea442823ea218f7e275b8484dc29459af5-primary.sqlite.bz2
./repodata/e988c233d42d947e19b19269c0f34b8e11359b89bdfe794d59547139bb0ca832-primary.xml.gz
./repodata/repomd.xml
[root@cee5c820ba1b RPMS]# 

## make containers 後

[root@cee5c820ba1b contrail]# docker images
REPOSITORY                                                       TAG                 IMAGE ID            CREATED             SIZE
172.17.0.1:6666/contrail-vrouter-plugin-mellanox-init-ubuntu     queens-dev          cdca613081c8        50 seconds ago      539 MB
172.17.0.1:6666/contrail-vrouter-plugin-mellanox-init-redhat     queens-dev          bede1afc91dd        2 minutes ago       707 MB
172.17.0.1:6666/contrail-vrouter-kernel-init-dpdk                queens-dev          f65a1403e650        2 minutes ago       1.05 GB
172.17.0.1:6666/contrail-vrouter-kernel-init                     queens-dev          54952787a678        3 minutes ago       885 MB
172.17.0.1:6666/contrail-vrouter-kernel-build-init               queens-dev          d551cee2d300        4 minutes ago       259 MB
172.17.0.1:6666/contrail-vrouter-agent-dpdk                      queens-dev          6c9e37cdb493        5 minutes ago       1.07 GB
172.17.0.1:6666/contrail-vrouter-agent                           queens-dev          8f00e230415e        6 minutes ago       1.08 GB
172.17.0.1:6666/contrail-vrouter-base                            queens-dev          36a7af582a2c        8 minutes ago       846 MB
172.17.0.1:6666/contrail-vcenter-plugin                          queens-dev          fbb15449cf8e        8 minutes ago       936 MB
172.17.0.1:6666/contrail-vcenter-manager                         queens-dev          c1ed4ea64e5d        10 minutes ago      809 MB
172.17.0.1:6666/contrail-status                                  queens-dev          ee2a40e70262        11 minutes ago      725 MB
172.17.0.1:6666/contrail-openstack-neutron-init                  queens-dev          65bb2098143b        11 minutes ago      891 MB
172.17.0.1:6666/contrail-openstack-ironic-notification-manager   queens-dev          1b3d34a967fe        12 minutes ago      818 MB
172.17.0.1:6666/contrail-openstack-heat-init                     queens-dev          6745df23be26        13 minutes ago      724 MB
172.17.0.1:6666/contrail-openstack-compute-init                  queens-dev          9fda3a9c5aad        13 minutes ago      724 MB
172.17.0.1:6666/contrail-nodemgr                                 queens-dev          3477b7e6e827        13 minutes ago      743 MB
172.17.0.1:6666/contrail-node-init                               queens-dev          30c46fa720d4        14 minutes ago      724 MB
172.17.0.1:6666/contrail-mesosphere-mesos-manager                queens-dev          0107dd077044        14 minutes ago      735 MB
172.17.0.1:6666/contrail-mesosphere-cni-init                     queens-dev          d9702f349430        14 minutes ago      741 MB
172.17.0.1:6666/contrail-kubernetes-kube-manager                 queens-dev          cdf9e57d4bb2        15 minutes ago      737 MB
172.17.0.1:6666/contrail-kubernetes-cni-init                     queens-dev          07f37d06d988        15 minutes ago      742 MB
172.17.0.1:6666/contrail-external-zookeeper                      queens-dev          757b1d2c5365        15 minutes ago      144 MB
172.17.0.1:6666/contrail-external-tftp                           queens-dev          dcd2ac0d7d39        15 minutes ago      460 MB
172.17.0.1:6666/contrail-external-redis                          queens-dev          968a77ec9c76        16 minutes ago      107 MB
172.17.0.1:6666/contrail-external-rabbitmq                       queens-dev          c898aba7236b        16 minutes ago      189 MB
172.17.0.1:6666/contrail-external-kafka                          queens-dev          a2a2af6f8e39        16 minutes ago      681 MB
172.17.0.1:6666/contrail-external-dhcp                           queens-dev          3745bad0ba64        17 minutes ago      467 MB
172.17.0.1:6666/contrail-external-cassandra                      queens-dev          3589634aa302        18 minutes ago      323 MB
172.17.0.1:6666/contrail-debug                                   queens-dev          889aa106d010        19 minutes ago      1.87 GB
172.17.0.1:6666/contrail-controller-webui-job                    queens-dev          04293efbe9ac        19 minutes ago      948 MB
172.17.0.1:6666/contrail-controller-webui-web                    queens-dev          5de1dfeda6ba        19 minutes ago      948 MB
172.17.0.1:6666/contrail-controller-webui-base                   queens-dev          98d4aaf39d89        20 minutes ago      948 MB
172.17.0.1:6666/contrail-controller-control-named                queens-dev          7c18f65d40da        20 minutes ago      792 MB
172.17.0.1:6666/contrail-controller-control-dns                  queens-dev          4b5c475bb8ed        20 minutes ago      792 MB
172.17.0.1:6666/contrail-controller-control-control              queens-dev          0b0199d28225        20 minutes ago      792 MB
172.17.0.1:6666/contrail-controller-control-base                 queens-dev          8beb513777c4        20 minutes ago      792 MB
172.17.0.1:6666/contrail-controller-config-svcmonitor            queens-dev          c8fca7845155        21 minutes ago      1.03 GB
172.17.0.1:6666/contrail-controller-config-schema                queens-dev          6053aa0d347c        21 minutes ago      1.03 GB
172.17.0.1:6666/contrail-controller-config-devicemgr             queens-dev          708996f60ebe        21 minutes ago      1.07 GB
172.17.0.1:6666/contrail-controller-config-api                   queens-dev          e59fa342b203        21 minutes ago      1.09 GB
172.17.0.1:6666/contrail-controller-config-base                  queens-dev          a35b5240aaaf        22 minutes ago      1 GB
172.17.0.1:6666/contrail-analytics-topology                      queens-dev          657d98319dbc        23 minutes ago      876 MB
172.17.0.1:6666/contrail-analytics-snmp-collector                queens-dev          a9a1ebd3d9b4        23 minutes ago      876 MB
172.17.0.1:6666/contrail-analytics-query-engine                  queens-dev          1ea2b9a539b3        23 minutes ago      876 MB
172.17.0.1:6666/contrail-analytics-collector                     queens-dev          f050cc3b9a60        23 minutes ago      876 MB
172.17.0.1:6666/contrail-analytics-api                           queens-dev          4870701a3ea1        23 minutes ago      876 MB
172.17.0.1:6666/contrail-analytics-alarm-gen                     queens-dev          ee90a0e68d8a        23 minutes ago      876 MB
172.17.0.1:6666/contrail-analytics-base                          queens-dev          14fb95916e8b        23 minutes ago      876 MB
172.17.0.1:6666/contrail-base                                    queens-dev          df725de0a74a        25 minutes ago      700 MB
172.17.0.1:6666/contrail-general-base                            queens-dev          e72dde99d406        26 minutes ago      439 MB
opencontrail/developer-sandbox                                   centos-7.4          88e86c876df3        About an hour ago   2.08 GB
docker.io/registry                                               2                   9c1f09fe9a86        5 days ago          33.3 MB
docker.io/sebp/lighttpd                                          latest              373b9578e885        4 weeks ago         12.2 MB
docker.io/ubuntu                                                 16.04               a51debf7e1eb        5 weeks ago         116 MB
docker.io/centos                                                 7.4.1708            295a0b2bd8ea        2 months ago        197 MB
docker.io/opencontrail/developer-sandbox                         r5.0.1              618d6ada8c57        3 months ago        1.95 GB
docker.io/cassandra                                              3.11.2              1d46448d0e52        4 months ago        323 MB
docker.io/zookeeper                                              3.4.10              d9fe1374256f        13 months ago       144 MB
docker.io/redis                                                  4.0.2               8f2e175b3bd1        13 months ago       107 MB
docker.io/rabbitmq                                               3.6.10-management   f10fce4f4bb8        17 months ago       124 MB