opencontrail4.0のdocker版を試してみた

概要

opencontrail から最新のdockerが公開されたため、そちらを試してみた際のまとめとなる。
http://www.opencontrail.org/opencontrail-containers-now-on-dockerhub/

opencontrail はオープンソースとして開発がすすめられているものの、バイナリファイルが定期的に公開されているわけではない、という制限があったため、手軽に試すのが難しかった。

今回久しぶりに新規のバイナリが公開されたため、そちらを試す、というのがこのブログの趣旨になる。

※ 公開されたバイナリは4.x 系なのだが、こちらは kubernetes 連携の機能が加わっている版なので、この機能を試している。

 

インストール方法

主な手順はこちらを参照。
https://github.com/Juniper/contrail-docker/wiki/Provision-Contrail-CNI-for-Kubernetes

まず、ubuntu16.04.2 の仮想マシンを3台用意する。
※ スレーブノードでは メモリ1GB程度でも大丈夫だが、マスターは8GB程度はほしい (検証時はawsでマスター: t2.large, スレーブ: t2.micro で実施)
※※ ローカルでインストールする場合、マスターノードでは、ホスト名が名前解決できるよう、/etc/hosts を設定する必要があった


その後、以下のコマンドを順に実施していく。

(1. 共通)
# sudo service ufw stop
# sudo iptables -F
# sudo apt-get install apt-transport-https ca-certificates curl -y

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# sudo bash -c 'cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF'
# sudo apt-get update -y
# sudo apt-get install -y kubectl=1.7.4-00 kubelet=1.7.4-00 kubeadm=1.7.4-00 docker-engine

(2-1. マスターのみ)
# sudo kubeadm init

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

(2-2. スレーブのみ)
# sudo kubeadm join --token (kubeadm init実行時に表示されたtoken) (マスターのIP):6443

(3. マスターのみ)
# git clone https://github.com/Juniper/contrail-docker.git -b R4.0
# cd contrail-docker/kubernetes/manifests/
# sed -i 's/10.84.13.7/(マスターのIP)/' contrail-host-ubuntu.yaml
# kubectl apply -f contrail-host-ubuntu.yaml

この後、しばらく待つと、以下のURLでContrailの画面が表示されるはずである。
https://(マスターノードのIP):8143
aws の場合 $ssh -L 8143:127.0.0.1:8143 -i (aws用のpemファイル) ubuntu@(マスターのIP) などで確認する
※ ID/パスワードは admin:contrail123 となる

 

f:id:aaabbb_200904:20171015032251p:plainf:id:aaabbb_200904:20171015032304p:plainf:id:aaabbb_200904:20171015032309p:plain

 

 



動作確認

以下のyaml ファイルを使用して、podを2つ作成し、お互いにping が通れば、基本的な動作は okとなる
# kubectl create -f cirros1.yaml
# kubectl create -f cirros2.yaml
# kubectl exec -it cirros1 sh
# ping (cirros2のIP) # (kubectl get pod -o wide で確認)
※ cirrosがあがってこない場合、事前にスレーブノードを再起動する必要があるかもしれない

///
(cirros1.yaml)
apiVersion: v1
kind: Pod
metadata:
name: cirros1
labels:
name: cirros1
spec:
containers:
- name: cirros1
image: cirros
ports:
- containerPort: 22
///

うまくいかない場合

以下のコマンドを使って、contrail の各コンポーネントが起動しているかどうか、を順に見ていくことになる。

# kubectl get pod --all-namespaces
# kubectl exec -it <contrail-pod-name> -n kube-system -- contrail-status

※ 上手くいった場合、以下のように、各コンポーネントが active の状態になる。
root@ip-172-31-3-97:~/contrail-docker/kubernetes/manifests# kubectl exec -it contrail-controller-8hshr -n kube
-system -- contrail-status
== Contrail Control ==
contrail-control: active
contrail-named: active
contrail-dns: active
contrail-control-nodemgr: active
== Contrail Config ==
contrail-api: active
contrail-schema: active
contrail-svc-monitor: active
contrail-device-manager: active
contrail-config-nodemgr: active
== Contrail Config Database==
contrail-database: active

== Contrail Web UI ==
contrail-webui: active
contrail-webui-middleware: active
== Contrail Support Services ==
zookeeper: active
rabbitmq-server: active (disabled on boot)

root@ip-172-31-3-97:~/contrail-docker/kubernetes/manifests# kubectl exec -it -n kube-system contrail-agent-n4x
p5 contrail-status
== Contrail vRouter ==
contrail-vrouter-agent: active
contrail-vrouter-nodemgr: active


※ ログ確認が必要な場合、(主に) 以下で確認
# kubectl exec -it <contrail-pod-name> -n kube-system bash
# tail -n 100 -f /var/log/contrail/*

 


まとめ

Contrail は、MPLSベースのVPNオープンソースのみで動かせるようにした仕組みとなる。
※ 類似の仕組みについては以下、等を参照
https://forums.juniper.net/t5/Routing/Dymanic-GRE-Tunnel-VPN/td-p/92212
https://tools.ietf.org/html/draft-marques-l3vpn-end-system-07

上記の性質から、BGP(inet-vpn, evpn含む)にも対応しているので、ルーターと直接経路をやりとりし、GRE接続を張ることも出来る。

慣れるまで少々分かり辛いが、強力な割に使い方そのものはさほど難しくないので、この機会にトライしてみてもよいのではなかろうか