干货分享体验kubernetes网络插件Contiv

Posted 苏研大云人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货分享体验kubernetes网络插件Contiv相关的知识,希望对你有一定的参考价值。


Kubernetes网络插件可谓是百花争艳,各有千秋。今天就为大家介绍一款功能强大的网络模型contiv。

Contiv是思科提出的容器网络解决方案,使用GO语言实现,基于ovs进行流量转发。它的架构和neutron很相似,Contiv netmaster作为server接收用户请求,然后将指令下发到contiv netplugin,由contiv netplugin配置ovs,实现容器网络的通信。

【干货分享】体验kubernetes网络插件Contiv


安装contiv 1.1

安装前提:已经使用kubeadm部署好一个kube集群。

VERSION=1.1.1

CONTIV_MASTER=10.132.46.119

注:CONTIV_MASTER和kubeadm init所使用的--api-advertise-addresses一致。

# curl -L -O https://github.com/contiv/install/releases/download/$VERSION/contiv-$VERSION.tgz

# tar oxf contiv-$VERSION.tgz

# cd contiv-$VERSION

只安装支持vxlan

# ./install/k8s/install.sh -n $CONTIV_MASTER


返回结果:

Contiv UI is available at https://10.132.46.119:10000

Please use the first run wizard or configure the setup as follows:

Configure forwarding mode (optional, default is routing).

netctl global set --fwd-mode routing

Configure ACI mode (optional)

netctl global set --fabric-mode aci --vlan-range <start>-<end>

Create a default network

netctl net create -t default --subnet=<CIDR> default-net

For example, netctl net create -t default --subnet=20.1.1.0/24 -g 20.1.1.1 default-net

根据结果的提示执行:

# netctl net create -t default --subnet=20.1.1.0/24 -g 20.1.1.1 default-net

# netctl net ls

【干货分享】体验kubernetes网络插件Contiv

查看kube-system pod状态

【干货分享】体验kubernetes网络插件Contiv


vxlan l2、l3通信

同网段通信

创建两个测试用的容器,如图:

容器1:ip 20.1.1.5/24 mac 02:02:14:01:01:05 位于计算节点paas-deploy-3上。

【干货分享】体验kubernetes网络插件Contiv

容器2: ip 20.1.1.4/24 mac 02:02:14:01:01:04 位于计算节点paas-deploy-2上。

【干货分享】体验kubernetes网络插件Contiv

# netctl net inspect default-net

【干货分享】体验kubernetes网络插件Contiv

进入paas-deploy-3上运行的netplugin容器,查看ovs。

# ovs-vsctl show

【干货分享】体验kubernetes网络插件Contiv

# ovs-vsctl list port vvport2

可以看出网桥的vvport2端口连接着容器1。

【干货分享】体验kubernetes网络插件Contiv

测试:容器1 ping 容器2,

进入位于paas-deploy-3上netplugin容器,查看ovs流表。

table 0

【干货分享】体验kubernetes网络插件Contiv

table 1

【干货分享】体验kubernetes网络插件Contiv

table 3

【干货分享】体验kubernetes网络插件Contiv

table 4

【干货分享】体验kubernetes网络插件Contiv

table 5

【干货分享】体验kubernetes网络插件Contiv

table 6

【干货分享】体验kubernetes网络插件Contiv

table 7

【干货分享】体验kubernetes网络插件Contiv

抓包结果:

【干货分享】体验kubernetes网络插件Contiv


跨网段通信

创建一个新网络,并启动一个pod使用该网络。

# netctl net create --subnet 192.168.10.0/24 --pkt-tag 1000 --gateway 192.168.10.1 net2

这里的gw 192.168.10.1 ping不通,不存在真实网关。

编写kube deployment文件:

【干货分享】体验kubernetes网络插件Contiv

# netctl net inspect net2

可以看到新建pod的网络信息:

【干货分享】体验kubernetes网络插件Contiv

使用容器1(20.1.1.5) ping 192.168.10.2

进入位于paas-deploy-3上netplugin容器,查看ovs流表。

table0

【干货分享】体验kubernetes网络插件Contiv

table1

【干货分享】体验kubernetes网络插件Contiv

table3

【干货分享】体验kubernetes网络插件Contiv

table4

【干货分享】体验kubernetes网络插件Contiv

table5、6和同网段通信一样。

table7

【干货分享】体验kubernetes网络插件Contiv

可以看出contiv利用ovs流表实现了一种精确匹配的路由。

对端的ovs流表:

【干货分享】体验kubernetes网络插件Contiv

处于不同计算节点的容器,流表最终将报文赋一个vxlan id值,目的mac指向00:00:11:11:11:11。

处于相同计算节点的容器,流表最终会通过报文的目的IP,将报文重新组装为src_mac=00:00:11:11:11:11,dst_mac=容器mac的报文。

对容器来说,环境中所有其他容器的mac都是00:00:11:11:11:11。

进入容器查看arp表:

【干货分享】体验kubernetes网络插件Contiv


容器访问外网

创建的网络需要配置网关。

【干货分享】体验kubernetes网络插件Contiv

访问外网的流表在table8中:

【干货分享】体验kubernetes网络插件Contiv

Output9是contivh0端口

【干货分享】体验kubernetes网络插件Contiv

【干货分享】体验kubernetes网络插件Contiv

原来的报文

Src_mac  container-mac    dst_mac  00:00:11:11:11:11

Src_ip container-ip    dst_ip 8.8.8.8

经过table8修改后的报文

Src_mac  container-mac    dst_mac  contivh0-mac

Src_ip 172.19.0.5    dst_ip 8.8.8.8

实际上使用ovs做了一次snat,然后把contivh0作为网关。

接下去就是传统的网络转发过程,主要是查询计算节点的路由表,利用iptables做snat。


关于mtu

目前没有设置容器mtu接口,需要看代码来确认是否有配置mtu的可能。但是使用contiv所创建的容器,mtu自动设置为1450,这也避免了使用vxlan协议后,报文mtu大于物理网卡的问题。

【干货分享】体验kubernetes网络插件Contiv


访问策略

contiv提供了类似安全组的功能,使用ovs流表,限制进出容器的流量,可以使用netctl或界面设置。

使用界面创建icmp-deny策略

【干货分享】体验kubernetes网络插件Contiv

策略icmp-deny包含一个egress规则:容器发出的访问default-net的icmp报文将被拒绝。

创建group

【干货分享】体验kubernetes网络插件Contiv

创建了一个名为icmp-deny的group,该group作用的范围是default-net,使用上一步创建的icmp-deny策略。

对于已存在于default-net的容器,策略并不生效,使用kuebctl label命令更新label也无效。新建的容器,配置相应的label,可使策略生效。

【干货分享】体验kubernetes网络插件Contiv

对应的流表:

table 1

【干货分享】体验kubernetes网络插件Contiv

table 5

【干货分享】体验kubernetes网络插件Contiv


QoS

contiv支持容器的出方向最大带宽限速,支持dscp mark,利用ovs的相关功能实现。


多租户隔离

与openstack neutron类似,contiv使用vxlan实现了多租户的网络隔离,用户可以在自己的租户内创建子网资源,而不受其他租户的影响。

【干货分享】体验kubernetes网络插件Contiv


【干货分享】体验kubernetes网络插件Contiv



多网络平面下contiv的配置

从安装上来看,可以通过“-v”参数指定vlan网络的数据网卡:

# ./install/k8s/install.sh -n $CONTIV_MASTER -v <data plane interface like eth1>

但是vxlan的并没有,需要通过代码查看,在多网卡情况下,如何配置vxlan数据网卡以及管理网卡。


总结

contiv提供了较完善的网络功能,支持多租户隔离,同时支持vlan、vxlan网络,具备安全功能和qos功能。如果熟悉openstack neutron,会很容易理解并使用contiv。但contiv使用ovs,在提高性能、可靠性方面,门槛较高,因此不易于开发、维护。


[参考文献]

1. 安装contiv https://github.com/contiv/install

2. 使用policy http://contiv.github.io/documents/networking/policies.html


END



往期精选

1.  

2.  

3. 【



以上是关于干货分享体验kubernetes网络插件Contiv的主要内容,如果未能解决你的问题,请参考以下文章

告别2018,Kubernetes 干货文章精选

#yyds干货盘点# Kubernetes 搞定网络原来可以如此简单?(25)

#yyds干货盘点# 如何挑选合适的 Kubernetes 存储插件?(09)

干货 | Kubernetes网络之Flannel

干货 | 博云基于OVS自研容器网络插件在金融企业的落地实践

技术分享 | 基于 CSI Kubernetes 存储插件的开发实践