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路由同步開銷,實現集中路由分發