1、开源云原生计算时代论坛专场张智博 2021年08月1日实现基于 Macvlan 的高性能容器网络About Men 张智博(牛小腩),深耕云计算多年,Openstack-Docker-Kubernetesn Rancher-SUSEn Rancher中国研发总监n SUSE中国研发总监n 长期聚焦在Linux+Container开源技术栈n Rancher 1.x-Rancher 2.xn RancherOS-K3OS-SUSE China Linuxn Base在沈阳容器网络千千万,为何钟情Macvlan?纯粹的技术视角,Macvlan简单到爆炸1.Docker时代就已“深入人心”2.对内核
2、几乎没有特殊要求,主流OS版本均默认支持3.无需复杂协议配置或者高端硬件需求,交换机二层网络划分即可4.运维人员容易管理,容器IP直达Kubernetes中使用Macvlan给用户带来什么?1.最大程度兼容虚拟化向容器迁移时,一些旧有的使用习惯2.较少的CPU消耗,极致的网络性能3.较小的管理代价,简单易懂世上仅存不多的,尚能手动“操作”的网络插件欣赏Ta的优点,也要包容Ta的缺点(面向Kubernetes生产环境)与Kubernetes期望的网络模型并不兼容Kubernetes网络模型 Container-to-container Pod-to-pod Pod-to-service Inte
3、rnet-to-service Loadbalancer NodeportMacvlan使用限制的影响 默认情况下,本机无法访问本地macvlan IP Service Cluster IP受限 Pod healthcheck受限 IP可直达访问 Nodeport/Loadbalancer模式不兼容 保持IP可固定打通本机与本地容器的macvlan网络1.在hostns中创建同网段的macvlan设备2.通过hostns路由方式转发访问3.Kubernetes集群host较多时,需要保留大量IP,比较浪费IP资源从实践经验看,这种模式仅适合小集群,面向通用产品化反而增加管理负担,容易出错。开源
4、社区原生的Macvlan CNI功能较弱产品化解决之道使用Multus CNI实现双网卡机制1.基于Multus CNI可以支持多CNI的原理2.主网卡使用与Kubernetes兼容性好的CNI插件,如Flannel/Canal/等3.扩展网卡使用Macvlan,使用Controller&CRD控制Pod IP分配4.容器网络既能满足Kubernetes网络模型需求,又能兼具高性能与IP直达能力使用CRD来持久化IP与Subnet数据为什么自己管理子网和IP分配?DHCP方式依赖交换机设置,很多用户实际使用时并不灵活。通过Controller&CRD管理更加方便,比如可调整子网的IP rang
5、e、控制IP释放,固定IP等。简洁部署 简化使用重点问题:Pod的服务发现1.使用headless service来给Macvlan网卡做服务发现2.生产实践经验看,固定IP更彻底更直接,避免DNS缓存的干扰重点问题:ARP缓存表同步1.Pod网卡启动后自动发送Gratuitous ARP,通知交换机和其他Pod更新ARP缓存表2.Pod容器启动时,应用镜像自动向网关地址发送ICMP亦可取得同样效果重点问题:避免主网卡的SNAT干扰1.默认情况下,对其他非macvlan网段的访问走eth0(Flannel/Canal等),SNAT成host IP2.以Macvlan网卡作为默认网关,外部网关打通其他网段,避免SNAT导致Source IP变动重点问题:纯粹Macvlan单网卡1.Pod容器中只有一个Macvlan网卡,无法兼容Kubernetes网络模型,各种svc服务发现、健康检查等机制均失效2.纯粹把容器作为虚拟机场景使用(过渡性方案)3.适合向Kubernetes平滑过渡的方案,外部自建服务发现THANKS