app界面设计网站,信息化平台的功能介绍,企业网站建设实训小结,网页版下载作者 | Addo Zhang来源 | 云原生指北在上一篇《在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer#xff08;上#xff09;》中#xff0c;我们使用 MetalLB 的 Layer2 模式作为 LoadBalancer 的实现#xff0c;将 Kubernetes 集群中的服务暴露到集群外。还记得我们在 … 作者 | 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的再回头看。什么是 BGPBGP 是边界网关协议Border Gateway Protocol的缩写。边界网关协议是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或“前缀”表来实现自治系统AS之间的可达性属于矢量路由协议。BGP不使用传统的内部网关协议IGP的指标而使用基于路径、网络策略或规则集来决定路由。因此它更适合被称为矢量性协议而不是路由协议。BGP的邻居关系或称通信对端/对等实体peer是通过人工配置实现的对等实体之间通过TCP端口179建立会话交换数据。BGP路由器会周期地发送19字节的保持存活keep-alive消息来维护连接默认周期为60秒。在各种路由协议中只有BGP使用TCP作为传输层协议。同一个AS自治系统中的两个或多个对等实体之间运行的BGP被称为iBGPInternal/Interior BGP。归属不同的AS的对等实体之间运行的BGP称为eBGPExternal/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。说了这么多可能有些抽象直接上 demo 吧。Demo环境还是使用之前的按照预先设想我们希望创建两个 AS65000 和 65001。前者作为路由器和客户端所在的 AS而后者是我们集群服务 LoadBalancer IP 所在的 AS。bgp我们要先让 OpenWrt 支持 BGP。OpenWrt 支持 BGP为了让 OpenWrt 支持 BGP这里要用到路由软件套件 Quaggahttps://www.quagga.net。Quagga 提供了 OSPFv2、OSPFv3、RIP v1 v2、RIPng 和 BGP-4 的实现。Quagga 架构由核心守护进程和 zebra 组成后者作为底层 Unix 内核的抽象层并通过 Unix 或者 TCP 向 Quagga 客户端提供 Zserv API。正是这些 Zserv 客户端实现了路由协议并将路由的更新发送给 zebra 守护进程。当前 Zserv 的实现是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/bgpdBGP 的路由设置好之后就是 MetalLB 的部分了。MetalLB BGP 模式我们更新一下 configmapapiVersion: 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 appmetallb,componentcontroller
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 模式。往期推荐Redis 缓存击穿失效、缓存穿透、缓存雪崩怎么解决如果被问到分布式锁应该怎样回答别再用 Redis List 实现消息队列了Stream 专为队列而生Java 底层知识什么是 “桥接方法” 点分享点收藏点点赞点在看