Opencontrail基于CNI规范实现了自己的CNI插件,Kubelet在调用CNI接口时调用SDN-CNI-Plugin生成对应的veth pair容器端口,veth一端在Pod中,另一端在Opencontrail的SDN-NVE-Agent中,所以Pod的所有通信流量全部被Opencontrail系统接管。同时,Opencontrail使用SDN-Kube-Manager监听K8S API,将K8S的模型转换为Opencontrail模型。
K8S中有关网络重要的几个功能在Opencontrail中实现原理如下:
Service - 使用ECMP实现负载均衡,同一个service对应的IP前缀有多个下一跳,每个下一跳对应于service的endpoint;
NetworkPolicy – 使用安全组实现,具体的安全组的匹配在各个NVE中,Opencontrail的安全组比起iptables性能更高;
Namespace – Opencontrail为每个ns创建一个租户,隔离的租户通过安全组来实现;
Ingress – 基于内部的Haproxy实现,haproxy根据ingress的path分发到不同的service节点;
DNS – 复用K8s原生DNS Service,每个pod网络均可以访问DNS。