網絡模型
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.daliqc.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。
插件升級
cubecni 1.0.7版本支持配置多個子網,若需升級到該版本,請提工單申請。
注意
2024.5之前開通的集群需提工單申請升級網絡插件版本,2024.5之后的集群默認安裝最新版的網絡插件。
工單路徑:新建工單 -> 云容器引擎 -> 產品技術支持,工單標題為“網絡插件多子網升級”,工單內容請寫明待升級集群實例ID。