下午好,我遇到了无法将 MetalLB 连接到 K3S 的问题。我有一个包含 3 个主服务器和 3 个工作服务器的集群

NAME            STATUS   ROLES                       AGE    VERSION
master-node-1   Ready    control-plane,etcd,master   4d2h   v1.30.5+k3s1
master-node-2   Ready    control-plane,etcd,master   4d1h   v1.31.1+k3s1
master-node-3   Ready    control-plane,etcd,master   4d1h   v1.31.1+k3s1
worker-node-1   Ready    <none>                      4d1h   v1.31.1+k3s1
worker-node-2   Ready    <none>                      4d     v1.31.1+k3s1
worker-node-3   Ready    <none>                      4d     v1.31.1+k3s1

最初,我尝试以这种方式安装 MetalLB

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml

配置

# config.yml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.0.170-192.168.0.180

这种方法虽然有效,但负载均衡器在水龙头上不稳定,有 50% 的概率无法进入网站。后来我发现这是一种过时的方法。我尝试了一种新方法

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml

配置

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: k3s-lb-pool
  namespace: metallb
spec:
  addresses:
  - 192.168.0.170-192.168.0.180
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: k3s-lb-pool
  namespace: metallb

但我收到错误

Error from server (InternalError): error when creating "metalLB-config.yaml": Internal error occurred: failed calling webhook "ipaddresspoolvalidationwebhook.metallb.io": failed to call webhook: Post "https://metallb-webhook-service.metallb.svc:443/validate-metallb-io-v1beta1-ipaddresspool?timeout=10s": no endpoints available for service "metallb-webhook-service"
Error from server (InternalError): error when creating "metalLB-config.yaml": Internal error occurred: failed calling webhook "l2advertisementvalidationwebhook.metallb.io": failed to call webhook: Post "https://metallb-webhook-service.metallb.svc:443/validate-metallb-io-v1beta1-l2advertisement?timeout=10s": no endpoints available for service "metallb-webhook-service"

但命名空间仍然正常工作

root@master-node-1:~# kubectl get pod -n=metallb-system
NAME                          READY   STATUS    RESTARTS        AGE
controller-86f5578878-9ddsr   1/1     Running   2 (3m31s ago)   4m57s
speaker-5j47x                 1/1     Running   0               4m56s
speaker-6drpd                 1/1     Running   0               4m56s
speaker-ccpmq                 1/1     Running   0               4m56s
speaker-jfpch                 1/1     Running   1 (3m12s ago)   4m56s
speaker-mps8b                 1/1     Running   0               4m57s
speaker-t9lx2                 1/1     Running   0               4m56s

(我提前道歉,英语不是我的母语)


最佳答案
1

欢迎来到 ServerFault👋

默认情况下,k3s 已经包含一个名为的 LoadBalancer (以前称为 Klipper LoadBalacer)。我怀疑两者同时运行,这会导致问题:其中一个问题是,您的 LoadBalancer 类型的服务只能偶尔访问。这是因为 ServiceLB 和 MetalLB 默认在后台使用 L2 广告。

因此,如果您想将 MetalLB 与 k3s 结合使用,则需要禁用 ServiceLB()。 如果您的集群已在运行,则可以将标志添加到位于以下--disable servicelb位置的 systemd 单元文件中:/etc/systemd/system/k3s.service

...
ExecStart=/usr/local/bin/k3s \
server \
    '--server' \
    '...' \
    '--disable' \
    'servicelb' \
    '--disable' \ <-- You can use multiple disable flags.
    'traefik' \
    '...' \
    'node-role.kubernetes.io/master=true:NoSchedule' \

您描述的第二个问题对我来说有点难以调试。我怀疑您在尝试创建之前没有等待足够长的时间,IPAddressPool但这L2Advertisement只是基于您metallb-webhook-service似乎没有任何端点这一事实的猜测。也许您可以分享一些 MetalLB 控制器 pod 的日志?但我会先尝试禁用 ServiceLB,然后重新安装 MetalLB。

2

  • 下午好,ServiceLB 已为我禁用 `server \’–cluster-init’\’–tls-san’\’192.168.0.55’\<-KubeVIP’disable’\’servicelb’\’–node-ip=192.168.0.176’\` 我还启用了 KubeVIP 来连接附加说明,也许问题是因为这个?我主要根据本指南设置了集群-> 斜体 粗体至于等待时间短,错误自行崩溃,但我不知道如何增加等待时间


    – 

  • @СергейДударев 您能否分享从“ExecStart”开始的 k3s systemd 单元文件的内容(如我的回答中所述)?


    –