精简版
0
0
0
云栖社区 > 容器服务 Docker&Kubernetes> 博客 > 正文
csome 2020-02-05 15:43:08 浏览 95
性能
网络性能
集群
微服务
测试
- Image
- kernel
- Ping
展开阅读全文
背景
随着各种类型的应用的容器化, 除了无状态的微服务应用, 越来越多像数据库, 机器学习等对网络性能和延时非常敏感的应用也逐渐跑在了 Kubernetes 上. 对于这种网络性能和延时特别敏感的应用, 阿里云 Kubernetes 集群的网络方案 Terway 在之前提供了 Pod 独占 ENI(弹性网卡) 的网络模式, 让 Pod 可以拥有和 ECS 完全一样的一张弹性网卡, 性能相对 ECS 完全没有损失. 但 ECS 可以绑定的弹性网卡数量有限, 使用独占 ENI(弹性网卡) 的模式的机器只能运行个位数的 Pod 数, 应用没办法部署太密集. 所以 Terway 在 ENI 多 IP 的模式中推出了基于 IPVlan 的 Pod 网络, 每个 ENI 可以供多达 10 个 Pod 共享, 并且 IPVlan 的内核技术也能将损耗降到最低, 在实际测试中网络延时可以媲美独占 ENI 模式.
原理概要
IPVlan 是一种 Linux 内核的网络虚拟化技术, 从 Linux 3.19 版本开始支持, 通过 IPVlan 可以将一个网络接口创建出多个子虚拟接口. 这些子虚拟接口可以设置不同的 IP 地址, 父网卡会根据包中的 IP 地址决定把包转发到哪个子虚拟网卡. 这些子虚拟网卡可以供 k8s 的每个 Pod 使用, 从而让多个 Pod 可以共用一张弹性网卡. 而对于 Aliyun 的 ENI(弹性网卡), 支持在网卡上额外再分配 10-20 个辅助 VPC IP, 可以动态分配辅助 IP 用于 IPVlan 子虚拟网卡配置.
适用场景和要求
由于 IPVlan 是比较新的内核版本才支持的虚拟化技术, 所以有一定的要求和试用场景:
适用场景:
Pod 和 Pod 直接通信的需求更多时, 由于 IPVlan 访问 k8s service 需要额外走 SNAT, 所以 pod 访问 Service 的场景性能差一些 (具体可参考 https://kernel.taobao.org/2019/11/ipvlan-for-kubernete-net/)
对网络延时敏感的应用, 比如游戏, 数据库, 机器学习等
独占 ENI 的模式没办法满足规模需求时
IPVlan 模式目前还不支持 Kubernetes NetworkPolicy
要求:
阿里云 Kubernetes 集群 Terway 网络 ENI 多 IP 模式, 并且 Terway 组件升级到最新版本
节点使用 Aliyun Linux2 的操作系统 (内核版本 4.19, 满足 IPVlan 模式需求)
使用方法
1. 创建阿里云 Kubernetes 集群
选择操作系统为 AliyunLinux2
选择 Terway 网络插件
2. 修改 Terway 转发模式为 IPVlan
创建好集群后, 通过 kubectl 连接到该集群, 然后修改 Terway 的 configmap:
kubectl edit cm eni-config -n kube-system
增加转发模式配置:
重启集群的每个节点
3. 验证重启节点能正常启动 Pod
性能对比
时延
时延采用 ping,netperf 做了测试. ping 测试了普通模式和洪泛模式, netperf 测试了 tcp_rr, udp_rr 两种模式. 结果如下:
其中 IPVlan, ENI 模式较为接近. 策略路由普通 ping 模式下约有 20ns 增加, 洪泛 ping 模式 7ns 增加; udp_rr 下降约 8%,tcp_rr 下降约 10%.
带宽
带宽测试采用 netperf 测试了 tcp_stream 和不同包长下的 udp_stream, 结果如下:
其中 udp stream 模式下 ENI,IPVlan 较为接近约 0.02% 以下, 策略路由约 7% 左右. 吞吐 IPVlan 比 ENI 约有 25% 下降, 策略路由相比 ENI 约有 50% 下降. tcp stream 模式下由于 gso, gro 的加速, 吞吐较为接近.
参考文档:
阿里云系统组技术博客 --Kubernetes 网络的 IPVlan 方案 https://kernel.taobao.org/2019/11/ipvlan-for-kubernete-net/ (感谢阿里云系统组贡献了 Kubernetes IPVlan 的网络模式)
来源: https://yq.aliyun.com/articles/743689