设为首页 收藏本站
查看: 1668|回复: 0

[经验分享] Openvswitch GRE实现Kubernetes网络模型

[复制链接]

尚未签到

发表于 2018-9-16 08:11:18 | 显示全部楼层 |阅读模式
1. 前言
  Kubernetes设计了一种特别的网络模型,其跟原生Docker网络模型有些偏离。在这种设计中,Kubernetes定义了一个抽象概念:Pod, 每个Pod是一系列容器的集合,而且有一个共享IP,所有容器共享相同的网络命名空间。Pod不仅可以与物理机器间通信,而且还可以使跨网络间容器能通信。Kubernetes的这种IP-per-pod的设计思想有很多好处,比如:从端口分配、网络、命名、服务发现、负载均衡、应用程序配置以及迁移方面来看,这种模型使得开发人员、运维人员可以把Pod当做一个虚拟机或者是物理机,有很好的后向兼容能力。当前Google在它的云平台GCE上实现了这种IP-per-pod模型,但是如果在本地使用Kubernetes,那就得自己实现这种模型,本文主要讲述就如何使用Openvswitch GRE实现这种模型。
2. 实现方案
  本文用2台主机运行CentOS 7, 实现可如下图描述: DSC0000.png
2.1 安装Docker
  安装步骤参照如下脚本:
#Docker默认配置文件  
DOCKER_CONFIG=/etc/sysconfig/docker
  

  
#下载最新Docker安装文件
  
wget https://get.docker.com/builds/Linux/x86_64/docker-latest -O /usr/bin/docker
  
chmod +x /usr/bin/docker
  

  
#配置Docker unit文件
  
cat /etc/sysconfig/docker
  
systemctl start docker
2.4 设置Openvswitch网桥及GRE
#新建Openvswitch网桥  
ovs-vsctl add-br ovsbr
  

  
#启用SPT协议防止网桥环路
  
ovs-vsctl set bridge ovsbr stp_enable=true
  

  
#添加ovsbr到本地localbr0,使得容器流量通过OVS流经tunnel
  
brctl addif localbr0 ovsbr
  
ip link set dev ovsbr up
  

  
#创建GRE
  
ovs-vsctl add-port ovsbr tep0 -- set interface tep0 type=internal
  

  
#需在每个主机上修改tep0 IP地址
  
ip addr add 192.168.1.1/24 dev tep0
  
ip addr add 192.168.1.2/24 dev tep0
  
ip link set dev tep0 up
  

  
#使用GRE隧道连接每个主机上的Openvswitch网桥
  
#10.224.106.127
  
ovs-vsctl add-port ovsbr gre0 -- set interface gre0 type=gre options:remote_ip=10.224.106.128
  

  
#10.224.106.128
  
ovs-vsctl add-port ovsbr gre0 -- set interface gre0 type=gre options:remote_ip=10.224.106.127
  

  
#配置路由使得跨主机间容器的通信
  
ip route add 10.244.0.0/16 dev tep0
  

  
#为了使得容器访问Internet,在两台主机上配置NAT
  
iptables -t nat -A POSTROUTING -s 10.244.0.0/16 -o ens192 -j MASQUERADE
2.5 验证
  完成了以上的操作,这时以下应该能正常工作:

  •   可以相互ping tep0的地址
    [root@minion-1 ~]# ping 192.168.1.2  
    PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
      
    64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.929 ms
      
    64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.642 ms
      
    64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.322 ms
      
    64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.366 ms
      
    ^C
      
    --- 192.168.1.2 ping statistics ---
      
    4 packets transmitted, 4 received, 0% packet loss, time 3000ms
      
    rtt min/avg/max/mdev = 0.322/0.564/0.929/0.245 ms
  •   可以相互ping localbr0的地址
    [root@minion-1 ~]# ping 10.244.2.1  
    PING 10.244.2.1 (10.244.2.1) 56(84) bytes of data.
      
    64 bytes from 10.244.2.1: icmp_seq=1 ttl=64 time=0.927 ms
      
    64 bytes from 10.244.2.1: icmp_seq=2 ttl=64 time=0.337 ms
      
    64 bytes from 10.244.2.1: icmp_seq=3 ttl=64 time=0.409 ms
      
    ^C
      
    --- 10.244.2.1 ping statistics ---
      
    3 packets transmitted, 3 received, 0% packet loss, time 2000ms
      
    rtt min/avg/max/mdev = 0.337/0.557/0.927/0.264 ms
  •   两台主机上容器可以相互ping通
      在主机10.224.106.127和10.224.106.128上执行如下命令运行一个新的容器:
    docker run -ti ubuntu /bin/bash  然后10.224.106.127的容器ping 10.224.106.128的容器,
    root@e38da4440eaf:/# ping 10.244.2.3  
    PING 10.244.2.3 (10.244.2.3) 56(84) bytes of data.
      
    64 bytes from 10.244.2.3: icmp_seq=1 ttl=63 time=0.781 ms
      
    64 bytes from 10.244.2.3: icmp_seq=2 ttl=63 time=0.404 ms
      
    ^C
      
    --- 10.244.2.3 ping statistics ---
      
    2 packets transmitted, 2 received, 0% packet loss, time 1000ms
      
    rtt min/avg/max/mdev = 0.404/0.592/0.781/0.190 ms
      从10.224.106.128的容器ping 10.224.106.127的容器。
    root@37b272af0d09:/# ping 10.244.1.3  
    PING 10.244.1.3 (10.244.1.3) 56(84) bytes of data.
      
    64 bytes from 10.244.1.3: icmp_seq=1 ttl=63 time=1.70 ms
      
    64 bytes from 10.244.1.3: icmp_seq=2 ttl=63 time=0.400 ms
      
    ^C
      
    --- 10.244.1.3 ping statistics ---
      
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
      
    rtt min/avg/max/mdev = 0.400/1.054/1.708/0.654 ms
3. 结论
  本文通过Openvswitch GRE实现Kubernetes网络模型,但是如果在大规模系统中,此方法显得有点笨拙。例如,如果系统有n台主机,且它们之间需要通信,则需建立n(n-1)/2条GRE隧道,虽然可以通过启用SPT协议防止网桥环路,但维护n(n-1)/2条隧道仍然工作量很大。所以接下来考虑如何能自动化实现。
4. 参考资料

  •   https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/design/networking.md
  •   https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/ovs-networking.md
  •   https://docs.docker.com/installation/centos/
  •   https://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/
5. 作者简介
  杨章显,现就职于Cisco,主要从事WebEx SaaS服务运维,系统性能分析等工作。特别关注云计算,自动化运维,部署等技术,尤其是Go、OpenvSwitch、Docker及其生态圈技术,如Kubernetes、Flocker等Docker相关开源项目。Email: yangzhangxian@gmail.com



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-584333-1-1.html 上篇帖子: CentOS 7实战Kubernetes部署 下篇帖子: centos 7 yum安装kubernetes cluster 1.0
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表