网络模型
Cubecni网络插件使用VPC资源构建underlay容器网络,适用于高性能场景。Cubecni会为节点添加弹性网卡,并为弹性网卡申请多个辅助IP。Pod的主网卡是该弹性网卡的IPVLAN虚拟网络接口,使用弹性网卡的辅助IP作为容器IP。这种基于弹性网卡和IPVLAN的underlay容器网络,没有封包解包或节点路由损耗,容器网络性能相比于容器隧道网络有一定的优势。容器网络直接使用VPC的弹性网卡和IP资源,可以支持同一VPC内云服务器从集群外直接访问容器等特殊场景。使用Cubecni网络插件的集群,集群可创建pod总数受子网可用IP数限制。
说明1、节点内Pod间通信:同节点的pod间通信直接通过IPVLAN转发;
2、跨节点Pod间通信:跨节点pod间通信直接走弹性网卡二层网络;
3、Pod访问集群外地址:pod访问集群外地址走子网网关转发。
优缺点
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。
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。