技术方案之 Kubernetes大规模容器网络优化
背景
1.1 大规模集群特点
- 大业务:单模块超大规模副本(300+)
- 小业务:资源减少边际成本(平摊控制层资源和运维管理资源)
- 网络互联互通 or 网络安全隔离
- 不确定业务:有潮汐业务 或者 热点业务(突发流量从小业务到大业务)
- 在离线混部:资源利用率提升,潮汐算力平衡
- 其他:新业务尝试
1.2 网络使用原则
- Global IPAM 和 CIDR 划分
- 大规模: 物理服务器组网,交换机组网方式不同,屏蔽底层网络局部特征:Overlay网络
- 网络互通性: 部分Pod IP和集群外IP互通访问, 特殊IP段分配: Global 地址池映射
- 常规
- 性能:路由表
- 可维护性:IPAM分配规则和CIDR管理
- 安全性:NetworkPolicies
1.3 网络使用
原则: 运维人员 精确化配置(人工规划) 与 软件CNI最终一致性分配 上的平衡
我们都清楚:
- 性能最好: Underlay CNI(MacVlan 或 SR-IOV 或者 SDN) 直通RDMA等网络
- 性能次一点:BGP 或者 BGP RR (其中将内核流程通过ebpf减少内核各个filter环)
- 性能再次一点: Overlay CNI IPinIP 或者 Vxlan 隧道网络(建设基础网络差异性)
- 性能最差:Global VPC CNI(与VPC网络同步,包括安全组等)
通过网络包L2/L3封装 和 IPAM各种分配策略,来换取大规模下人为规划和分配不确定
选型方案
2.1 实现的功能
2.1.1 multus-cni
配置多个cni 由于不同目的。 默认cni可用于pod-pod、pod-service、pod-node同网段互通,其他CNI由于外部互通(集群外网络互通等能力)
优点:
- 不同场景,不同网络链路
- 更方便扩展
缺点:
- IP段成倍使用
- Kubernetes 需要1.25以上,支持POD支持多IP
- 容器内网卡命名规则,南北东西流量按不同名称网卡
2.1.2 calico ebpf 和 clium ebpf
本质:通过绕过内存filter等模块,提升性能; ebpf替换kube-proxy等
优点:
- 网络链路简单
- 性能优先
缺点:
- 内核要求 >= 5.10+
- eBPF基于TBF插件控制流量,对于NetworkPolicies支持不全面
- DSF和SNAT对外流量复杂性
- kube-proxy替换,也就是对service clusterIP分配替换
2.1.3 sriov-cni
CNI直连物理网卡转发,数据最优
优点:
- 性能最优
- 网卡支持类型局限
缺点:
- 配置最复杂:HW 物理网卡配置
- 网卡支持类型局限
2.2 性能对比结果
说明:
- calico ebpf:对内核有要求5.8
- calico ipip网络要求最宽松,单不支持PodIP 与集群外直接互通,只能通过SNAT对外暴漏
- calico bgp RR:需要知道Node在哪些leaf交换机下,进行精确认为配置
2.2.1 方式一: Calico IPinIP隧道 + kubproxy IPVS
使用场景:
- C/S架构服务,对内核、网络限流、TCP长链接均衡等无特殊要求;
- server端,单集群(大集群内)闭环,即无外部客户端服务发现;
- 网络东西向流量,集群内闭环;南北向流量走NAT;
注意点:
- IPIP MTU 1480(-20);
- kube-proxy分配的是ClusterIP, calico/flannel分配的是Pod IP
通过Service 访问具体实例的Endpoint, 核心是在kube-proxy
因此 kube-proxy 更改
--ipvs-min-sync-period=1s #默认:最小刷新间隔1s
--ipvs-sync-period=5s # 默认:5s周期性刷新
--cleanup=false
--ipvs-min-sync-period=0s # 发生事件实时刷新
--ipvs-sync-period=30s # 30s周期性刷新, 刷新一次节点 iptables 规则
--cleanup=true (清理 iptables 和 ipvs 规则并退出)
对于数据面高并发场景,服务服务配置
--ipvs-scheduler=lc #最小连接,默认是rr round-robin
3、 无论是iptable 或者 ipvs 底层都会走conntracker
$ sysctl -w net.netfilter.nf_conntrack_max=2310720
kube-proxy 启动的时候会重新设置, 因此配置参数可以按node CPU 个数进行调整
--conntrack-max-per-core=144420 # 2310720/cpu个数。 2310720/16核 = 144420
--conntrack-min=2310720 # 设置为nf_conntrack_max
2.2.2 方式二: Calico BGP RR + kubeproxy IPVS + IPVS scheduler lc
设置过的IPPool, 对每一个IPPool做路由聚合; 注意:
- IPPool不能冲突,blockSize 全部保持一致 27;
- calico_datastore 独立K8s外静态pod etcd;
- RR 节点多网卡做bond,并且外部处于不同的交换机下; 并且在这台机器上RR节点优先走网卡权重Queue队列;
「如果这篇文章对你有用,请随意打赏」
FEATURED TAGS
agent
apiserver
application
bandwidth-limit
cgo
cgroupfs
ci/cd
client-go
cloudnative
cncf
cni
community
container
container-network-interface
containerd
controller
coredns
crd
custom-controller
deployment
docker
docker-build
docker-image
drop
ebpf
ecology
egress
etcd
gitee
github
gitlab
golang
governance
hpa
http2
image
ingress
iptables
jobs
kata
kata-runtime
kernel
kind
kubelet
kubenetes
kubernetes
library
linux-os
logging
loki
metrics
monitor
namespace
network
network-troubleshooting
node
nodeport
pingmesh
pod
prestop
prometheus
proxyless
pvc
rollingupdate
schedule
scheduler
serverless
sidecar
sigtrem
systemd
throttling
timeout
tools
traceroute