网络模型
Cubecni网络插件使用VPC资源构建underlay容器网络,适用于高性能场景。Cubecni会为节点添加弹性网卡,并为弹性网卡申请多个辅助IP。Pod使用的eth0网卡是该弹性网卡的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。