26 K3s 上的 MetalLB(使用第 3 层模式) #
MetalLB 是使用标准路由协议的裸机 Kubernetes 群集的负载平衡器实现。
本指南将演示如何在第 3 层 (L3) BGP 模式下部署 MetalLB。
26.1 为何使用 MetalLB #
由于以下原因,MetalLB 成为了用来实现裸机 Kubernetes 群集负载平衡的较佳选择:
与 Kubernetes 本机集成:MetalLB 可无缝与 Kubernetes 集成,让用户可使用熟悉的 Kubernetes 工具和方法轻松进行部署和管理。
裸机兼容性:与基于云的负载平衡器不同,MetalLB 专门用于本地部署,在这种部署中,可能无法使用传统负载平衡器或使用传统负载平衡器不现实。
支持多种协议:MetalLB 支持第 2 层和第 3 层 BGP(边界网关协议)模式,提供了很大的灵活性,适合不同的网络架构并可满足不同的要求。
高可用性:MetalLB 可以将负载平衡负担分散在多个节点中,从而确保服务的高可用性和可靠性。
可伸缩性:MetalLB 可以处理大规模部署,并且能够将 Kubernetes 群集扩容来满足日益增长的需求。
在第 2 层模式下,一个节点负责向本地网络播发服务。从网络的角度看,似乎为该计算机的网络接口分配了多个 IP 地址。
第 2 层模式的主要优势在于其通用性:它可以在任何以太网上正常工作,不需要任何特殊硬件,甚至不需要各种形式的路由器。
26.2 K3s 上的 MetalLB(使用 L3) #
本快速入门中使用 L3 模式,这意味着网络范围内需要有支持 BGP 功能的相邻路由器。
26.3 先决条件 #
要部署 MetalLB 的 K3s 群集。
网络中支持 BGP 协议的路由器。
网络范围内用于服务的空闲 IP 地址,本示例中为
192.168.10.100
您必须确保此 IP 地址未被分配。在 DHCP 环境中,该地址不得属于 DHCP 池,以避免重复分配。
26.4 配置服务 IP 地址通告 #
默认情况下,BGP 会向所有已配置的对等方通告服务 IP 地址。这些对等方(通常是路由器)会收到每个服务 IP 地址的路由,且网络掩码为 32 位。在本示例中,我们将使用与群集处于同一网络的基于 FRR 的路由器,然后利用 MetalLB 的 BGP 功能向该基于 FRR 的路由器通告服务。
26.5 部署 #
我们将使用作为 SUSE Edge 解决方案一部分发布的 MetalLB Helm chart:
helm install \
metallb oci://registry.suse.com/edge/charts/metallb \
--namespace metallb-system \
--create-namespace
while ! kubectl wait --for condition=ready -n metallb-system $(kubectl get\
pods -n metallb-system -l app.kubernetes.io/component=controller -o name)\
--timeout=10s; do
sleep 2
done26.6 配置 #
至此,安装已完成。接下来创建
IPAddressPool:
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: bgp-pool
namespace: metallb-system
labels:
app: httpd
spec:
addresses:
- 192.168.10.100/32
autoAssign: true
avoidBuggyIPs: false
serviceAllocation:
namespaces:
- metallb-system
priority: 100
serviceSelectors:
- matchExpressions:
- key: serviceType
operator: In
values:
- httpd
EOF配置
BGPPeer。
FRR 路由器的 ASN 为 1000,而我们的 BGPPeer 的 ASN 为 1001。您还可看到 FRR
路由器的 IP 地址为 192.168.3.140。
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
namespace: metallb-system
name: mypeertest
spec:
peerAddress: 192.168.3.140
peerASN: 1000
myASN: 1001
routerID: 4.4.4.4
EOF创建 BGPAdvertisement(L3 模式):
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
name: bgpadvertisement-test
namespace: metallb-system
spec:
ipAddressPools:
- bgp-pool
EOF26.7 用法 #
创建包含服务的示例应用程序。在本示例中,该服务将使用来自
IPAddressPool的 IP 地址192.168.10.100。
cat <<- EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
namespace: metallb-system
labels:
app: httpd
spec:
replicas: 3
selector:
matchLabels:
pod-label: httpd
template:
metadata:
labels:
pod-label: httpd
spec:
containers:
- name: httpdcontainer
image: image: docker.io/library/httpd:2.4
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: http-service
namespace: metallb-system
labels:
serviceType: httpd
spec:
selector:
pod-label: httpd
type: LoadBalancer
ports:
- protocol: TCP
port: 8080
name: 8080-tcp
targetPort: 80
EOF要进行验证,可登录 FRR 路由器查看 BGP 通告生成的路由。
42178089cba5# show ip bgp all
For address family: IPv4 Unicast
BGP table version is 3, local router ID is 2.2.2.2, vrf id 0
Default local pref 100, local AS 1000
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
* i172.16.0.0/24 1.1.1.1 0 100 0 i
*> 0.0.0.0 0 32768 i
* i172.17.0.0/24 3.3.3.3 0 100 0 i
*> 0.0.0.0 0 32768 i
*= 192.168.10.100/32
192.168.3.162 0 1001 i
*= 192.168.3.163 0 1001 i
*> 192.168.3.161 0 1001 i
Displayed 3 routes and 7 total paths
kubectl get svc -n hello-kubernetes
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-kubernetes LoadBalancer 10.43.127.75 192.168.122.11 80:31461/TCP 8s如果该路由器是您网络的默认网关,可在网络中的某个设备上运行
curl命令,验证是否能访问 httpd 示例应用程序。
# curl http://192.168.10.100:8080
<html><body><h1>It works!</h1></body></html>
#