HC Bridge容器网络模式分享

 刘泽宇 分布式实验室 

HC Bridge容器网络模式分享

本文主要介绍在Kubernetes 环境下,有哪些场景需要使用Linux Bridge来满足应用对容器网络的需求。重点讲解HC Bridge容器网络插件与Kubernetes原生的Bridge CNI相比,有哪些改进,最后分享HC Bridge模式的结构和各组件的功能。


HC Bridge容器网络模式分享



Kubernetes网络原则
IP-per-Pod,每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间。
集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问。
所有容器之间无需NAT就可以直接互相访问;所有Node和所有容器之间无需NAT就可以直接互相访问。
容器自己看到的IP跟其他容器看到的一样。
Service Cluster IP可在集群内部访问,外部请求需要通过NodePort、Load Balance或者Ingress来访问。

HC Bridge容器网络模式分享

HC Bridge容器网络模式分享


容器网络的常见需求HC Bridge容器网络模式分享



  • 内部服务之间通过Kubernetes Service Name进行访问。

  • 服务能够保留Kubernetes中原生Service的负载均衡、故障隔离、扩展的特性。

  • Pod网络能够直被外部应用访问

HC Bridge容器网络模式分享


  • Pod网络能够被传统防火墙识别,不能使用Overlay网络

  • 对于有状态服务,例如MySQL、ES、MQ、Redis等中间件,能够固定IP地址的功能

  • 在Kubernetes集群里,一般采用虚拟网络,不能直接与外部的网络进行直接通信。当在Pod运行的微服务注册到注册中心时,如果没有使用NodePort/ingress暴露服务,Pod提供的服务不能被外部的访问。另外,部署在容器环境的应用要访问容器外部的服务时,通常使用Nat来把Pod IP转换为物理主机Node的IP,导致无法通过Pod 的IP精细准确地配置硬件防火墙策略。

  • 原生的Flannel、Weave不满足此要求,没有将容器网络分发到其他网络的能力。

  • Calico、Kube-router虽然有能力解决此问题,但是对物理交换机设备要求较高,而且增加了网络管理的管理成本。基于BGP和路由的网络模式对固定IP的支持不够友好,当出现固定IP需求时,PodIP需要能够跨Node漂移,路由条目无法聚合,路由条目数量和路由学习会成为瓶颈。

  • Contiv、ovn-org/OVN-Kubernetes虽然满足要求,但是如果没有统一对接SDN南向接口,没有充分地发挥出SDN的优势,而且SDN的集中控制的模式在动态扩容、快速扩展的情况下存在瓶颈。


基于以上考虑,已有社区的CNI并不能满足要求,所以我们选择基于Linux Bridge自研了HC Bridge来应对这些需求。
HC Briddge 介绍HC Bridge容器网络模式分享



Docker Bridge模式HC Bridge容器网络模式分享


Docker Bridge模式
  • Node内Pod间访问:对于一个Node内的多个Pod,都连接在docker0虚拟网桥,在同一个广播域,Pod之间可以通过IP地址和Mac地址直接访问。

  • 跨Node内Pod访问:如果是跨Node的Pod访问,需要借助路由来实现,最简单的是Flannel的host-gw模式。

  • Pod访问集群外部网络:对于Pod访问外部网络,每个Pod中配置网关为172.1.0.1,发出去的数据包先到达docker0,然后交给Node机器的协议栈,由于目的IP是外网IP,且host机器开启了IP forward功能,于是数据包会通过eth0发送出去,由于172.1.0.1是内网IP,发出去之前会先做NAT转换。


HC Bridge模式HC Bridge容器网络模式分享


HC Bridge结构
与Docker Bridge不同的是,HC Bridge将Pod与物理网络连接起来。
Pod之间可以通过Mac地址互相访问,Pod直接连接在物理网络。
Node内Pod间访问:对于同一个Node之间的Pod,可以直接借助Linux Bridge br0的二层转发来通信。
跨Node内Pod访问:对于跨Node的Pod,如果Pod在同一个VLAN内,Pod通过linux bridge br0转发到物理交换机,然后物理交换机转发到另一个Pod所在Node的Linux Bridge上,Linux Bridge再根据mac地址转发到被访问的Pod。对于在同一个VLAN的Pod,在同一个广播域,通过借助ARP协议就能实现互相访问。
Pod访问外部网络:由于Pod网络地址等同于物理主机,Pod要访问其他网段的地址,只需要在网关上配置相应的路由规则即可。
相比社区的Bridge CNI,HC Bridge有什么特点
VLAN功能
Kubernetes自带的Bridge CNI,功能比较简单,在单台Node上只允许一个VLAN。远远没有达到生产上可以使用的程度。HC Bridge相比社区的Bridge CNI有以下增强:
丰富了VLAN的功能,社区VLAN功能非常简单,一个Node的所有Pod VLAN tag都相同,HC Bridge在创建Pod网络之前,先调用IPAM来确定Pod的VLAN和IP,这样同一个Node上的Pod可以根据业务属性选择不同的VLAN。通过支持VLAN功能,便于Pod规模的动态扩展和精细化管理。

HC Bridge容器网络模式分享

HC Bridge VLAN功能
HC Bridge组件功能

HC Bridge容器网络模式分享


HC Bridge:实现CNI接口的二进制文件,负责创建容器网络。
hcipam:实现CNI IPAM接口的二进制文件,在调用HC Bridge创建容器网络时,先调用hcipam获取容器的IP、路由、vlan tag等信息。对于有状态服务,提供固定IP地址的功能。
HA_Listner:用来保证容器网络的高可用,检查主机veth peer网卡的状态,定时检查和恢复;当网卡出现故障时,通过内核模块来监听在高可用组网环境下的主备网卡切换的消息,做出对应的操作来恢复容器网络。
hc-bridge-controller-manager:提供网络管理的rest api,提供管理IPPool的功能;监听apiserver的事件,在故障发生之后能够对IP只有进行回收和清理。


上一篇:泛微云桥e-Bridge任意文件读取漏洞


下一篇:KVM 虚机热添加网卡