Calico 维护的网络在默认是(Node-to-Node Mesh)全互联模式,Calico集群中的节点之间都会相互建立连接,用于路由交换。但是随着集群规模的扩大,mesh模式将形成一个巨大服务网格,连接数成倍增加。
这时就需要使用 Route Reflector(路由器反射)模式解决这个问题。
确定一个或多个Calico节点充当路由反射器,集中分发路由,让其他节点从这个RR节点获取路由信息。
具体步骤如下:
1、关闭node-to-node BGP网络
添加 default BGP配置,调整 nodeToNodeMeshEnabled和asNumber: ``` cat << EOF | calicoctl create -f - apiVersion: projectcalico.org/v3 kind: BGPConfiguration metadata: name: default spec: logSeverityScreen: Info nodeToNodeMeshEnabled: false asNumber: 63400 EOF ``` ASN号可以通过获取 # calicoctl get nodes --output=wide
2、配置指定节点充当路由反射器
为方便让BGPPeer轻松选择节点,通过标签选择器匹配。 给路由器反射器节点打标签: ``` kubectl label node k8s-node2 route-reflector=true ``` 然后配置路由器反射器节点routeReflectorClusterID: ``` # calicoctl get node k8s-node1 -o yaml > rr-node.yaml # vi rr-node.yaml apiVersion: projectcalico.org/v3 kind: Node metadata: annotations: projectcalico.org/kube-labels: '{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"k8s-node2","kubernetes.io/os":"linux"}' creationTimestamp: null labels: beta.kubernetes.io/arch: amd64 beta.kubernetes.io/os: linux kubernetes.io/arch: amd64 kubernetes.io/hostname: k8s-node2 kubernetes.io/os: linux name: k8s-node2 spec: bgp: ipv4Address: 192.168.1.10/24 routeReflectorClusterID: 244.0.0.1 # 集群ID orchRefs: - nodeName: k8s-node2 orchestrator: k8s ``` 现在,很容易使用标签选择器将路由反射器节点与其他非路由反射器节点配置为对等: ``` # vi bgppeer.yaml apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: peer-with-route-reflectors spec: nodeSelector: all() peerSelector: route-reflector == 'true' ```
3、拷贝配置到另一个高可用节点执行相同操作
到此基本就实现了双机负载BGP路由分发
4、查看bgp的连接状态
calicoctl node status
RR路由反射器: 相比M-T-M 全互联模式,主要为了减少BGP路由同步开销,实现集中路由分发
