Boa tarde, me deparei com o problema de não ser possível anexar o MetalLB ao K3S, tenho um cluster com 3 masters e 3 workers
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
inicialmente, tentei instalar o MetalLB desta forma
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
configuração
# 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
com essa abordagem o Load Balancer estava funcionando, não estava estável no tap, com 50% de probabilidade era impossível entrar no site. Então descobri que essa é uma abordagem desatualizada. Tentei uma nova
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml
configuração
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
mas recebo um erro
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"
mas o namespace ainda está funcionando corretamente
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
(Peço desculpas antecipadamente, o inglês não é minha língua nativa)
Bem-vindo ao ServerFault 👋
Por padrão, o k3s já inclui um LoadBalancer chamado ServiceLB (anteriormente chamado de Klipper LoadBalacer). Suspeito que ambos estavam sendo executados simultaneamente, o que é conhecido por causar problemas: um deles é que seus serviços do tipo LoadBalancer só podem ser acessados esporadicamente. Isso ocorre porque o ServiceLB e o MetalLB usam anúncios L2 por padrão.
Por isso, você precisará desabilitar o ServiceLB se quiser usar o MetalLB em combinação com o k3s ( conforme descrito na documentação deles ). Se seu cluster já estiver em execução, você pode adicionar o
--disable servicelb
sinalizador ao arquivo de unidade systemd localizado assim/etc/systemd/system/k3s.service
:O segundo problema que você descreveu é um pouco mais difícil de depurar para mim. Suspeito que você não esperou o suficiente antes de tentar criar o
IPAddressPool
andL2Advertisement
mas isso é apenas um palpite baseado no fato de que seumetallb-webhook-service
não parece ter nenhum endpoint. Talvez você possa compartilhar alguns logs do pod do controlador MetalLB? Mas eu tentaria desabilitar o ServiceLB e então reinstalar o MetalLB primeiro.finalmente resolvemos esse problema. primeiro, instalamos o próprio metallb (cuidado, dependendo da versão, o arquivo de configuração pode mudar)
então executamos a lista de endereços IP
então definitivamente verificamos se a lista de endereços IP foi criada
se ocorrer um erro semelhante
então execute este comando, e após o erro não haverá
depois disso, ele lança algo como um provedor para esses endereços IP
depois disso, verificamos se ele sugou os endereços ip
Depois de tudo isso, o Load Balancer deve estar disponível (mais uma vez, lembro que inglês não é minha língua nativa, então se algo não estiver claro, peço desculpas)