Kubernetes技术分析之OpenVSwitch


【编者的话】Docker的流行激活了一直不温不火的PaaS,随着而来的是各类Micro-PaaS的出现,Kubernetes是其中最具代表性的一员,它是Google多年大规模容器管理技术的开源版本。本系列文章将逐一分析Kubernetes,本文介绍如何使用OpenVSwitch实现 Kubernetes的网络模型。

Kubernetes + OpenVSwitch

Kubernetes是扁平化的网络模型,每个Pod都有一个全局唯一的IP(IP-per-pod),Pod之间可以跨主机通信,Docker并无法支持容器的跨主机通信,所以需要对Docker进行增强,现有的方案有Flannel,OpenVSwitch,Weave等,本文将说明如何使用OpenVSwitch实现 Kubernetes的网络模型。

OpenVSwitch建立的网络,必须满足同一网络平面内:
  1. 主机之间以互相通信。
  2. 容器之间可以互相通信。
  3. 主机和容器可以互相通信。


目前现在有2台主机,分别创建了3个容器:
QQ截图20150907105334.png

那么要满足:
  1. Host1和Host2能够通信。
  2. Contain1和Container2(同主机),Container2和Container3(跨主机)能够通信。
  3. Host1和Container1/ Container2(同主机),Container3(跨主机)能够通信。


现在就通过OpenVSwitch实现这些,实现模型如下:
QQ截图20150907105431.png

首先安装OpenVSwitch和bridge-utils,本文环境是CentOS7, OpenVSwitch2.3.2:
$ yum install -y openvswitch bridge-utils



注意:安装OpenVSwitch失败的话,可以通过源码安装,参考http://1.chaoxu.sinaapp.com/archives/2350
为了保证容器IP不冲突,所以必须规划好docker的网段,
  • Host1: 10.246.0.0/24
  • Host2: 10.246.1.0/24


那么就需要设置docker的网桥:

Host1:
$ brctl addbr cbr0
$ ip link set dev cbr0 up
$ ifconfig cbr0 10.246.0.1 netmask 255.255.255.0 up

Host2:
$ brctl addbr cbr0
$ ip link set dev cbr0 up
$ ifconfig cbr0 10.246.1.1 netmask 255.255.255.0 up

同时设置docker的启动参数--bridge=cbr0

然后创建OpenVSwitch虚拟网桥,连接各个网络设备:
Host1:
#创建obr0
$ ovs-vsctl add-br obr0 -- set Bridge obr0 fail-mode=secure
$ ovs-vsctl set bridge obr0 protocols=OpenFlow13

#创建gre0隧道
$ ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=flow options:key=flow ofport_request=10

#创建tun0连接cbr0和obr0
$ ovs-vsctl add-port obr0 tun0 -- set Interface tun0 type=internal ofport_request=9
$ brctl addif cbr0 tun0
$ ip link set tun0 up

#设置OpenFlow规则
$ ovs-ofctl -O OpenFlow13 del-flows obr0
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,ip,in_port=10,nw_dst=10.246.0.1/24,actions=output:9
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,arp,in_port=10,nw_dst=10.246.0.1/24,actions=output:9
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,in_port=9,ip,nw_dst=10.246.1.1/24,actions=set_field:192.168.3.149->tun_dst,output:10
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,in_port=9,arp,nw_dst=10.246.1.1/24,actions=set_field:192.168.3.149->tun_dst,output:10

Host2:
#创建obr0
$ ovs-vsctl add-br obr0 -- set Bridge obr0 fail-mode=secure
$ ovs-vsctl set bridge obr0 protocols=OpenFlow13

#创建gre0隧道
$ ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=flow options:key=flow ofport_request=10

#创建tun0连接cbr0和obr0
$ ovs-vsctl add-port obr0 tun0 -- set Interface tun0 type=internal ofport_request=9
$ brctl addif cbr0 tun0
$ ip link set tun0 up

#设置OpenFlow规则
$ ovs-ofctl -O OpenFlow13 del-flows obr0
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,ip,in_port=10,nw_dst=10.246.1.1/24,actions=output:9
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,arp,in_port=10,nw_dst=10.246.1.1/24,actions=output:9
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,in_port=9,ip,nw_dst=10.246.0.1/24,actions=set_field:192.168.3.148->tun_dst,output:10
$ ovs-ofctl -O OpenFlow13 add-flow obr0 table=0,in_port=9,arp,nw_dst=10.246.0.1/24,actions=set_field:192.168.3.148->tun_dst,output:10

最后配置路由:
Host1:
$ ip route add 10.246.0.0/16 dev cbr0 scope link src 10.246.0.1

Host2
$ ip route add 10.246.0.0/16 dev cbr0 scope link src 10.246.1.1

参考



==========================================================
作者简介
吴龙辉,现任网宿科技高级运营工程师,致力于云计算PaaS的研究和实践,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。
邮箱:wulh@chinanetcenter.com/wlh6666@qq.com

1 个评论

类似方法都有个问题就是每增加一个node都需要在其他node机器添加路由。

要回复文章请先登录注册