干货收藏!Calico的BGP RouteReflector策略实践(bgp cost)

干货收藏!Calico的BGP RouteReflector策略实践一 背景
容器网络组件Calico支持多种后端模式,有Overlay的IPIP、Vxlan模式,也有Underlay纯路由的BGP模式。

一 背景

容器网络组件Calico支持多种后端模式,包括overlay中的IPIP和Vxlan模式,以及underlay中的纯路由BGP模式。

与Overlay网络模型相比,Underlay网络具有更高的数据平面转发性能。同时纯路由模式也有两种解决方案: Calico BGP 的全网状解决方案有一些限制:拥有的集群节点越多,拥有的BGP 连接就越多。另外,保护网络需要建立大量的连接,并且每次添加节点时,连接数必须加倍才能保证网络的互操作性,创建大量的连接会产生网络消耗。因此,目前可以使用路由反射器模式,也称为RR模式。在RR模式下,一个或多个BGP发言者被指定为RouterReflectors并与网络中的其他发言者建立连接。每个Speaker只要与Router Reflector建立了BGP,就可以获得整个网络的路由信息。

二 Calico BGP RouteReflector模式组网架构

在不改变IDC机房内部网络拓扑的情况下,接入层交换机和核心层交换机利用机房现有的路由策略建立BGP连接,并根据物理位置分配Pod CIDR。每个节点分配一个Pod CIDR,节点通过BGP协议将该Pod CIDR告知接入层交换机,实现全网通信功能。下图基于Leaf-Spine架构并对其进行了详细解释。

网络原理:

每台接入层交换机与其管理的二层节点进行通信,共同构成AS。 BGP 服务运行在每个节点上,并通告该节点的路由信息。核心层交换机和接入层交换机之间的每台路由器占用独立的AS,物理上直连,运行BGP协议。核心层交换机可以检测整个网络的路由信息,接入层交换机可以检测直连节点的路由信息。同一主机上的Pod 通过主机路由器相互通信。 (将Linux 主机视为路由器)同一机架上不同节点上的pod 之间的通信通过TOR(叶子)交换机。不同机架上的Pod 之间的通信通过核心交换机。

三 模拟生产场景组网搭建环境

准备一台Ubuntu2204操作系统的机器(8U16G就够了)。虚拟机上必须安装以下软件工具:

Dockergo开发环境Kind(kubernetes,kubernetes兴趣小组开发的Docker软件。可以用来快速搭建k8s测试环境。安装Kind需要先在主机上安装go。Kind的安装版本可以选择v0)。您安装的是v0.42.0 版本)。

3.1 kubernetes 环境搭建

Kubernetes集群版本为: 1.27.3。

集群规模为1个主节点和3个工作节点。

集群构建脚本如下。1-setup-env.sh

#!/bin/bash

日期

设置-v

# 1.准备noCNI环境

cat EOF | 类型创建集群–name=calico-bgp-rr –image=kindest/node:v1.27.3 –config=-

kind:集群

apiVersion: kind.x-k8s.io/v1alpha4

网络:

禁用默认CNI: true

podSubnet:\’10.244.0.0/16\’

节点:

– role: 控制平面

kubeadmConfigPatches:

– |

kind: 初始化配置

节点注册:

kubeletExtraArgs:

节点IP: 10.1.5.10

节点标签: \’机架=机架0\’

– 角色: 工人

kubeadmConfigPatches:

– |

kind:键配置

节点注册:

kubeletExtraArgs:

节点ip: 10.1.5.11

节点标签: \’机架=机架0\’

– 角色: 工人

kubeadmConfigPatches:

– |

kind:键配置

节点注册:

kubeletExtraArgs:

节点IP: 10.1.8.10

节点标签: \’机架=机架1\’

– 角色: 工人

kubeadmConfigPatches:

– |

kind:键配置

节点注册:

kubeletExtraArgs:

节点IP: 10.1.8.11

节点标签: \’机架=机架1\’

结束后

#2.清除污垢

kubectl 污点节点$(kubectl get 名称-o 名称| grep 控制平面)node-role.kubernetes.io/control-plane:NoSchedule-

kubectl 获取节点-o Wide

# 3.安装工具

for i in $(docker ps -a –format \’table {{.Names}}\’ |grep calico-bgp-rr)

回声$i

docker cp /usr/bin/ping $i:/usr/bin/ping

docker cp /usr/local/bin/calicoctl $i:/usr/local/bin/

# docker exec -it $i bash -c \’apt-get -y update /dev/null apt-get -y install net-tools tcpdump lrzsz /dev/null 21\’

结尾

运行该脚本创建集群时,由于未安装cni组件,集群中部分pod处于pending状态,集群节点也处于NotReady状态。这个是正常的。稍后可以通过安装calico cni组件来解决。

3.2 创建网桥

在主机上创建网桥的主要目的是连接type中创建的K8s节点和containerlab中内置的交换机之间的网络。

brctl addbr br-leaf0;ifconfig br-leaf0 up;brctl addbr br-leaf1;ifconfig br-leaf1 up

3.3 借助containerLab搭建三层交换机并配置BGP规则

ContainerLab 构建切换脚本是:2-setup-clab.sh

#!/bin/bash

设置-v

cat EOFclab.yaml | clab 部署-t clab.yaml –

name: calico-bgp-rr

拓扑:

节点:

脊柱0:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9

cmd: /sbin/init

绑定:

– /lib/modules:/lib/modules

– ./startup-conf/spine0-boot.cfg:/opt/vyatta/etc/config/config.boot

脊柱1:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9

cmd: /sbin/init

绑定:

– /lib/modules:/lib/modules

– ./startup-conf/spine1-boot.cfg:/opt/vyatta/etc/config/config.boot

叶0:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9

cmd: /sbin/init

绑定:

– /lib/modules:/lib/modules

– ./startup-conf/leaf0-boot.cfg:/opt/vyatta/etc/config/config.boot

叶1:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9

cmd: /sbin/init

绑定:

– /lib/modules:/lib/modules

– ./startup-conf/leaf1-boot.cfg:/opt/vyatta/etc/config/config.boot

br-叶0:

kind:桥

br-叶1:

kind:桥

服务器1:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool

网络模式: 容器: calico-bgp-rr – 控制平面

执行:

-ip地址添加10.1.5.10/24 dev net0

-ip 路由通过10.1.5.1 替换默认值

服务器2:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool

网络模式: 容器:calico-bgp-rr-worker

执行:

-ip地址添加10.1.5.11/24 dev net0

-ip 路由通过10.1.5.1 替换默认值

服务器3:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool

网络模式: 容器:calico-bgp-rr-worker2

执行:

-ip地址添加10.1.8.10/24 dev net0

-ip 路由通过10.1.8.1 替换默认值

服务器4:

kind: Linux

image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool

网络模式: 容器:calico-bgp-rr-worker3

执行:

-ip地址添加10.1.8.11/24 dev net0

-ip 路由通过10.1.8.1 替换默认值

链接:

– 端点: [\’br-leaf0:br-leaf0-net0\’, \’server1:net0\’]

– 端点: [\’br-leaf0:br-leaf0-net1\’, \’server2:net0\’]

– 端点: [\’br-leaf1:br-leaf1-net0\’, \’server3:net0\’]

– 端点: [\’br-leaf1:br-leaf1-net1\’, \’server4:net0\’]

– 端点: [\’leaf0:eth1\’, \’spine0:eth1\’]

– 端点: [\’leaf0:eth2\’, \’spine1:eth1\’]

– 端点: [\’leaf0:eth3\’, \’br-leaf0:br-leaf0-net2\’]

– 端点: [\’leaf1:eth1\’, \’spine0:eth2\’]

– 端点: [\’leaf1:eth2\’, \’spine1:eth2\’]

– 端点: [\’leaf1:eth3\’, \’br-leaf1:br-leaf1-net2\’]

结束后

可以看到Containerlab网络已经成功建立。有关在交换机上为VYO 配置BGP 路由协议的信息,请参阅文档末尾。

3.4 Calico cni插件部署安装

Calico默认安装为ipip模式,因此需要手动关闭不带ipip/vxlan封装的Bgp模式。

kubectl apply -f calico.yaml

#kubectl apply -f https://projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml

一旦安装了Calico 组件,节点之间建立的BGP 连接就采用全网状形式。

3.5 Calico BGP RR模式开启

全网状全连接模式不适合大型集群。必须关闭BGP 全网状模式才能使用BGP 路由反射器。

方法如下:3-disable-bgp-full-mesh.sh

#!/bin/bash

设置-v

#1. 禁用bgp 全网状

猫EOF | calicoctl 应用-f –

apiVersion: 项目calico.org/v3

商品:

– apiVersion: 项目calico.org/v3

kind: BGP 配置

元数据:

名称: 默认

规格:

logSeverityScreen: 信息

NodeToNodeMeshEnabled: 假

kind: BGP配置列表

元数据:

结束后

3.6 Calico node 配置BGP RR规则

Kubernetes集群中的节点作为BGP路由反射器的客户端,必须配置BGP路由反射器和对等体信息,以实现路由同步的能力。

#!/bin/bash

设置-v

# 1.3. 节点add() bgp配置

猫EOF | 应用-f –

apiVersion: 项目calico.org/v3

kind:节点

元数据:

注释:

标签:

机架: 机架0

name: calico-bgp-rr-控制平面

规格:

地址:

– 地址: 10.1.5.10

type: 内部IP

bgp:

asNumber: 65005

IPv4地址: 10.1.5.10/24

orchRefs:

– 节点名称: calico-bgp-rr-控制平面

协调器: k8s

结束后

猫EOF | calicoctl 应用-f –

apiVersion: 项目calico.org/v3

kind:节点

元数据:

标签:

机架: 机架0

name: calico-bgp-rr-worker

规格:

地址:

– 地址: 10.1.5.11

type: 内部IP

bgp:

asNumber: 65005

IPv4地址: 10.1.5.11/24

orchRefs:

– 节点名称: calico-bgp-rr-worker

协调器: k8s

结束后

猫EOF | 应用-f –

apiVersion: 项目calico.org/v3

kind:节点

元数据:

标签:

机架: 机架1

name: calico-bgp-rr-worker2

规格:

地址:

– 地址: 10.1.8.10

type: 内部IP

bgp:

编号: 65008

IPv4地址: 10.1.8.10/24

orchRefs:

– 节点名称: calico-bgp-rr-worker2

协调器: k8s

结束后

猫EOF | 应用-f –

apiVersion: 项目calico.org/v3

kind:节点

元数据:

标签:

机架: 机架1

name: calico-bgp-rr-worker3

规格:

地址:

– 地址: 10.1.8.11

type: 内部IP

bgp:

编号: 65008

IPv4地址: 10.1.8.11/24

orchRefs:

– 节点名称: calico-bgp-rr-worker3

协调器: k8s

结束后

#1.4. 点对点0 切换

猫EOF | 应用-f –

apiVersion: 项目calico.org/v3

kind: BGP 对等体

元数据:

name: 从机架0 到叶0

规格:

对等IP: 10.1.5.1

asNumber: 65005

nodeSelector: 机架==\’机架0\’

结束后

#1.5. 点对点1 开关

猫EOF | 应用-f –

apiVersion: 项目calico.org/v3

kind: BGP 对等体

元数据:

name: 机架1 到叶子1

规格:

对等IP: 10.1.8.1

编号: 65008

nodeSelector: 机架==\’机架1\’

结束后

登录集群任意节点,查看BGP信息:可以看到,不再是BGP全网状的形式了。节点特定是指该节点是路由反射器的客户端,并且作为路由反射器的对等体的地址为10.1.5.1。

四 集群外访问Pod进行BGP验证测试

测试业务发展

apiVersion: 应用程序/v1

kind:恶魔套装

#kind: 部署

元数据:

标签:

应用程序:应用程序

name: 应用程序

规格:

#replica: 2

选择器:

匹配标签:

应用程序:应用程序

模板:

元数据:

标签:

应用程序:应用程序

规格:

集装箱:

– image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool

name:网络工具箱

api版本: v1

kind:服务

元数据:

name: 应用程序

规格:

type:节点端口

选择器:

应用程序:应用程序

端口:

– name:应用程序

端口: 8080

目标端口: 80

节点端口: 32000

登录集群任意节点查看路由规则

例如:10.244.210.64/26 via 10.1.5.1 dev net0 proto Bird表示通过BGP协议学习到的路由,bird是calico的BGP客户端。

登录Leaf0交换机,查看BGP信息和路由规则。

显示路由表。

可以看到k8s集群中的pod路由信息驻留在leaf 0交换机上。这意味着您可以访问集群中的Pod。

显示BGP信息:show ip bgp

:清晰可见

导航到地址为:10.1.8.0/24||10.244.192.0/26||10.244.210.64 的设备。下一跳为10.1.12.2和10.1.10.2,属于EBGP路由,包含ECMP策略。

目的地址为:10.244.81.64/26||10.244.205.64/26,下一跳为10.1.5.10||10.1.5.11,属于IBGP路由。

访问测试

集群内Pod之间相互访问

核心交换机接入集群Pod

如果您的核心交换机和公网配置了同步路由的EBGP 规则,公网流量也可以进入您的Kubernetes 集群。

5C的

ontainerlab中的vyos容器镜像模拟交换机的配置文件

spine0-boot.cfg如下:

interfaces {
ethernet eth1 {
address 10.1.10.2/24
duplex auto
speed auto
}
ethernet eth2 {
address 10.1.34.2/24
duplex auto
speed auto
}
loopback lo {
}
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.10.0/24 {
}
network 10.1.34.0/24 {
}
}
}
neighbor 10.1.10.1 {
address-family {
ipv4-unicast {
}
}
remote-as 65005
}
neighbor 10.1.34.1 {
address-family {
ipv4-unicast {
}
}
remote-as 65008
}
parameters {
bestpath {
as-path {
multipath-relax
}
}
}
system-as 500
}
}
system {
config-management {
commit-revisions 100
}
console {
device ttyS0 {
speed 9600
}
}
host-name spine0
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password \”\”
}
}
}
time-zone UTC
}
// Warning: Do not remove the following line.
// vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// Release version: 1.4-rolling-202307070317

spine1-boot.cfg

interfaces {
ethernet eth1 {
address \”10.1.12.2/24\”
duplex \”auto\”
mtu \”9000\”
offload {
gso { }
sg { }
}
speed \”auto\”
}
ethernet eth2 {
address \”10.1.11.2/24\”
duplex \”auto\”
mtu \”9000\”
offload {
gso { }
sg { }
}
speed \”auto\”
}
loopback lo { }
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.11.0/24 { }
network 10.1.12.0/24 { }
}
}
neighbor 10.1.11.1 {
address-family {
ipv4-unicast { }
}
remote-as \”65008\”
}
neighbor 10.1.12.1 {
address-family {
ipv4-unicast { }
}
remote-as \”65005\”
}
parameters {
bestpath {
as-path {
multipath-relax { }
}
}
router-id \”10.1.8.1\”
}
system-as \”800\”
}
}
system {
config-management {
commit-revisions \”100\”
}
conntrack {
modules {
ftp { }
h323 { }
nfs { }
pptp { }
sip { }
sqlnet { }
tftp { }
}
}
console {
device ttyS0 {
speed \”9600\”
}
}
host-name \”spine1\”
login {
user vyos {
authentication {
encrypted-password \”$6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/\”
plaintext-password \”\”
}
}
}
time-zone \”UTC\”
}
// Warning: Do not remove the following line.
// // vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// // Release version: 1.4-rolling-202307070317

leaf0-boot.cfg

interfaces {
ethernet eth1 {
address 10.1.10.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth2 {
address 10.1.12.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth3 {
address 10.1.5.1/24
duplex auto
mtu 9000
speed auto
}
loopback lo {
}
}
nat {
source {
rule 100 {
outbound-interface eth0
source {
address 10.1.0.0/16
}
translation {
address masquerade
}
}
}
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.5.0/24 {
}
network 10.1.10.0/24 {
}
network 10.1.12.0/24 {
}
}
}
neighbor 10.1.5.10 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65005
}
neighbor 10.1.5.11 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65005
}
neighbor 10.1.10.2 {
address-family {
ipv4-unicast {
}
}
remote-as 500
}
neighbor 10.1.12.2 {
address-family {
ipv4-unicast {
}
}
remote-as 800
}
parameters {
bestpath {
as-path {
multipath-relax
}
}
router-id 10.1.5.1
}
system-as 65005
}
}
system {
config-management {
commit-revisions 100
}
console {
device ttyS0 {
speed 9600
}
}
host-name leaf0
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password \”\”
}
}
}
time-zone UTC
}
// Warning: Do not remove the following line.
// vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// Release version: 1.4-rolling-202307070317

leaf1-boot.cfg

interfaces {
ethernet eth1 {
address 10.1.34.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth2 {
address 10.1.11.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth3 {
address 10.1.8.1/24
duplex auto
mtu 9000
speed auto
}
loopback lo {
}
}
nat {
source {
rule 100 {
outbound-interface eth0
source {
address 10.1.0.0/16
}
translation {
address masquerade
}
}
}
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.8.0/24 {
}
network 10.1.11.0/24 {
}
network 10.1.34.0/24 {
}
}
}
neighbor 10.1.8.10 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65008
}
neighbor 10.1.8.11 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65008
}
neighbor 10.1.11.2 {
address-family {
ipv4-unicast {
}
}
remote-as 800
}
neighbor 10.1.34.2 {
address-family {
ipv4-unicast {
}
}
remote-as 500
}
parameters {
bestpath {
as-path {
multipath-relax
}
}
router-id 10.1.8.1
}
system-as 65008
}
}
system {
config-management {
commit-revisions 100
}
console {
device ttyS0 {
speed 9600
}
}
host-name leaf1
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password \”\”
}
}
}
time-zone UTC
}
// Warning: Do not remove the following line.
// vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// Release version: 1.4-rolling-202307070317

#以上关于干货收藏!Calico的BGP RouteReflector策略实践的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92703.html

(0)
CSDN的头像CSDN
上一篇 2024年6月28日
下一篇 2024年6月28日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注