documentation.suse.com / SUSE Edge 文档 / 操作指南 / K3s 上的 MetalLB(使用第 3 层模式)

26 K3s 上的 MetalLB(使用第 3 层模式)

MetalLB 是使用标准路由协议的裸机 Kubernetes 群集的负载平衡器实现。

本指南将演示如何在第 3 层 (L3) BGP 模式下部署 MetalLB。

26.1 为何使用 MetalLB

由于以下原因,MetalLB 成为了用来实现裸机 Kubernetes 群集负载平衡的较佳选择:

  1. 与 Kubernetes 本机集成:MetalLB 可无缝与 Kubernetes 集成,让用户可使用熟悉的 Kubernetes 工具和方法轻松进行部署和管理。

  2. 裸机兼容性:与基于云的负载平衡器不同,MetalLB 专门用于本地部署,在这种部署中,可能无法使用传统负载平衡器或使用传统负载平衡器不现实。

  3. 支持多种协议:MetalLB 支持第 2 层和第 3 层 BGP(边界网关协议)模式,提供了很大的灵活性,适合不同的网络架构并可满足不同的要求。

  4. 高可用性:MetalLB 可以将负载平衡负担分散在多个节点中,从而确保服务的高可用性和可靠性。

  5. 可伸缩性: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
done

26.6 配置

  1. 至此,安装已完成。接下来创建 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
  1. 配置 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
  1. 创建 BGPAdvertisement(L3 模式):

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: bgpadvertisement-test
  namespace: metallb-system
spec:
  ipAddressPools:
  - bgp-pool
EOF

26.7 用法

  1. 创建包含服务的示例应用程序。在本示例中,该服务将使用来自 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
  1. 要进行验证,可登录 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
  1. 如果该路由器是您网络的默认网关,可在网络中的某个设备上运行 curl 命令,验证是否能访问 httpd 示例应用程序。

# curl http://192.168.10.100:8080
<html><body><h1>It works!</h1></body></html>
#