网络模型
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不能与VPCE内集群外资源互通;
- 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.ctyun.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,会发现访问不通。