RR介绍
在 Calico 网络中,默认使用 Node-to-Node Mesh 全互联模式,即集群中的每个节点之间都会相互建立 BGP 连接,用于路由交换。然而,随着集群规模的扩大,全互联模式会导致连接数成倍增加,产生性能问题。为了解决这个问题,可以使用路由反射器(Route Reflector,简称 RR)模式。
在 RR 模式下,选择一个或多个 Calico 节点充当路由反射器,集中分发路由信息。其他节点作为 RR 的客户端,从 RR 节点获取路由信息,而不需要与所有其他节点建立 BGP 连接。
下面为使用RR和不使用RR的架构图
在不使用RR模式下,每个节点都需要与其他所有节点建立BGP连接。随着节点数量的增加,连接数呈指数级增长,导致性能下降和配置复杂性增加。
在使用RR模式下,选择一个或多个节点作为路由反射器。其他节点作为RR的客户端,只需要与RR节点建立BGP连接,从RR节点获取路由信息。这样可以显著减少连接数,提高网络性能和可扩展性。
RR配置方式
1. 关闭 Node-to-Node Mesh 模式
- 查看当前的 ASNumber(自治系统号):
calicoctl get node -o wide
- 创建或修改 BGP 配置文件(如 node-to-node.yaml),调整 nodeToNodeMeshEnabled 和 asNumber 参数
vim node-to-node.yaml
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: false #配置为false
asNumber: 64512
- 应用配置文件
calicoctl apply -f node-to-node.yaml
2. 配置指定节点作为路由反射器节点
- 选择一个或多个节点作为路由反射器,为其添加标签(如 route-reflector=true):
kubectl label node k8s-node2 route-reflector=true
- 获取node节点配置
calicoctl get node k8s-node2 -o yaml > rr-node.yaml
- 配置路由器反射节点routeReflectorClusterID
vim rr-node.yaml
apiVersion: projectcalico.org/v3
kind: Node
metadata:
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.181.26/24
routeReflectorClusterID: 233.0.0.1 #集群id随便取一个,是唯一IP地址即可
- 应用配置文件
calicoctl apply -f rr-node.yaml
3. 创建路由反射器配置
- 将路由反射器节点与其他非 RR 节点配置为对等
vim bgppeer.yaml
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector='true' #上面给node打的标签
- 应用配置文件
calicoctl apply -f bgppeer.yaml
- 查看节点的BGP连接状态
此命令需要在每个节点本地执行,查看的是本地节点的信息
calicoctl node status
RR节点
非RR节点
RR模式优缺点
优点
- 减少了 BGP 连接数,提高了大规模集群的性能和可扩展性。
- 简化了路由管理,非 RR 节点只需与 RR 节点交换路由信息。
缺点
- 引入了单点故障,如果 RR 节点出现问题,可能影响整个集群的路由。可以通过配置多个 RR 节点来提高可用性。
- 增加了网络配置的复杂性,需要仔细规划 RR 节点的部署和配置。