網絡模型
Calico IPIP隧道網絡在節點網絡基礎上通過IPIP隧道技術構建獨立于節點網絡平面的容器網絡平面。Calico的felix組件提供容器網絡接口管理、主機路由管理和ACL管理等功能,brid組件則將本節點容器路由通過BGP協議廣播告知其它集群節點。容器跨主機報文走IPIP隧道,發給目的容器的IP報文被封裝成發給目的節點的IP報文進行隧道傳輸,這類解封包雖然有性能損耗,但具有通用性強、互通性強、支持NetworkPolicy等優勢,可以滿足大多數對容器網絡性能要求不高及沒有VPC互通需求的場景。
說明1、節點內Pod間通信:同節點的Pod間通信直接通過本節點路由直接轉發;
2、跨節點Pod間通信:跨節點Pod間的通信通過IPIP隧道封裝后,轉發到對端節點上;
3、Pod訪問集群外地址:Pod訪問集群外地址通過路由轉發并SNAT出去。
優缺點
Calico IPIP隧道容器網絡優點如下:
- 基于節點網絡構建的覆蓋(overlay)容器網絡,通用性強,不占用VPC資源;
- 支持網絡策略NetworkPolicy和帶寬限制;
- 結合BGP Route Reflector,支持大規模組網。
缺點如下:
- IPIP隧道解封包存在性能損耗;
- Pod不能與VPC內集群外資源互通;
- LoadBlance類型service無法直通Pod,需經NodePort轉發,存在性能損耗;
- 容器流量繞過安全組,不受安全組管理。
應用場景
Calico IPIP隧道容器網絡適用如下場景:
- 性能要求不高:由于引入了額外的IPIP隧道封包解包,相對于cubecni容器網絡存在大約5%-15%性能損失,適用于對性能要求不是特別高的業務場景,例如訪問量不大的管理后臺服務等;
- 大規模組網:由于構建的覆蓋(overlay)容器網絡不占用任何VPC資源,所以在容器網絡層面,集群節點數不受VPC資源限制;BGP Peer默認使用全互聯模式,為減少節點數上升對BGP連接數的指數級消耗,當節點數大于100時,可使用路由反射模式,引入中心化的路由反射節點,將BGP連接數增長降為O(N)增長,最大可支持1000節點規模。
容器IP地址段分配
訂購使用Calico容器網絡插件的集群時,由于pod網段限制了節點和pod規模,建議選擇使用一個大網段。如下所示,把172.16.0.0/12作為Pod網段:
集群創建時,云容器引擎使用該網段作為Calico的私有IP地址池,如下所示:
節點網段由kube-controller-manager分配,默認每個節點會分配到一個掩碼為24的地址段,可分配網段數直接決定集群節點規模上限,例如pod網段為172.16.0.0/18,則支持添加256個節點。若不考慮其它資源限制,單個節點理論上最多可創建256個Pod。
可以通過以下方式查看節點分配的pod網段:
[root@CCSEAGENT-vmAggbkVfL paasdp]# kubectl get no ccseagent-vmAggbkVfL -ojsonpath='{.spec.podCIDR}'
172.16.13.0/24
網段規劃建議
集群網絡網段分為節點網絡、容器網絡和服務網絡,在規劃這三種網絡的網段時需考慮如下要點:
- 為避免地址沖突,三個網絡的網段不能重疊,容器網段和服務網段不能與VPC網段重疊;
- 結合集群規模選擇合適的網段,節點所屬子網的空閑IP數直接限制了集群可添加節點數,容器網段大小直接限制了可創建的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:
[root@CCSEAGENT-vmAggbkVfL paasdp]# kubectl get po -l app=nginx-demo -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-demo-58656854f4-7nvmn 1/1 Running 0 48s 172.16.13.22 ccseagent-vmAggbkVfL <none> <none>
nginx-demo-58656854f4-j88mx 1/1 Running 0 48s 172.16.19.17 ccseagent-vmBubacp2 <none> <none>
在集群內部節點或Pod內,都能直接訪問Pod。如下所示,節點直接訪問Pod:
如下所示,Pod直接訪問Pod:
因為Calico容器網絡不支持集群外部網絡與容器IP直通,所以在同個VPC下集群外云主機直接訪問Pod的IP,會發現訪問不通。