下午好,我遇到了无法将 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
(我提前道歉,英语不是我的母语)
欢迎来到 ServerFault👋
默认情况下,k3s 已经包含一个名为ServiceLB的 LoadBalancer (以前称为 Klipper LoadBalacer)。我怀疑两者同时运行,这会导致问题:其中一个问题是,您的 LoadBalancer 类型的服务只能偶尔访问。这是因为 ServiceLB 和 MetalLB 默认在后台使用 L2 广告。
因此,如果您想将 MetalLB 与 k3s 结合使用,则需要禁用 ServiceLB(如其文档中所述)。如果您的集群已在运行,则可以将标志添加到位于以下
--disable servicelb
位置的 systemd 单元文件中:/etc/systemd/system/k3s.service
您描述的第二个问题对我来说有点难以调试。我怀疑您在尝试创建之前没有等待足够长的时间,
IPAddressPool
但这L2Advertisement
只是基于您metallb-webhook-service
似乎没有任何端点这一事实的猜测。也许您可以分享一些 MetalLB 控制器 pod 的日志?但我会先尝试禁用 ServiceLB,然后重新安装 MetalLB。终于解决了这个问题。首先,我们安装 metallb 本身(要小心,根据版本的不同,配置文件会发生变化)
然后我们运行 IP 地址列表
然后我们一定要检查 IP 地址列表是否已创建
如果发生类似错误
然后运行这个命令,错误之后就不会再有
之后,它会启动类似提供商的服务来服务这些 IP 地址
之后,我们检查他是否已经获取了 IP 地址
完成所有这些后,负载均衡器应该可用(再次提醒您,英语不是我的母语,因此如果有什么不清楚的地方,我深表歉意)