在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(下)

8619facb9a444e2f03729cba31bf705e.gif

作者 | Addo Zhang

来源 | 云原生指北

在上一篇《在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(上)》中,我们使用 MetalLB 的 Layer2 模式作为 LoadBalancer 的实现,将 Kubernetes 集群中的服务暴露到集群外。

还记得我们在 Configmap 中为 MetalLB 分配的 IP 地址池么?

apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |address-pools:- name: defaultprotocol: layer2addresses:- 192.168.1.30-192.168.1.49

这里分配的 192.168.1.30-192.168.1.49 IP 段正好是在笔者的家庭网络中,当我们用 192.168.1.30 可以成功访问服务。

之前有提过 Layer2 的缺点时还漏了一点,除了故障转移过程中对可用性有影响且存在单点网络瓶颈,还有就是客户端需要与地址池位于同一个子网(假如将地址池改为 192.168.1.30-192.168.1.49,服务将无法访问)。不过在实验环境或者像笔者这样的 homelab 环境来说,前两个都不算是问题,后一个则在网络配置时稍微麻烦一些。

虽然缺点很明显,但是 Layer2 模式有更强的通用性,不像 BGP 模式需要支持 BGP 的路由。但是这些都挡不住笔者的探(强)索(迫)欲(症),因为还有一个 OpenWrt 软路由运行在我的 Proxmox 虚拟机中。这个 OpenWrt 以软路由的方式,通过 192.168.1.2 对外提供路由服务,通过安装路由软件套件来支持 BGP。

正式开始之前,先看下什么是 BPG 以及相关的术语。已经了解,或者觉得太抽象的同学可以直接跳过,待看完demo的再回头看。

什么是 BGP

BGP 是边界网关协议(Border Gateway Protocol)的缩写。

边界网关协议是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或“前缀”表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。

BGP的邻居关系(或称通信对端/对等实体,peer)是通过人工配置实现的,对等实体之间通过TCP端口179建立会话交换数据。BGP路由器会周期地发送19字节的保持存活(keep-alive)消息来维护连接(默认周期为60秒)。在各种路由协议中,只有BGP使用TCP作为传输层协议。

同一个AS自治系统中的两个或多个对等实体之间运行的BGP被称为iBGP(Internal/Interior BGP)。归属不同的AS的对等实体之间运行的BGP称为eBGP(External/Exterior BGP)。在AS边界上与其他AS交换信息的路由器被称作边界路由器(border/edge router),边界路由器之间互为eBGP对端。在Cisco IOS中,iBGP通告的路由距离为200,优先级比eBGP和任何内部网关协议(IGP)通告的路由都低。其他的路由器实现中,优先级顺序也是eBGP高于IGP,而IGP又高于iBGP。Mar 6, 2022Mar 6, 2022 iBGP和eBGP的区别主要在于转发路由信息的行为。例如,从eBGP peer获得的路由信息会分发给所有iBGP peer和eBGP peer,但从iBGP peer获得的路由信息仅会分发给所有eBGP peer。所有的iBGP peer之间需要全互联。

这里提到了三个名词:自治系统(AS)、内部网关协议(IGP)和外部网关协议(EGP)。

自治系统 AS

我们看下来自维基百科的介绍:

自制系统(Autonomous system,缩写 AS),是指在互联网中,一个或多个实体管辖下的所有IP 网络和路由器的组合,它们对互联网执行共同的路由策略。自治系统编号都是16位长的整数,这最多能被分配给65536个自治系统。自治系统编号被分成两个范围。第一个范围是公开的ASN,从1到64511,它们可在互联网上使用;第二个范围是被称为私有编号的从64512到65535的那些,它们仅能在一个组织自己的网络内使用。

简单理解,电信、移动、联通都有自己的 AS 编号,且不只一个,有兴趣的可以查看维基百科中的中国互联网骨干网条目。

除了互联网公开的 ASN 以外,私有的编号可以在内部使用。比如我可以我的家庭网络中使用私有编号创建几个 AS。

内部路由协议 IGP

引用百科中的内容,不是本篇的重点因此不做过多介绍。

内部路由协议(Interior Gateway Protocol 缩写为 IGP)是指在一个自治系统(AS)内部所使用的一种路由协议。

外部网关协议 EGP

外部网关协议(Exterior Gateway Protocol,错写 EGP)是一个已经过时互联网路由协议。已由 BPG 取代。

BPG 的由来

BPG 是为了替换 EGP 而创建的,而除了应用于 AS 外部,也可以应用在 AS 内部。因此又分为 EBGP 和 IBGP。

fa9b3dd51d07b6778e0c9c4bbc0b1170.png

说了这么多可能有些抽象,直接上 demo 吧。

Demo

环境还是使用之前的,按照预先设想我们希望创建两个 AS:65000 和 65001。前者作为路由器和客户端所在的 AS,而后者是我们集群服务 LoadBalancer IP 所在的 AS。

90010cace66966da71a22dc4df850651.png

bgp

我们要先让 OpenWrt 支持 BGP。

OpenWrt 支持 BGP

为了让 OpenWrt 支持 BGP,这里要用到路由软件套件 Quagga(https://www.quagga.net)。Quagga 提供了 OSPFv2、OSPFv3、RIP v1 v2、RIPng 和 BGP-4 的实现。

Quagga 架构由核心守护进程和 zebra 组成,后者作为底层 Unix 内核的抽象层,并通过 Unix 或者 TCP 向 Quagga 客户端提供 Zserv API。正是这些 Zserv 客户端实现了路由协议,并将路由的更新发送给 zebra 守护进程。当前 Zserv 的实现是:

37a64d284a69677512272b3ea138c984.png

Quagga 的守护进程可以通过网络可访问的 CLI(简称 vty)进行配置。CLI 遵循与其他路由软件类似的风格。还额外提供了一个工具 vtysh,充当了所有守护进程的聚合前端,允许在一个地方管理所有 Quagga 守护进程的所有功能。

执行下面的命令即可完成安装:

$ opkg update && opkg install quagga quagga-zebra quagga-bgpd quagga-vtysh

成功安装之后,会自动启动并监听端口:

$ netstat -lantp | grep -e 'zebra\|bgpd'
tcp        0      0 0.0.0.0:2601            0.0.0.0:*               LISTEN      2984/zebra
tcp        0      0 0.0.0.0:2605            0.0.0.0:*               LISTEN      3000/bgpd
tcp        0      0 :::2601                 :::*                    LISTEN      2984/zebra
tcp        0      0 :::2605                 :::*                    LISTEN      3000/bgpd

这里并没有看到 bpgd 用于接收路由信息而监听的 179 端口,这是因为该路由还没有分配 AS。不着急,让我们使用命令 vtysh进入 vty 进行配置:

$ vtysh
OpenWrt# conf t
OpenWrt(config)# router bgp 65000
OpenWrt(config-router)# neighbor 192.168.1.5 remote-as 65001
OpenWrt(config-router)# neighbor 192.168.1.5 description ubuntu-dev1
OpenWrt(config-router)# neighbor 192.168.1.6 remote-as 65001
OpenWrt(config-router)# neighbor 192.168.1.6 description ubuntu-dev2
OpenWrt(config-router)# exit
OpenWrt(config)# exit

在 vty 中使用 show ip bgp summary 命令查看:

OpenWrt# show ip bgp summary
BGP router identifier 192.168.1.2, local AS number 65000
RIB entries 0, using 0 bytes of memory
Peers 2, using 18 KiB of memoryNeighbor        V         AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.1.5     4 65001       0       0        0    0    0 never    Active
192.168.1.6     4 65001       0       0        0    0    0 never    ActiveTotal number of neighbors 2Total num. Established sessions 0
Total num. of routes received     0

此时我们再去查看端口监听,就可以看到 bgpd 已经在监听 179 端口了:

$ netstat -lantp | grep -e 'zebra\|bgpd'
tcp        0      0 0.0.0.0:179             0.0.0.0:*               LISTEN      3000/bgpd
tcp        0      0 0.0.0.0:2601            0.0.0.0:*               LISTEN      2984/zebra
tcp        0      0 0.0.0.0:2605            0.0.0.0:*               LISTEN      3000/bgpd
tcp        0      0 :::179                  :::*                    LISTEN      3000/bgpd
tcp        0      0 :::2601                 :::*                    LISTEN      2984/zebra
tcp        0      0 :::2605                 :::*                    LISTEN      3000/bgpd

BGP 的路由设置好之后,就是 MetalLB 的部分了。

MetalLB BGP 模式

我们更新一下 configmap:

apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |peers:- peer-address: 192.168.1.2peer-asn: 65000my-asn: 65001address-pools:- name: defaultprotocol: bgpaddresses:- 192.168.0.30-192.168.0.49

更新之后,你会发现 Service 的 EXTERNAL-IP 并没有重新分配,MetalLB 的控制器并没有自动生效配置。我们删除控制器 pod 进行重启:

$ kubectl delete po -n metallb-system -l app=metallb,component=controller
pod "controller-66445f859d-vss2t" deleted

此时可以看到 Service 分配到了新的 IP:

$ kubectl get svc -n default
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)          AGE
kubernetes   ClusterIP      10.43.0.1       <none>         443/TCP          25m
nginx-lb     LoadBalancer   10.43.188.185   192.168.0.30   8080:30381/TCP   21m
nginx2-lb    LoadBalancer   10.43.208.169   192.168.0.31   8080:32319/TCP   21m

检查 speaker POD 的日志,可以看到与 peer 192.168.1.2 之间的通信已经开始,并对外发布了 IP 地址的公告:

{"caller":"level.go:63","configmap":"metallb-system/config","event":"peerAdded","level":"info","msg":"peer configured, starting BGP session","peer":"192.168.1.2","ts":"2022-03-06T22:56:17.336335657Z"}
{"caller":"level.go:63","configmap":"metallb-system/config","event":"configLoaded","level":"info","msg":"config (re)loaded","ts":"2022-03-06T22:56:17.336366122Z"}
struct { Version uint8; ASN16 uint16; HoldTime uint16; RouterID uint32; OptsLen uint8 }{Version:0x4, ASN16:0xfde8, HoldTime:0xb4, RouterID:0xc0a80102, OptsLen:0x1e}
{"caller":"level.go:63","event":"sessionUp","level":"info","localASN":65001,"msg":"BGP session established","peer":"192.168.1.2:179","peerASN":65000,"ts":"2022-03-06T22:56:17.337341549Z"}
{"caller":"level.go:63","event":"updatedAdvertisements","ips":["192.168.0.30"],"level":"info","msg":"making advertisements using BGP","numAds":1,"pool":"default","protocol":"bgp","service":"default/nginx-lb","ts":"2022-03-06T22:56:17.341939983Z"}
{"caller":"level.go:63","event":"serviceAnnounced","ips":["192.168.0.30"],"level":"info","msg":"service has IP, announcing","pool":"default","protocol":"bgp","service":"default/nginx-lb","ts":"2022-03-06T22:56:17.341987657Z"}
{"caller":"level.go:63","event":"updatedAdvertisements","ips":["192.168.0.31"],"level":"info","msg":"making advertisements using BGP","numAds":1,"pool":"default","protocol":"bgp","service":"default/nginx2-lb","ts":"2022-03-06T22:56:17.342041554Z"}
{"caller":"level.go:63","event":"serviceAnnounced","ips":["192.168.0.31"],"level":"info","msg":"service has IP, announcing","pool":"default","protocol":"bgp","service":"default/nginx2-lb","ts":"2022-03-06T22:56:17.342056076Z"}

然后可以在 vty 中查看路由表:

OpenWrt# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel, N - NHRP,> - selected route, * - FIB routeK>* 0.0.0.0/0 via 192.168.1.1, br-lan
C>* 127.0.0.0/8 is directly connected, lo
B>* 192.168.0.30/32 [20/0] via 192.168.1.5, br-lan, 00:00:06
B>* 192.168.0.31/32 [20/0] via 192.168.1.5, br-lan, 00:00:06
C>* 192.168.1.0/24 is directly connected, br-lan

从表中我们可以找到 192.168.0.30/32 和 192.168.0.31/32 两条 BGP 的路由。

测试

我们使用新的 IP 访问服务:

$ curl -I 192.168.0.30:8080
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Sun, 06 Mar 2022 23:10:33 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT
Connection: keep-alive
ETag: "61f01158-267"
Accept-Ranges: bytes

总结

至此,我们已经试过了 MetalLB 的两种模式:Layer2 有很强的通用性,不需要其他任何的依赖,但是缺点也明显;BGP 模式除了依赖支持 BGP 的路由,其他方面则没有任何限制,并且没有可用性的问题。

BGP 应该是 LoadBalancer 的终极模式,但是 Layer2 也不是毫无用处。大家还是要看使用的场景来理性的选择,比如 homelab 中使用我会选择 Layer2 模式。

5d597a233650c9a2f2e9991d5057eb52.gif

30cba7fbca322b104b9e2c3bf40902c8.png

往期推荐

Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

如果被问到分布式锁,应该怎样回答?

别再用 Redis List 实现消息队列了,Stream 专为队列而生

Java 底层知识:什么是 “桥接方法” ?

74ba11ed6c4839ce82accbd794443af1.gif

点分享

4030aa147da3e5e8763cba15e6bd0a23.gif

点收藏

70eec606ae08289c7ce8016655308d18.gif

点点赞

78a8efbeb864492e947c42aa2050da5c.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚焦2021云栖大会,边缘云专场畅谈技术应用创新

简介&#xff1a; 本届大会以“前沿 探索 想象力”为主题&#xff0c;与业界同仁、合作伙伴共同打造一场数字时代的云上相聚。其中&#xff0c;边缘计算技术领域因5G快速发展而备受关注&#xff0c;阿里云边缘云专场吸引了数百位参会嘉宾驻足。 于10月21日上午举办的“边缘云应…

技术干货 | 闲鱼:一个优秀的 Push 平台,需要经历怎样的前世今生

简介&#xff1a; mPaaS 消息推送服务&#xff0c;快速集成多家厂商 Push 通道&#xff0c;有效提高用户留存率&#xff0c;提升用户体验。 编者荐语&#xff1a; 点击这里&#xff0c;了解 mPaaS 消息推送服务&#xff0c;快速集成多家厂商 Push 通道&#xff0c;有效提高用户…

「深入浅出」主流前端框架更新批处理方式

作者 | &#x1f47d;来源 | 前端Sharing背景在不同的技术框架背景下&#xff0c;处理更新的手段各不相同&#xff0c;今天我们来探讨一下&#xff0c;主流的前端框架批量处理的方式&#xff0c;和其内部的实现原理。通过今天的学习&#xff0c;你将收获这些内容&#xff1a;主…

钉钉宜搭3.0发布!易连接、酷数据、更安全

简介&#xff1a; 10月20日&#xff0c;在2021云栖大会低代码分论坛上&#xff0c;阿里巴巴资深技术专家叶周全&#xff08;花名骁勇&#xff09;发布钉钉宜搭3.0版本。 10月20日&#xff0c;在2021云栖大会低代码分论坛上&#xff0c;阿里巴巴资深技术专家叶周全&#xff08;…

基层数字化治理困境如何破局?

简介&#xff1a; 10月20日&#xff0c;2021云栖大会低代码分论坛如约举行。在这场低代码行业的盛会上&#xff0c;兰溪市大数据发展中心党组书记、主任芦建洪分享的内容获得了在场观众的热烈反响&#xff0c;兰溪市使用钉钉宜搭低代码破解基层数字化治理困境的成功经验也为全国…

形式化验证工具TLA+:程序员视角的入门之道

简介&#xff1a; 女娲是飞天分布式系统中提供分布式协同的基础服务&#xff0c;支撑着阿里云的计算、网络、存储等几乎所有云产品。在女娲分布式协同服务中&#xff0c;一致性引擎是核心基础模块&#xff0c;支持了Paxos&#xff0c;Raft&#xff0c;EPaxos等多种一致性协议&a…

性能突出的 Redis 是咋使用 epoll 的?

作者 | 闪客来源 | 低并发编程我是个 redis 服务&#xff0c;我马上就要启动了因为我的主人正在控制台输入&#xff1a;./redis-server宏观上看下我的流程突然&#xff0c;主人按下了回车键&#xff0c;不得了了。shell 程序把我的程序加载到了内存&#xff0c;开始执行我的 ma…

阿里云重磅发布业务中台产品 BizWorks,中台发展进入下一个阶段

简介&#xff1a; 业务中台产品BizWorks重磅发布&#xff0c;这可以看作是阿里云在 “做厚中台” 战略上继 “云钉一体”之后的又一个新动作&#xff01; 10 月 19 日&#xff0c;2021 云栖大会正式开幕&#xff0c;连续举办多年的云栖大会俨然已经成为了国内科技产业展示前沿…

java32位怎么用eclipse_无法在Windows 7 32位上打开eclipse

我正在使用Eclipse Indigo(eclipse-jee-indigo-SR2-win32) . 当我双击eclipse.exe时&#xff0c;会出现以下对话框&#xff1a;日志文件的内容如下&#xff1a;!SESSION 2013-05-27 17:55:26.853 -----------------------------------------------eclipse.buildIdM20120208-080…

云栖发布|企业级互联网架构全新升级 ,助力数字创新

简介&#xff1a; 云原生产品家族全面升级&#xff0c;让业务技术团队有了更多选择&#xff0c;通过简单、丰富、开放和低成本的 PaaS 服务&#xff0c;帮助企业客户更简单、更高效的进行在云上创新&#xff0c;搭建更符合业务需要和团队情况的技术体系。 作者&#xff5c;白玙…

当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢

作者 | 阿Q来源 | 阿Q说代码事情是这样的&#xff1a;对话中的截图如下&#xff1a;看了阿Q的解释&#xff0c;你是否也和“马小跳”一样存在疑问呢&#xff1f;请往&#x1f447;看我们都知道在java中&#xff0c;只要是类型兼容&#xff0c;就可以将一种类型的对象分配给另一…

java 垃圾回收 新生代_Java垃圾回收

一、概述Java垃圾回收器实现内存的自动分配和回收&#xff0c;这两个操作都发生在Java堆上(还包括方法区&#xff0c;即永久代)。垃圾回收操作不是实时的发生(对象死亡不会立即释放)&#xff0c;当内存消耗完或者是达到某一指标(threshold,使用内存占总内存的比列&#xff0c;比…

一图看懂云栖大会「云原生」发布

简介&#xff1a; 云原生产品全新升级 原文链接 本文为阿里云原创内容&#xff0c;未经允许不得转载。

明明还有大量内存,为啥报错“无法分配内存”?

作者 | 张彦飞allen来源 | 开发内功修炼近日小伙伴和我说了线上服务器出现一个诡异的问题&#xff0c;执行任何命令都是报错“fork:无法分配内存”。这个问题最近出现的&#xff0c;前几次重启后解决的&#xff0c;但是每隔 2-3 天就会出现一次。# service docker stop -bash f…

先行一步,7大技术创新和突破,阿里云把 Serverless 领域的这些难题都给解了

简介&#xff1a; 函数计算 FC 首创 GPU 实例、业内首发实例级别可观测和调试、率先提供端云联调和多环境部署能力、GB 级别镜像启动时间优化至秒级、VPC 网络建连优化至200ms&#xff0c;Serverless 应用引擎 SAE 支持微服务框架无缝迁移、无需容器化改造、业内首创混合弹性策…

基于Delta lake、Hudi格式的湖仓一体方案

简介&#xff1a; Delta Lake 和 Hudi 是流行的开放格式的存储层&#xff0c;为数据湖同时提供流式和批处理的操作&#xff0c;这允许我们在数据湖上直接运行 BI 等应用&#xff0c;让数据分析师可以即时查询新的实时数据&#xff0c;从而对您的业务产生即时的洞察。MaxCompute…

如何新建java内部类_java内部类-1(内部类的定义)

小胖从官网出发&#xff0c;研究下为什么我们需要些内部类&#xff0c;内部类的区别和联系。思考三个问题&#xff1a;(1)为什么需要内部类&#xff1f;静态内部类和非静态内部类有什么区别&#xff1b;(2)为什么内部类可以无条件访问外部类成员&#xff1b;(3)为什么jdk1.8之前…

stack vs heap:栈区分配内存快还是堆区分配内存快 ?

作者 | 码农的荒岛求生来源 | 码农的荒岛求生有伙伴问到底是从栈上分配内存快还是从堆上分配内存快&#xff0c;这是个比较基础的问题&#xff0c;今天就来聊一聊。栈区的内存申请与释放毫无疑问&#xff0c;显然从栈上分配内存更快&#xff0c;因为从栈上分配内存仅仅就是栈指…

CDP 平台简介

简介&#xff1a; EDC 建立在 Cloudera Data Platform(CDP) 之上&#xff0c;该产品结合了 Cloudera Enterprise Data Hub 和 Hortonworks Data Platform Enterprise 的优点&#xff0c;并在技术堆栈中增加了新功能和对已有技术提供了增强功能。这种统一的发行是一个可扩展且可…

400倍加速, PolarDB HTAP实时数据分析技术解密

简介&#xff1a; PolarDB MySQL是因云而生的一个数据库系统, 除了云上OLTP场景&#xff0c;大量客户也对PolarDB提出了实时数据分析的性能需求。对此PolarDB技术团队提出了In-Memory Column Index(IMCI&#xff09;的技术方案&#xff0c;在复杂分析查询场景获得的数百倍的加速…