Cilium 官方文档翻译(11) BGP-结合BIRD运行BGP协议边界路由传播

calico配置 BIRD 作为 BGP Route Reflector calico配置 BIRD 作为 BGP Route Reflector Step 1: 安装 BIRD Ubuntu 14.04 添加官方的 BIRD PPA. sudo add-apt-repository ppa:cz.nic-labs/bird sudo apt-get update sudo apt-get install bird RHEL 阅读详情

BIRD是在Internet网络中路由数据包协议在类UNIX系统上的开源实现,它是一个守护进程。

BIRD BIRD Internet Routing Daemon。它是一个程序(一个守护进程),它在互联网类型的网络(即,运行IPv4或IPv6协议的网络)中充当动态路由器。路由器是在互连网络之间转发数据包的设备,以便允许未直接连接到同一局域网的主机相互通信。它们还与互联网中的其他路由器进行通信,以发现网络拓扑结构,从而允许它们找到用于转发数据包(称为路由表)的最佳(根据某些度量)规则,并适应不断变化的条件,如网络链路中断、建立新连接等。这些路由器大多是昂贵的专用设备,运行不透明的固件,难以配置,且不易更改(另一方面,其特殊的硬件设计使其能够跟接近线速在高速网络接口之间转发数据,比通用计算机更好)。UNIX系列的大多数操作系统允许普通计算机充当路由器并转发属于其他主机的数据包,但只能静态配置路由表。

BIRD提供了一种使用传统网络协议发布路由的方法,以允许在集群外部访问Cilium管理的结点。本文档假设Cilium已经部署在集群中,问题是如何确保集群pod CIDR范围在外部可路由可访问。

BIRD目前维护两个版本系列:1.x和2.x,它们之间的配置格式差异很大。除非您已经大量部署了1.x,否则建议直接使用2.x,因为2.x的维护周期更长。以下示例将bird表示为bird2软件,并以bird2理解的格式使用配置。
本文档介绍如何在CentOS 7.x上安装和配置bird,使其与Cilium协作。其他平台上的安装和配置bird也是类似的。

安装 bird

$ yum install -y bird2

$ systemctl enable bird
$ systemctl restart bird
验证安装:
$ birdc show route
BIRD 2.0.6 ready.

$ birdc              # interactive shell
BIRD 2.0.6 ready.
bird> show bfd sessions
There is no BFD protocol running
bird>
bird> show protocols all
Name       Proto      Table      State  Since         Info
device1    Device     ---        up     10:53:40.147

direct1    Direct     ---        down   10:53:40.147
  Channel ipv4
    State:          DOWN
    Input filter:   ACCEPT
    Output filter:  REJECT
...

基础配置

如果不考虑特定的BGP方案,很难讨论bird配置。然而,BGP方案设计超出了本指南的范围。如果您对此主题感兴趣,请参考数据中心的BGP(O’Reilly,2017)。
下面我们将限制BGP场景如下:
![](https://img-blog.csdnimg.cn/img_convert/556744f59698e52447304f0b8499fb9f.png#clientId=u4fadd8d1-7686-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ueb20208e&margin=[object Object]&originHeight=569&originWidth=484&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u54a36267-4aff-442b-84f6-4fd357db7e7&title=)

  • 物理网络: 简单的3层分词体系架构
  • 节点通过l2交换机连接物理网络
  • 每个节点通过bird向物理网络宣告PodCIDR
  • 节点不从物理网络导入路由宣告

这种设计下的BGP连接如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/83171f7a1fc468a3e5cbdc0d358d4af2.png#clientId=u4fadd8d1-7686-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u640a6f74&margin=[object Object]&originHeight=569&originWidth=484&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u315d9c2e-721b-4e9f-9037-d92b9231d24&title=)
这种方案简单在:

  • 核心路由器通过bird学习PodCIDR,使pod IP地址在全局网络中变得可路由。
  • bird不从核心路由器或其它节点学习路由,每个节点的内核路由表都保持足够小和清洁,不至于产生性能问题。

在该方案中,每个节点只向节点的默认网关(核心路由器)发送pod出口流量,并让后者进行路由。
下面给出实现上述设计的参考配置:

$ cat /etc/bird.conf
log syslog all;

router id {{ NODE_IP }};

protocol device {
        scan time 10;           # Scan interfaces every 10 seconds
}

# Disable automatically generating direct routes to all network interfaces.
protocol direct {
        disabled;               # Disable by default
}

# Forbid synchronizing BIRD routing tables with the OS kernel.
protocol kernel {
        ipv4 {                    # Connect protocol to IPv4 table by channel
                import none;      # Import to table, default is import all
                export none;      # Export to protocol. default is export none
        };
}

# Static IPv4 routes.
protocol static {
      ipv4;
      route {{ POD_CIDR }} via "cilium_host";
}

# BGP peers
protocol bgp uplink0 {
      description "BGP uplink 0";
      local {{ NODE_IP }} as {{ NODE_ASN }};
      neighbor {{ NEIGHBOR_0_IP }} as {{ NEIGHBOR_0_ASN }};
      password {{ NEIGHBOR_PWD }};

      ipv4 {
              import filter {reject;};
              export filter {accept;};
      };
}

protocol bgp uplink1 {
      description "BGP uplink 1";
      local {{ NODE_IP }} as {{ NODE_ASN }};
      neighbor {{ NEIGHBOR_1_IP }} as {{ NEIGHBOR_1_ASN }};
      password {{ NEIGHBOR_PWD }};

      ipv4 {
              import filter {reject;};
              export filter {accept;};
      };
}

将上面的配置保存到文件/etc/bird.conf,并替换其中变量:

sed -i 's/{{ NODE_IP }}/<your node ip>/g'                /etc/bird.conf
sed -i 's/{{ POD_CIDR }}/<your pod cidr>/g'              /etc/bird.conf
sed -i 's/{{ NODE_ASN }}/<your node asn>/g'              /etc/bird.conf
sed -i 's/{{ NEIGHBOR_0_IP }}/<your neighbor 0 ip>/g'    /etc/bird.conf
sed -i 's/{{ NEIGHBOR_1_IP }}/<your neighbor 1 ip>/g'    /etc/bird.conf
sed -i 's/{{ NEIGHBOR_0_ASN }}/<your neighbor 0 asn>/g'  /etc/bird.conf
sed -i 's/{{ NEIGHBOR_1_ASN }}/<your neighbor 1 asn>/g'  /etc/bird.conf
sed -i 's/{{ NEIGHBOR_PWD }}/<your neighbor password>/g' /etc/bird.conf

重启bird并检查日志:

$ systemctl restart bird

# check logs
$ journalctl -u bird
-- Logs begin at Sat 2020-02-22 16:11:44 CST, end at Mon 2020-02-24 18:58:35 CST. --
Feb 24 18:58:24 node systemd[1]: Started BIRD Internet Routing Daemon.
Feb 24 18:58:24 node systemd[1]: Starting BIRD Internet Routing Daemon...
Feb 24 18:58:24 node bird[137410]: Started
验证变更,你应该得到类似下面的日志:
$ birdc show route
BIRD 2.0.6 ready.
Table master4:
10.5.48.0/24         unicast [static1 20:14:51.478] * (200)
        dev cilium_host
这说明了节点上的PodCIDR `10.5.48.0/24`已经成功导入到BIRD。
$ birdc show protocols all uplink0 | grep -A 3 -e "Description" -e "stats"
  Description:    BGP uplink 0
  BGP state:          Established
    Neighbor address: 10.4.1.7
    Neighbor AS:      65418
--
    Route change stats:     received   rejected   filtered    ignored   accepted
      Import updates:              0          0          0          0          0
      Import withdraws:           10          0        ---         10          0
      Export updates:              1          0          0        ---          1
在这里,我们看到上行链路0 BGP会话已建立,我们的PodCIDR已从上面导出并被BGP对等方接受。

监控

bird_exporter收集bird 守护进程指标,并导出为prometheus格式的度量指标。
它还提供了一个简单的Grafana仪表板,但您也可以创建自己的仪表板,例如Trip.com看起来像这样:
![](https://img-blog.csdnimg.cn/img_convert/f41837cb77e24ceefea75b50636be4a1.png#clientId=u4fadd8d1-7686-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u59711597&margin=[object Object]&originHeight=588&originWidth=1885&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ubee7da36-05f7-4b74-9db3-f9ce71568ee&title=)

更多配置

您可能需要一些高级配置,以使BGP方案更好的生产就绪。本节列出了其中一些参数,但我们不会深入讨论细节,如需帮助请参考BIRD用户指南

BFD

Bidirectional Forwarding Detection (BFD) 双向转发检测是一种用于加速路径故障检测的检测协议。该特性需要在双端都做以下配置:

protocol bfd {
      interface "{{ grains['node_mgnt_device'] }}" {
              min rx interval 100 ms;
              min tx interval 100 ms;
              idle tx interval 300 ms;
              multiplier 10;
              password {{ NEIGHBOR_PWD }};
      };

      neighbor {{ NEIGHBOR_0_IP] }};
      neighbor {{ NEIGHBOR_1_IP] }};
}

protocol bgp uplink0 {
            ...

        bfd on;
}
通过以下日志验证是否配置成功:
$ birdc show bfd sessions
BIRD 2.0.6 ready.
bfd1:
IP address                Interface  State      Since         Interval  Timeout
10.5.40.2                 bond0      Up         20:14:51.479    0.300    0.000
10.5.40.3                 bond0      Up         20:14:51.479    0.300    0.000

ECMP

出于某些特殊需求(例如L4LB),您可以在多个节点上配置相同的CIDR。在这种情况下,您需要配置 Equal-Cost Multi-Path (ECMP)等成本多路径路由。该功能也需要在双端都做配置:

protocol kernel {
        ipv4 {                    # Connect protocol to IPv4 table by channel
                import none;      # Import to table, default is import all
                export none;      # Export to protocol. default is export none
        };

        # Configure ECMP
        merge paths yes limit {{ N }} ;
}
您需要检查物理网络上的ECMP正确性(上述场景中的核心路由器):
CORE01# show ip route 10.5.2.0
IP Route Table for VRF "default"
'*' denotes best ucast next-hop
'**' denotes best mcast next-hop
'[x/y]' denotes [preference/metric]
'%<string>' in via output denotes VRF <string>

10.5.2.0/24, ubest/mbest: 2/0
    *via 10.4.1.7, [200/0], 13w6d, bgp-65418, internal, tag 65418
    *via 10.4.1.8, [200/0], 12w4d, bgp-65418, internal, tag 65418

优雅重启

该功能也需要在每个bird节点上配置。

protocol bgp uplink0 {
            ...

        graceful restart;
}

参考资料

  1. 原文链接: https://docs.cilium.io/en/stable/gettingstarted/bird/
Cilium 官方文档翻译(9) 替换kube-proxy 本指南解释了如何在没有kube-proxy的情况下配置Kubernetes集群,以及如何使用Cilium完全替换它。cilium 使用 eBPF 实现了内核态高性能的负载均衡,并通过BPF Maps开放控制面的服务发现 阅读详情

相关推荐

【信息科学与工程学】【通信工程】计算机科学与自动化——第二百三十三篇 云NaaS服务 系列二01

国家骨干网(含核心网、IP骨干网、OTN骨干网)/城域网【含3G/4G/5G接入网/PON接入网/OTN接入网+OTN/IP城域网+其他】/中心云(多/双/单Region+多AZ/双AZ/单AZ)+边缘DC+边缘计算节点+端计算节点包括IoT传感器、移动终端、CPE设备。通过5G NR(n78频段,带宽100MHz,子载波间隔30kHz)或GPON(下行2.5Gbps,上行1.25Gbps)接入。本地缓存小于10GB,主要用于临时数据暂存。位于地市级机房,部署MEC服务器(Intel Xeon Platin

weixin_49199313的博客 1257

birdbgp:允许您通过其 UNIX 套接字与 Bird BGP 守护进程对话的 NodeJS 模块

bgpBGP 守护进程的 NodeJS 接口 要求 节点 本地跑的鸟 安装 在您的项目目录中使用 NPM: npm install birdbgp 在node_modules目录中使用 GIT: git clone https://www.github.com/jeffwalter/birdbgp.git 例子 输出 应用程序接口 特性 方法

bird-bgp-kickstart:[Chinese] 给想使用 BIRD 配置 BGP 的新手一个教程

BIRDBGP 的新手开场 我本来是一直不想写这个这类文章的,因为我一直认为动态路由(包括但不限于 BGP)这玩意儿基本都是学习了计算机网络基础知识的人玩的。这些人大都有足够的阅读、学习经验与能力,根据 BIRD 的也都能写出基本正确、可用的配置。而且教程往往会导致更多的新手入坑,我并不是很希望什么都不会的人在没有前置知识储备的基础下来研究这个,所以一直没动笔。 但是在我对入坑的新手的行为观察下来,好像有很多人只是想拥有自己的 ASN 然后实名上网,并不想、或没时间对计算机网络、对 BIRD 的配置文件进行深一度的研究和学习,亦或者是因为语言问题,没有去阅读文档。配置文件只是拿别人放出来的进行拼凑(如某些个人博客,和 Vultr 的样例),知其然而不知其所以然,也造成了很多错误的理解。出于这些原因,我还是动笔写下了这篇文章,希望能为新手留下尽量正确的理解。 话虽如此,我还是希望新手能

BIRDBGP 的新手开场 --

本文同步发布于 GitHub,如有问题、意见、建议,请移步GitHub issue。 BIRDBGP 的新手开场 版本:1.0-20200808.1 本文以Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License进行授权。 本文中使用的 BIRD 版本为撰写此文时的最新版,BIRD 2.0.7。目前 BIRD 1.x 和 2.x 同时在维护,区别是 1.x 中 IPv4 和 IPv6 协议是分开的(bird 和 b...

legend050709的专栏 7088

kubernetes网络()bird实现节点间BGP互联的实验

上一篇文章中我们学习了calico的原理,kubernetes中的node节点,利用 calico 的 bird 程序相互学习路由,为了加深对 bird 程序的认识,本文我们将使用bird进行实验,实验中实现了BGP FULL MESH模式让宿主相互学习到对方的容器网段,从而达到容器网段能相互通信的目的。

鲜少伟的博客 2177

Calico BGP功能介绍:BIRD简介

Calico 作为一种常用的 Kubernetes 网络插件,使用 BGP 协议对各节点的容器网络进行路由交换。本文是《Calico BGP 功能介绍》系列的第一篇,介绍 Calico 所...

云原生实验室 3967

如何快速让 CiliumBGP 协同工作

公众号关注「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !背景官方提供了多篇文档说明如何配置 CiliumBGP 协同工作,本文主要对以下部分功能进行验证:Using BIRD to run BGP[1]Using kube-router to run BGP[2]BGP[3]Cilium BGP Control Plane[4]为了模拟支持 BGP网络环境,文中...

easylife206的专栏 763

路由软件安装使用(一)(bird

tar -xvf bird-2.0.8.tar.gz 80 ls 81 cd bird-2.0.8/ 82 ls 83 ll 84 chown -R root.root * 85 ll 86 ls 87 ./configure --prefix=/usr/src 88 echo $? 89 yum list | grep flex* 90 yum install -y flex* 91 ls 92 ./.

weixin_45537413的博客 1万+

cilium 官方文档翻译(2) 组件概述

cilium 核心组件说明

煮酒论架构 589

bgp第二次试验(完整版).pdf

bgp第二次试验(完整版).pdf

Cilium 官方文档翻译(1)什么是cilium

Cilium 官方文档翻译第一篇

煮酒论架构 565

Kubernetes 网络原理

Docker网络基础 由于Kubernetes是基于Docker容器作为应用发布的载体,而Docker本身的网络特性也决定了Kubernetes在构建一个容器互通网络必须要解决Docker自身网络的缺陷。 网络命名空间 为了支持网络协议栈的多个实例,Linux网络命名空间中引入了网络命名空间(Network Namespace),这些网络协议栈被隔离到不同的命名空间中。不同的命名空间中资源完全隔...

weixin_34354173的博客 491

Spine-ServerLeaf模型配置原生路由互通命令详解

如下图是组网模型: 需求描述:需要Controller、compute01、compute02互相可以ping通。 默认路由(也是静态路由,以下配置只有ServerLeaf01北向用到了默认路由,请自行识别): 当到达了一个知道如何到达目的地址的路由器时,这个路由器就会根据最长前缀匹配来选择有效的路由。子网掩码匹配目的IP地址而且又最长的网络会被选择。用无类别域间路由标记表...

John_ToStr的博客 2686

如何配置 CiliumBGP 协同工作?

❝本文转自 Yoaz 的博客,原文:https://lqingcloud.cn/post/cilium-03/,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang背景官方提供了多篇文档说明如何配置 CiliumBGP 协同工作,本文主要对以下部分功能进行验证:Using BIRD to run BGP[1]Using kube-router to run BG...

云原生实验室 1670

Linux常用命令-1(这篇主要是跟docker、网络配置相关)

压缩/解压缩/网络配置。

捡破烂日记^ ^ 1994

Cilium 中文指南》发布

最近开始对 eBPF 技术和 Cilium 开源项目颇为感兴趣,也翻译了一本 eBPF 相关的资料《什么是 eBPF》, 以及撰写了请暂时抛弃使用 eBPF 取代服务网格和 sidecar 模式的幻想的文章,想要再深入了解一下 Cilium 和 eBPF 这样的技术就服务网格领域究竟能发挥什么样的作用,那么就先从 Cilium 开始吧!阅读地址:https://lib...

ServiceMesher 403

bird & quagga 静态路由配置

背景 bird静态路由配置 quagga静态路由配置

legend050709的专栏 2425

ubuntu 下实现 docker+ovs+quagga搭建网络---bgp

注:本机上现有quagga镜像+ovs虚拟交换机(2.9.1)+docker(18.09.7) 实现bgp网络搭建: 1、sudo ovs-vsctl add-br br1 #增加一个ovs网桥br1 2、sudo docker images #查看本机的镜像是否制作成功 quagga的镜像...

tzk 2304
上一篇: Cilium 官方文档翻译(10) BGP - kube-router协作通过BGP在集群外传播路由
煮酒论架构
博客等级 码龄9年 3粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值