0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何配置Cilium和BGP协同工作呢?

dyquk4xk2p3d 来源:Yoaz 的博客 2023-08-15 09:15 次阅读

载自:「Yoaz 的博客」

原文:https://url.hi-linux.com/12Rw2

背景

官方提供了多篇文档说明如何配置 Cilium 和 BGP 协同工作,本文主要对以下部分功能进行验证:

Using BIRD to run BGP[1]

Using kube-router to run BGP[2]

BGP[3]

Cilium BGP Control Plane[4]

为了模拟支持 BGP 的网络环境,文中所有节点均是通过 vagrant 创建的 VM, 网络拓扑如下图。

注意:实际配置时使用 vagrant 创建的 VM 模拟网络环境并不便利。可以参考以下文章,使用 ContainerLab 和 Kind 进行验证。

7528308e-3afb-11ee-9e74-dac502259ad0.png

上图中,Router 节点包含多张网卡并将作为其他两台主机的网关,对应的系统配置如下:

net.ipv4.ip_forward=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.forwarding=1

node1、node2 节点均只包含一张网卡,其默认路由均指向 router 节点(node1 指向 10.0.1.2,node2 指向 10.0.2.2)。

node1、node2 上将部署 Kubernetes 和 Cilium。

基于 Bird 部署容器网络

Cilium 为 PodCIDR 提供了 Encapsulation 和 Native-Routing 两种组网方式。

Native-Routing 方案中,Cilium 会将 PodCIDR 中的跨节点流量委托给 Linux 内核的路由子系统,此时 Linux 内核需要知道如何路由 PodCIDR 中的特定地址。

当用户的所有 Node 处于同一个 L2 网络时,我们可以设置参数 autoDirectNodeRoutes=true ,此时整个 PodCIDR 路由信息被插入到每个节点的内核路由表中,用户无需其他额外工作即部署完成。

上述测试环境中,Node1 和 Node2 分别处于 10.0.1.0/24 和 10.0.2.0/24 ,并不满足设置 autoDirectNodeRoutes 的条件,因此我们需要借助设置 BGP 服务完成 PodCIDR 组网。

参考Using BIRD to run BGP[5]文档中的描述,并结合测试环境的网络拓扑,我们设定测试节点的 ASN 如下图:

754fd724-3afb-11ee-9e74-dac502259ad0.png

1. FRR 设置

在 router 上部署软件路由器 FRR , 如下:

FRRVER="frr-stable"
curl-Ohttps://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el7.noarch.rpm
sudoyuminstall./$FRRVER*
sudoyuminstallfrrfrr-pythontools

修改 /etc/frr/daemons 文件,打开 bgpd 功能(设置配置文件中 bgpd=yes)。编辑 /etc/frr/frr.conf 文件,写入以下 BGP 相关的配置:

frrversion8.4.1
frrdefaultstraditional
hostnamerouter#主机名
logsysloginformational
!
routerbgp65100#router节点的本地ASN
bgprouter-id192.168.121.16#router-id
nobgpebgp-requires-policy
neighbor10.0.1.10remote-as65010#配置Node1作为router的邻居,ASN为65010
neighbor10.0.2.10remote-as65020#配置Node2作为router的邻居,ASN为65020
exit
!

完成上述配置后,启动 frr 服务systemctl restart frr!

2. 部署 Cilium

登录 Node1 或 Node2 部署 Cilium,配置如下:

k8sServiceHost:"10.0.1.10"
k8sServicePort:6443
kubeProxyReplacement:strict
devices:eth1
ipam:
operator:
clusterPoolIPv4PodCIDR:"172.31.254.0/23"
clusterPoolIPv4PodCIDRList:[]
clusterPoolIPv4MaskSize:26
loadBalancer:
mode:dsr
tunnel:disabled
autoDirectNodeRoutes:false
bpf:
masquerade:true
ipv4NativeRoutingCIDR:"172.31.254.0/23"
socketLB:
enabled:true
nodePort:
enabled:true
externalIPs:
enabled:true
hostPort:
enabled:true

Cilium 容器就绪后,Kubernetes 集群中可以正常创建容器并分配容器IP,但是跨节点容器无法正常通信

3. 部署 Bird

Cilium 官方文档中,给出了 Bird2 的配置示例。我们可以直接通过yum -y install bird2安装。

查看各个节点分配的 PodCIDR 网段,执行kubectl -n kube-system exec -it ds/cilium -- cilium node list:

75767528-3afb-11ee-9e74-dac502259ad0.png

参考以下配置 bird2 服务,配置文件 /etc/bird.conf

routerid10.0.1.10;
protocoldevice{
scantime10;#Scaninterfacesevery10seconds
}
#Disableautomaticallygeneratingdirectroutestoallnetworkinterfaces.
protocoldirect{
disabled;#Disablebydefault
}
#ForbidsynchronizingBIRDroutingtableswiththeOSkernel.
protocolkernel{
ipv4{#ConnectprotocoltoIPv4tablebychannel
importnone;#Importtotable,defaultisimportall
exportnone;#Exporttoprotocol.defaultisexportnone
};
}
#StaticIPv4routes.
protocolstatic{
ipv4;
route172.31.254.0/26via"cilium_host";#将 PodCICR 通告到上游,PS:这里是 Node1 分配到的 PodCIDR
}
#BGPpeers
protocolbgpuplink0{
description"BGPuplink0";
local10.0.1.10as65010;#设置当前节点的 ASN ,PS:这里示例的是 Node1
neighbor10.0.1.2as65100;#设置节点的Neighbor,这里是router节点
ipv4{
importfilter{reject;};
exportfilter{accept;};
};
}

在 Node1、Node2 按照上述方式配置完成 Bird2 后启动服务。执行以下命令检查 BGP 连接是否正常:

#在router执行以下命令

#查看bgppeer连接
vtysh-c"showbgpsummary"
#查看注册到router的路由信息
vtysh-c"showbgpipv4all"

完成上述流程后,使得 Node1 和 Node2 上的容器网络打通,并且任意以 router 节点作为默认网关的服务器都可以直连 PodIP。

查看 router 接地的路由信息如下:

758e3b5e-3afb-11ee-9e74-dac502259ad0.png

上图中,我们发现 router 节点被注入了 PodCIDR 。

本文测试环境的网络拓扑非常简单,实际上直接通过命令行直接在 router 节点上插入路由信息可以达到同样效果。在实际生产中,我们可以通过 BGP 动态发现简化配置流程。

内置 BGP

Cilium 1.10 之后的版本内置了 BGP Speaker 的功能,用户无需在节点上部署 Bird2 也可以向外广播节点的 PodCIDR 信息,并且 1.12 版本中 Cilium 参考 Metallb 实现支持基于 BGP + ECMP 的 LoadBalancer 功能。

参考文档[6]中的描述,启用内置的 BGP 能力需要额外创建以下 ConfigMap,Cilium-Agent 和 Cilium-Operator 启动时均会挂载该配置。

apiVersion:v1
kind:ConfigMap
metadata:
name:bgp-config
namespace:kube-system
data:
config.yaml:|
peers:
-peer-address:192.168.121.16
peer-asn:65100
my-asn:65000
address-pools:
-name:default
protocol:bgp
addresses:
-192.0.2.0/24

上述配置中,Cilium 将使用 192.168.121.16 连接 router 节点的 bgpd 服务(PS:BGP 建立连接是基于 TCP 的),并且 Node1 和 Node2 将使用相同的 ASN 65000。

address-pools 指定的是 LoadBalanacer 的 IP 地址池,当用户创建 LoadBalancer 类型的 Service 时,Cilium 将自动从该地址池中分配 ip 地址,并自动进行 BGP 宣告。

安装上述 Configmap 后,我们需要为 Cilium 为添加如下配置:

bgp:
enabled:true
announce:
loadbalancerIP:true
podCIDR:true
loadBalancer:
mode:snat#此处使用dsr模式时,存在问题

创建 service 如下:

apiVersion:v1
kind:Service
metadata:
name:whoami-lb
spec:
type:LoadBalancer
ports:
-port:80
targetPort:80
protocol:TCP
name:http
selector:
app:whoami

cilium 自动分配 192.0.2.0 作为 service 的 EXTERNAL-IP:

75ccd990-3afb-11ee-9e74-dac502259ad0.png

我们登录 router 节点通过 vtysh 查看 Cilium 是否 bgpd 服务建立了连接,并且查看其通告的路由信息如下:

75f1d376-3afb-11ee-9e74-dac502259ad0.png

需要注意,router 节点上我们需要添加 ECMP 的相关配置,并且依然静态指定 Node1 和 Node2 作为 neighbor 如下:

frrversion8.4.1
frrdefaultstraditional
hostnamerouter
logsysloginformational
!
routerbgp65100
bgpbestpathas-pathmultipath-relax
bgpbestpathbandwidthskip-missing
bgprouter-id192.168.121.16
nobgpebgp-requires-policy
neighbor10.0.1.10remote-as65000
neighbor10.0.2.10remote-as65000
exit
!

执行vtysh -c "show bgp ipv4 unicast 192.0.2.0/32"我们可以查看当前,FRR 执行 ECMP 时的路径选择:

76172266-3afb-11ee-9e74-dac502259ad0.png

Cilium BGP Control Plane

BGP Controller 控制器是 Cilium 高版本推出的针对内置 BGP Speaker 更加细粒度的控制功能,其功能是上述 ConfigMap 的扩展。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171192
  • 路由器
    +关注

    关注

    22

    文章

    3500

    浏览量

    111343
  • BGP
    BGP
    +关注

    关注

    0

    文章

    80

    浏览量

    15221
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
  • TCP通信
    +关注

    关注

    0

    文章

    144

    浏览量

    4138

原文标题:如何快速让 Cilium 和 BGP 协同工作

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    bgp配置实例讲解 如何配置CiliumBGP协同工作

      背景 官方提供了多篇文档说明如何配置 CiliumBGP 协同工作,本文主要对以下部分功能进行验证: Using BIRD to run
    的头像 发表于 08-15 09:15 1267次阅读
    <b class='flag-5'>bgp</b><b class='flag-5'>配置</b>实例讲解 如何<b class='flag-5'>配置</b><b class='flag-5'>Cilium</b>和<b class='flag-5'>BGP</b><b class='flag-5'>协同工作</b>

    快速实现ARM和DSP的通信和协同工作

    快速实现ARM和DSP的通信和协同工作
    发表于 08-17 14:08

    双核处理器ARM_DSP如何实现协同工作

    双核处理器ARM_DSP如何实现协同工作
    发表于 08-17 14:26

    labview控制两个仪器协同工作

    ,然后示波器采集,然后问示波器采集完了吗,然后在运动。请问这样的程序怎么写?我处理不好他们的协同工作,所以上网了希望得到大家的帮助。谢谢大家!
    发表于 05-04 18:25

    MSP430 可以与多大频率的晶振协同工作

    除了 32.768kHz的晶振频率,MSP430 还可以与多大频率的晶振协同工作
    发表于 12-29 17:06

    两片单片机协同工作

    问一下通常的应用中都有什么方式使两片或多片430协同工作
    发表于 01-19 19:27

    【锆石A4 FPGA申请】多芯片协同工作的管理

    申请理由:项目描述:项目越做越大,使用一片芯片已无法胜任,那么多芯片的方案就必不可少了。例如ARM进行人机交互与通讯,DSP进行计算,51进行底层硬件控制等等,那么多个芯片的协同工作就要有一个管理
    发表于 08-29 15:38

    SG3525的3脚和4脚是怎么协同工作的????

    SG3525的3脚和4脚是怎么协同工作的????
    发表于 01-16 18:28

    处理器在读内存的过程中,CPU核、cache、MMU如何协同工作

    处理器中断处理的过程是怎样的?处理器在读内存的过程中,CPU核、cache、MMU如何协同工作
    发表于 10-18 08:57

    基于CSCW和多Agent的电网调度协同工作模型

    分析电网调度运行管理系统的工作特点,根据系统内不同任务分工协作的要求,利用多Agent 技术将系统划分成不同功能的模块。提出了基于多Agent 的CSCW 环境下的一种电网调度协同工作
    发表于 05-28 10:57 0次下载
    基于CSCW和多Agent的电网调度<b class='flag-5'>协同工作</b>模型

    如何使用自动BGP在数据中心构建最佳 ASN 配置

    不需要对标准 BGP 行为或配置进行修改就可以完成工作。这样就不必考虑为交换机分配 ASN 编号的事情,有助于在数据中心建立最佳 ASN 配置,并避免在分配错误的脊网络 ASN 时进
    的头像 发表于 07-28 18:10 1980次阅读

    三个传感器协同工作的智能狗碗

    电子发烧友网站提供《三个传感器协同工作的智能狗碗.zip》资料免费下载
    发表于 11-17 10:28 0次下载
    三个传感器<b class='flag-5'>协同工作</b>的智能狗碗

    Macros如何协同工作

    并使用包含文件。包含文件定义宏并且可以包含其他包含文件。 这些代码元素如何协同工作 可以混合使用 ObjectScript 、 Python 、 SQL 、类定义、宏、例程等的原因是
    的头像 发表于 09-20 14:06 262次阅读

    华为路由器BGP基础配置实验记录

    配置BGP的前提是要保证各个自治区域的路由均可达,所以要首先在AS 2 配置OSPF使AS 2 通畅,然后再配置BGP。由于
    发表于 01-06 10:07 186次阅读
    华为路由器<b class='flag-5'>BGP</b>基础<b class='flag-5'>配置</b>实验记录

    三电系统是如何协同工作的?

    三电系统是如何协同工作的? 三电系统是指由汽车动力电池、动力电机和动力电控系统组成的新能源汽车动力系统。它在汽车工业领域内得到了广泛的应用,成为推动汽车行业向新能源方向发展的关键技术之一。三电系统
    的头像 发表于 01-18 16:37 252次阅读