网络模型
Cubecni网络插件使用VPC资源构建Underlay容器网络,可用于使用云主机(ECS)和弹性裸金属(EBM)部署的Kubernetes集群,适用于高性能场景。Cubecni基于弹性网卡构建的Underlay容器网络,没有封包解包开销,部分场景无主机路由和netfilter处理开销,容器网络性能相比于容器隧道网络有一定的优势,并且支持同一VPC内云服务器从集群外直接访问容器等特殊场景。
Cubecni支持多种模式,下图为共享ENI-IPVLAN模式网络模型:
共享ENI-IPVLAN模式
Cubecni会为节点添加弹性网卡并申请多个辅助IP,Pod主网卡是该弹性网卡的IPVLAN虚拟网络接口,Pod IP为弹性网卡的辅助IP。此模式下,流量走向示意如下:
说明:
节点内Pod间通信:同节点的Pod间通信直接通过IPVLAN转发;
跨节点Pod间通信:跨节点Pod间通信走弹性网卡二层网络,不经主机网络栈处理;
Pod访问Service:走主机网络栈处理和转发;
Pod访问集群外地址:Pod访问集群外地址走子网网关转发。
共享ENI-策略路由模式
Cubecni会为节点添加弹性网卡并申请多个辅助IP,Pod主网卡为Veth Pair一端,Pod IP为弹性网卡的辅助IP,通过配置策略路由实现容器网络。此模式下,流量走向示意如下:
说明:
节点内Pod间通信:同节点的Pod间通信走主机网络栈处理和转发;
跨节点Pod间通信:跨节点Pod间通信走主机网络栈处理和转发,经弹性网卡出主机;
Pod访问Service:走主机网络栈处理和转发;
Pod访问集群外地址:Pod访问集群外地址走主机网络栈处理和转发,经弹性网卡出主机。
独占ENI模式
Cubecni会为Pod单独添加一张弹性网卡,Pod IP为该弹性网卡的主IP,并配置Veth Pair实现Service访问。此模式下,流量走向示意如下:
说明如下:
节点内Pod间通信:同节点的Pod间通信走弹性网卡经VPC网络;
跨节点Pod间通信:跨节点的Pod间通信走弹性网卡经VPC网络;
Pod访问Service:走Veth Pair经主机网络栈处理和转发;
Pod访问集群外地址:Pod访问集群外地址走弹性网卡到VPC网络。
注意
独占ENI模式为内测特性。
Cubecni多种模式对比
对比项 | 共享ENI-策略路由 | 共享ENI-IPVLAN | 独占ENI |
---|---|---|---|
Pod部署密度 | Pod部署密度较高,单个节点可支持数百个Pod | Pod部署密度较高,单个节点可支持数百个Pod | Pod部署密度较低,支持个位数的Pod,取决于主机的ENI配额 |
带宽优先级 | 支持配置网卡队列发送数据包时的优先级 | 支持配置网卡队列发送数据包时的优先级 | 不支持 |
NetworkPolicy支持 | 支持Kubernetes原生NetworkPolicy,提供了基于策略的访问控制能力 | 支持Kubernetes原生NetworkPolicy,提供了基于策略的访问控制能力。 | 不支持 |
适用场景 | 常用Kubernetes使用场景 | 常用Kubernetes使用场景 | 此模式下网络性能更接近主机,适用对网络性能有较高要求的场景,例如需要高网络吞吐量或低延迟的应用 |
ENI分配方式 | 多个Pod共享一个ENI | 多个Pod共享一个ENI | 每个Pod独占一个ENI |
OS要求 | 无 | 要求使用CtyunOS3 | 无 |
Pod粒度网络配置 | 不支持 | 不支持 | 支持为Pod配置固定IP、安全组和子网 |
带宽限制 | 支持Egress/Ingress带宽限制 | 支持Egress,不支持Ingress带宽限制 | 支持Egress/Ingress带宽限制 |
优缺点
Cubecni容器网络优点如下:
同个VPC内,集群外部网络资源可与容器IP互通;
没有解封包和节点路由消耗,容器网络性能优于隧道网络;
SLB可直通容器后端,无需经节点NodePort转发,性能更优;
容器访问VPC网络资源,其源IP是容器IP,无需经过节点SNAT,减少节点netfilter连接跟踪表消耗,性能更优且便于审计。
Cubecni容器网络缺点如下:
Pod直接使用VPC的IP地址,数量受限于VPC子网的可用IP数,需提前规划。
应用场景
Cubecni容器网络适用如下场景:
适用于需pod能与VPC集群外网络资源互通的场景,如部分业务部署在云主机部分部署在容器的复杂系统,可能需要打通云主机网络和容器网络;
适用于对网络带宽和时延要求高的业务场景,例如游戏、直播类应用;
高性能计算场景,IPVLAN等使用的CPU资源少于隧道网络,为业务本身留出更多计算资源。
容器IP地址段分配
订购使用Cubecni容器网络插件的集群,需为Cubecni选择一个VPC子网。该子网用于为容器提供IP地址,其空闲IP数直接决定可创建pod数上限。建议选择一个大子网给集群使用,如下所示,创建一个掩码为18位的子网,其可用IP为16382个,可为16382个pod分配IP地址:
订购时选择大子网作为pod子网:
网段规划建议
集群网络网段分为节点网络、容器网络和服务网络,在规划这三种网络的网段时需考虑如下要点:
容器网段为订购时选择的 Pod子网网段 ,不能与主机网段及服务网段重叠,服务网段不能和VPC网段重叠;
结合集群规模选择合适的网段,节点所属子网的空闲IP数直接限制了集群可添加节点数,容器网段(Pod子网网段 )大小直接限制了可创建的Pod总数,建议选择一个大子网用于容器网段;服务网段大小直接限制了可创建的Service总数;
单个节点可创建Pod总数还与其它配置相关,如Pod request总量等。
网络访问示例
创建一个使用Calico容器网络插件的集群,然后创建一个Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- image: registry-vpc-crs-huadong1.ctyun.cn/library/nginx-photon:v1.8.6
name: demo
查看对应的pod,可见pod的IP地址为子网IP,与节点主网卡地址属同个VPC:
[root@CCSEAGENT-vmBccb1ffn paasdp]# ip addr show eth0
2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:84:9b:c1 brd ff:ff:ff:ff:ff:ff
inet 192.168.32.50/19 brd 192.168.63.255 scope global dynamic eth0
valid_lft 313390280sec preferred_lft 313390280sec
inet6 fe80::f816:3eff:fe84:9bc1/64 scope link
valid_lft forever preferred_lft forever
[root@CCSEAGENT-vmBccb1ffn paasdp]# kubectl get po -l app=nginx-demo -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-demo-748fb499d7-8f2t5 1/1 Running 0 24s 192.168.0.37 ccseagent-vmBccb1ffn <none> <none>
nginx-demo-748fb499d7-dxflp 1/1 Running 0 21s 192.168.0.5 ccseagent-vmAcba142 <none> <none>
在集群内部节点或Pod内,都能直接访问Pod。如下所示,节点直接访问Pod:
如下所示,Pod直接访问Pod:
VPC内集群外网络资源,例如云主机,也能直接访问pod IP。
带宽限制和优先级
可使用以下Pod注解指定Pod出、入方向的带宽:
注解 | 含义 |
---|---|
kubernetes.io/ingress-bandwidth: 10M | Pod入站带宽限制 |
kubernetes.io/egress-bandwidth: 10M | Pod出站带宽限制 |
Cubecni支持通过配置共享ENI的网络队列,实现高优先级Pod的流量优先发送,从而改善延迟。默认情况下,优先级控制未启用。通过以下Pod注解指定Pod使用的优先级:
注解 | 含义 |
---|---|
k8s.ctyun.com/network-priority: best-effort | 适用于大宽带业务 |
k8s.ctyun.com/network-priority: burstable | 默认值,适用于普通业务 |
k8s.ctyun.com/network-priority: guaranteed | 适用于延迟敏感业务 |
可通过如下方式启用:
执行以下命令,打开和修改Cubecni的配置文件;
kubectl -nkube-system edit cm cubecni-config
在10-cubecni.conflist下,增加enable_network_priority开启优先级控制;
10-cubecni.conflist: ---- { "cniVersion": "0.3.1", "name": "cubecni", "plugins": [ { "type": "cubecni", "capabilities": {"bandwidth": true}, "enable_network_priority": true, ### 添加该配置,改为true } ] }
重建Cubecni Pods使得配置生效。
# 滚动重建Pod kubectl -nkube-system rollout restart ds/cubecni # 等待Pod重建完成 kubectl -nkube-system get po -l app=cubecni -owide -w
IPv6支持
IPv6处于内测阶段,当开启IPv6后,有如下限制:
暂不支持使用多个Pod子网;
单个节点可申请50个IPv6地址,故单节点最多创建50个使用容器网络的Pod。
低网络时延
Pod直接访问Pod场景,时延对比如下图所示。可见cubecni IPVLAN模式时延接近主机网络。独占ENI模式时延有时约略优于主机网络,理想情况下相比于calico IPIP模式提升约30%:
图示中,host表示主机网络时延,集群停止k8s服务后,节点运行sockperf客户端访问另一节点sockperf服务端的时延;
cubecni IPVLAN模式时延接近baseline,该场景流量不经主机网络栈处理,不会因此额外引入时延;
cubecni 独占ENI模式,Pod独占弹性网卡,时延无限接近主机网络;
cubecni PolicyRoute模式,流量经主机网络栈处理,故时延较高;
calico IPIP模式,流量均经过主机网络栈处理,且有IPIP解封包开销,iptables更为复杂,故时延较高。
当集群部署监控和日志等消耗带宽的插件后,容器网络整体时延均会增加,calico IPIP模式时延增加幅度大于cubecni。
Networkpolicy使用限制
cubecni基于cilium实现NetworkPolicy,目前仅支持ctyunos3或内核不小于5.10的系统。有如下限制:
IP Blocks即使包含Pod地址,这些Pod地址也不会加入白名单,需通过PodSelector或NamespeceSelector选择Pod;
IP Blocks的except支持不佳,不建议使用except关键字;
若配置egress规则,会限制Pod访问所在节点以及其上HostNetwork类型Pod,即使白名单配置了所在Host地址也无效。
插件升级
cubecni 1.0.7版本支持配置多个子网,若需升级到该版本,请提工单申请。
注意
2024.5之前开通的集群需提工单申请升级网络插件版本,2024.5之后的集群默认安装最新版的网络插件。
工单路径:新建工单 -> 云容器引擎 -> 产品技术支持,工单标题为“网络插件多子网升级”,工单内容请写明待升级集群实例ID。