目录
1. 概述
Calico 路由反射模式是一种 BGP 互联方案,用于解决大规模网络中路由信息的分发和同步问题。在 Calico 的路由反射模式中,路由反射器(Route Reflectors)被用来集中管理路由信息,以减少网络中的路由信息数量和减小路由信息的分发规模。
在 Calico 的路由反射模式中,路由反射器会收集来自其他节点的路由信息,并将其保存在本地。然后,这些路由信息会被分发给其他节点,以便它们能够学习到所有可达的路由。由于路由反射器集中管理路由信息,因此可以大大减少网络中的路由信息数量和分发规模,从而提高网络的性能和可扩展性。
在 Calico 的路由反射模式中,如果某个节点需要发送数据到一个目标节点,但是它无法直接到达目标节点(例如,目标节点处于不同的机架或不同的网络中),那么它会将数据发送给一个路由反射器。然后,路由反射器会将数据转发给适当的节点,以确保数据能够到达目标节点
1.1 安装 calicoctl工具
Calico RR 所有配置操作都需要通过 calicoctl 工具来完成, calicoctl 允许从命令创建,读取,更新和删除 Calico 对象,所以我们首先需要在 Kubernetes 所有的工作节点上安装 calicoctl 工具。
采用二进制方式安装 calicoctl 工具。
版本号选择自己 calico 的版本。
# https://github.com/projectcalico/calicoctl/releases/
kubectl get deployment -n kube-system calico-kube-controllers -o yaml | grep image #查看calico版本
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.17.2/calicoctl
mv calicoctl-linux-amd64 /usr/local/bin/calicoctl
chmod +x /usr/local/bin/calicoctl
export CALICO_DATASTORE_TYPE=kubernetes
export CALICO_KUBECONFIG=~/.kube/config
如果不希望每次执行 calicoctl 之前都需要设置环境变量,可以将环境变量信息写到永久写入到 /etc/calico/calicoctl.cfg 文件:
mkdir -vp /etc/calico/
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
datastoreType: "kubernetes"
kubeconfig: "/root/.kube/config"
1.2 使用 calicoctl 工具
1.1.1 查看所有的BGP节点,若携带右侧参数则能输出AS号,一个编号就是一个自治系统
calicoctl get nodes --output=wide
NAME
name-02
name-03
1.1.2 查看所有的BGP节点状态
[root@calico ~]# calicoctl node status
calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+-------------------+-------+----------+-------------+
| 10.10.10.3 | node-to-node mesh | up | 10:02:32 | Established |
| 10.10.10.4 | node-to-node mesh | up | 10:03:44 | Established |
| 10.10.10.5 | node-to-node mesh | up | 10:03:45 | Established |
+--------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
1.1.3 修改Calico中BGP默认的AS号
除非指定每个节点的AS,否则所有Calico节点都默认使用编号为 64512 的自治系统
# 更改默认的全局AS编号
# 可通过修改默认的 BGPConfiguration 资源来更改所有节点的全局默认值,以下命令将全局默认AS编号设为 64513
# 注意: 若默认BGP配置资源不存在则需首先创建: https://docs.projectcalico.org/reference/resources/bgpconfig
calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": "64513"}}'
#更改特定节点的AS编号
# 可以修改节点对象从而为特定节点配置AS,例如将名为 node-1 的节点更改为AS属于64514
calicoctl patch node node-1 -p '{"spec": {"bgp": {"asNumber": "64514"}}}'
1.1.4 其他相关信息查询命令
# 查看 BGP Peer
calicoctl get bgppeer
# 查看IP池相关信息
calicoctl get ipPool -o yaml [-o wide]
# 收集节点诊断
calicoctl node diags
# 将节点配置为群集 ID 为 244.0.0.1 的路由反射器
calicoctl patch node my-node -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'
2.calico Route Reflector 方案配置
calico默认IPIP网络模式
修改calico的网络模式IPIP变为BGP
2.1 Route reflector 角色介绍
早期 calico 版本提供专门的 route reflector 镜像,在新版本 calico node 内置集成 route reflector 功能。Route reflector 可以是以下角色:
集群内部的 node 节点
集群外部节点运行 calico node
其他支持 route reflector 的软件或者设备
2.2 关闭 node-to-node mesh
必须先禁用默认的节点到节点的 BGP Mesh 才能启用其他BGP拓扑 (禁用全网状)
cat <<EOF | calicoctl apply -f -
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info # 全局日志级别
nodeToNodeMeshEnabled: false #不启用节点到节点 BGP 网格
asNumber: 63400 #调整as的编号
EOF
如果有自己的bgpconfiguration配置,可以不用创建,直接修改:
calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'
2.3 设置 Route reflector
配置 Route reflector 支持多种配置方式如:1、支持配置全局 BGP peer 。2、支持针对单个节点进行配置 BGP Peer。也可以将 calico 节点充当 Route reflector 这里以配置 calico 节点充当 Router reflector 为例。
配置节点充当 BGP Route Reflector
可将 Calico 节点配置为充当路由反射器。为此,要用作路由反射器的每个节点必须具有群集 ID-通常是未使用的 IPv4 地址。
要将节点配置为集群 ID 为 244.0.0.1 的路由反射器,请运行以下命令。这里将节点名为 rke-node4 的节点配置为 Route Reflector,若一个集群中要配置主备 rr,为了防止 rr 之间的路由环路,需要将集群 ID 配置成一样*
给选定的节点指定路由反射器ID: routeReflectorClusterID这个可以写任意集群当中
运行以下命令将节点配置为集群ID为 244.0.0.1 的路由反射器:
calicoctl patch node node2 -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'
版本老的calicoctl可能没有这个 patch 命令,也可使用yaml写入:
[root@k8s-master ~]# calicoctl get node k8s-node2 -o yaml > rr.yaml
[root@k8s-master ~]# vim rr.yaml
bgp:
ipv4Address: 192.168.200.10/24
routeReflectorClusterID: 244.0.0.1
[root@k8s-master ~]# calicoctl apply -f rr.yaml
Successfully applied 1 'Node' resource(s)
给节点打上对应的 label 标记该节点以表明它是 Route Reflector,从而允许 BGPPeer 资源选择它。 方便让BGPPeer轻松选择节点,通过标签选择器匹配。
kubectl label node rke-node4 route-reflector=true
创建 BGPPeer
1)创建全局BGP对等体
全局BGP对等体适用于群集中的所有节点 (若生产的网络拓扑包括与部署中的每个Calico节点与其建立对等的关系时相当有用)
下例创建了全局的BGP对等体
该对等体将集群中的每个节点配置为与AS号为 63400的BGP路由与 192.20.30.40 进行对等
kubectl apply -f - <<'EOF'
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: my-global-peer
spec:
peerIP: 192.20.30.40 # ...
asNumber: 63400 # AS Number ...
EOF
2)使用标签选择器将路由反射器节点与其他非路由反射器节点配置为对等
匹配所有节点带有这个标签的作为路由反射器,这就是非路由反射器和路由反射器建立关系
cat <<EOF | calicoctl apply -f -
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector == 'true'
EOF
2.4 查看 BGP 节点状态
Route Reflector 节点查看,节点已正常建立连接
calicoctl node status
ss -antp | grep ESTAB | grep bird
非路由选择器节点 上查看,已与路由选择器节点建立连接。
peer type 由 node-to-node mesh 变为 node specific,
3、根据节点标签定义对应的 ippool
Calico 能够进行配置,为不同拓扑指定 IP 地址池。例如可能希望某些机架、地区、或者区域能够从同一个 IP 池中获取地址。这对于降低路由数量或者配合防火墙策略的要求会很有帮助。
给节点配置对应 label
kubectl label nodes kube-node-1 rack=1
通过标签定义对应的节点 IPpool
calicoctl create -f -<<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-1
spec:
cidr: 10.243.19.0/24
ipipMode: Never
natOutgoing: true
nodeSelector: rack == "1"
EOF
固定 POD IP
固定pod ip可参考
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
annotations:
# "cni.projectcalico.org/ipAddrs": "[\"10.243.19.10\"]" #表示固定单个pod ip
"cni.projectcalico.org/ipv4pools": "[\"ippool-1\"]"
spec:
containers:
- name: nginx
image: nginx
4、测试网络
kubectl get pods -o wide
然后在pod所在节点抓包分析,可以看到,没有经过tun0封装和解封装,而是直接到达宿主机。至此calico RR方案配置完成。