この記事は、Kubernetes Advent Calendar 2017 5日目の記事です。
この記事では、opencontrail (以下、contrail) とkubernetes の連携について、まとめていきます。
contrail概要
contrail は、linux上でMPLS VPN類似の機能を使えるようにした仕組みで、
control planeは以下:
BGP(inet-vpn, evpn)
data planeは以下:
MPLS over GRE, VXLAN, MPLS over UDP
をそれぞれ実装しています。
上記の性質から、ルーターやスイッチとの相互運用が可能となっており、サーバーからルーターやスイッチと直接bgp peer を張って、外部のノードとvmやコンテナの間で、通信を行わせることが出来ます。
もともと openstack の neutron バックエンドとして開発されており、分離されたネットワークの提供や外部接続の提供、セキュリティポリシー、ロードバランサーなど、neutron の各機能を提供しています。
※ architecture document はこちら:
http://www.opencontrail.org/opencontrail-architecture-documentation/
contrail k8s連携 概要
contrailとkubernetes との連携ですが、contrailのv4.0から、contrail-kube-manager として、kube-apiserver とやりとりするための仕組みが実装されており、cni の要求を受け取って、port, ip の払い出し、等が出来るようになっています。
http://www.opencontrail.org/container-networking-made-simple-with-opencontrail-and-kubernetes/
また、kubernetes の標準のネットワークを拡張した動きとして、ネットワーク分離、および、type: LoadBalancer の提供が行われているので、これらについて、ざっくりまとめていきます。
※ こちらの記載とほぼ同じ内容です。
http://aaabbb-200904.hatenablog.jp/entry/2017/11/04/022638
http://aaabbb-200904.hatenablog.jp/entry/2017/11/06/004312
ネットワーク分離
ネットワーク分離は、namespace 単位で実施可能で、以下のようにannotation を設定したyamlを使用します。
https://github.com/tnaganawa/contrail-k8s-tutorial/blob/master/yml/3_contrail-cni-features/4_namespace/myns1.yaml
この場合、namespace内に払い出されたpodは、他のnamespace のpodからネットワーク疎通が取れない (内部的にはnamespaceの名前で、別の仮想ネットワークが作成され、podはその中に作成される) という動作になります。
同じk8s内のアプリケーション間で、疎通が取れないようにしたい場合に、活用可能と思われます。
※ HR, Finance など互いにデータ連携がないアプリを同じk8sで提供する場合、など
type: LoadBalancer
k8s serviceの ServiceTypeにLoadBalancerが設定された場合、contrailは、クラスタIPのnext-hopを複数 (pod単位) 設定して、各ルーターに経路配布を行います。
このため、各ルーターは、複数のvrouter (podが立っているもの) に対して、分散してパケット転送を行う動作になります。
※ DNATはvrouter側で実施
通常、type: LoadBalancer を提供しようとすると、kube-proxy 等を使って、工夫する必要があるのですが、contrail の場合は、直接ルーターから分散できるため、構成が簡単になる、というメリットがあるものと思われます。
他環境とのMPLS over GRE連携
上記の通り、contrail は単独でも多くの機能を提供していますが、
更に、MPLS over GRE という標準的な仕組みを実装している関係で、別立てしたk8sやopenstack等、別のオーケストレーターで動作しているvm/container とも、BGP経由の経路配布を通じて、互いに通信を行うことが出来ます。
※ (やろうと思えば) openstack内の特定のvm (外部からは疎通できない) から、特定のk8s deployment (こちらも外部からは疎通できない)、に対して、疎通を設定することもできます (仮想ネットワークに対してroute-target の取り込み設定が必要)
http://aaabbb-200904.hatenablog.jp/entry/2017/11/06/011959
こちらも、vmとcontainer を交えたシステムを構築する場合は、便利な動作かもしれません。
まとめ
contrail はオープンソースとして開発されており、最新のモジュールはdockerhubからダウンロードすることが出来ます。
https://hub.docker.com/u/opencontrail/
※ インストール手順はこちら
http://www.opencontrail.org/opencontrail-containers-now-on-dockerhub/
https://github.com/Juniper/contrail-docker/wiki/Provision-Contrail-CNI-for-Kubernetes
IaaS, PaaS を絡めた複雑なネットワーク構成を構築しようとしている場合には、この機会に試してみてはいかがでしょうか??
更に詳しい情報はこちら:
http://www.opencontrail.org/
https://www.youtube.com/user/OpenContrail
http://aaabbb-200904.hatenablog.jp/archive/category/Contrail