10 东西向流量组件 Calico 的落地实践
Kubernetes 网络并没有原生的方案,它从一开始就给我们送来了一个选择题。到底选哪种网络方案才是最佳的方案呢?网络问题一直让社区用户很困惑,以至于在早期,不同场景下的方案如雨后春笋般涌现出来。其中比较优秀的就是今天选择给大家介绍的网络组件 Calico。这里我们要强调的是,Calico 方案并不是唯一方案,我们在社区仍然能看到很多优秀的方案比如 Cilium、OvS、Contiv、Flannel 等,至于选择它来讲解东西向流量的组件落地,实在是当前国内业界大部分的方案都是以 Cailico 实践为主,介绍它可以起到一个案例示范的作用。
容器网络路由的原理
众所周知容器原生网络模型基于单机的 veth 虚拟网桥实现,无法跨主机互联互通。如果想让容器跨主机互联互通,需要支持以下 3 点:
- 网络控制面需要保证容器 IP 的唯一性
- 两个容器需要放在一个数据平面
- 需要工具来自动解决容器网络地址转换 这里我们通过一个原生网络路由的例子来帮助大家理解容器网络互联互通的基本原理:

图:Docker 19.03.12 版本直接路由模式图例
分别对主机 1 和主机 2 上的 docker0 进行配置,重启 docker 服务生效
编辑主机 1 上的 /etc/docker/daemon.json 文件,添加内容:“bip” : “ip/netmask”。
编辑主机 2 上的 /etc/docker/daemon.json 文件,添加内容:“bip” : “ip/netmask”。
主机 1 和主机 2 上均执行如下命令,重启 Docker 服务以使修改后的 docker0 网段生效。
添加路由规则
主机 1 上添加路由规则如下:
主机 2 上添加路由规则如下:
理论上配置完路由后应该从主机 1 可以连接到主机 2 的 docker0,实际场景下因为交换机会检查 docker0 的 mac 地址,并把这个非法的地址下的数据包直接 DROP 掉,让跨主机的容器无法想通,但这个并不妨碍我们理解原理。Calico 网络路由原理和以上示范静态路由原理是一致的,那么它是如何实现连通的呢?
安装 Calico 后,主机上检查如下:
对比可以知道,和上面范例中分配 IP 段一样,Calico 也是为每台主机分配固定的 IP 段保证容器网络 IP 不冲突。我们再来看下路由规则:
两台主机路由表上都做了对方 IP 的路由信息。
我们通过部署容器来测试网络连通性:
因为最新的 Calico 默认配置的模式是 vxlanMode 模式,你没有修改路由器的权限,所以需要修改 ipipMode 为 Always。
修改后在命令行下查看路由规则的办法,确认虚拟网络走了 tunnel 网卡口:
通过 kubectl exec 可以进入 Pod 容器进行连通性测试:
Calico 网络的性能
在规模配置在 10 台以下的情况下,容器传输效率依赖主机网卡性能,结果说明性能不差。
总结
Calico 作为业内常用的方案,它的好处就是灵活配置。因为它有 BGP 协议支持,可以跨数据中心的互联互通。从实践角度来看,它具备复杂场景下灵活配置的特点,所以也在业界主流比较推荐。当然这里我们的目的并不是推荐 Calico,我们仍然需要依据你当前集群的具体需要来规划,让容器网络能更方便的使用。
参考文章: