#MetalLB
- 注意
- L2 使用 ARP/NDP - 配置简单
- 会监听所有网卡
- 流量只会到 一个节点 不是真正的负载均衡
- 实现了 failover 机制 - 旧的 leader 有 10s 的租约
- BGP - 配置相对复杂
- 每个节点于网络路由器建立 BGP 会话
- 如果路由配置了多路支持 - 那么配合 metallb 宣告的地址则能实现 真正的负载均衡 - 而不只是使用一个作为 下一跳/nexthop
- 网络变化时会有一瞬间的中断
- 一般使用基于 hash 的负载均衡 - 部分场景下会有问题
- MetalLB 安装后如果不配置也是没有开始工作的
metallb-system/controller
deployment 处理 IP 分发metallb-system/speaker
daemonset 在每个节点上响应路由
kubectl apply -f https://raw.githubusercontent.com/danderson/metallb/$(curl -s https://api.github.com/repos/danderson/metallb/releases/latest | jq -r .tag_name)/manifests/metallb.yaml
arping -I eth0 192.168.10.1
tcpdump -n -i eth0 arp src host 192.168.1.240
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250
- 192.168.144.0/20
#BGP
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
peers:
- peer-address: 10.0.0.1
peer-asn: 64501
my-asn: 64500
address-pools:
- name: default
protocol: bgp
addresses:
- 192.168.10.0/24
#服务特殊配置
apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
metallb.universe.tf/address-pool: production-public-ips
metallb.universe.tf/allow-shared-ip: true
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
#FAQ
#修改 IP 地址池
kubectl get svc
kubectl -n metallb-system delete cm config
kubectl apply -f new.yml
kubectl -n metallb-system delete pod --all
kubectl -n metallb-system get pods -w
kubectl get svc