裸金属 MetalLB 企业入口 Hands-on

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
API Application Programming Interface 应用程序编程接口
ARP Address Resolution Protocol 地址解析协议
BGP Border Gateway Protocol 边界网关协议
DHCP Dynamic Host Configuration Protocol 动态主机配置协议
DNS Domain Name System 域名系统
eBPF extended Berkeley Packet Filter 扩展 BPF,用于内核可编程观测等场景
ECMP Equal-Cost Multi-Path 等价多路径路由
HA High Availability 高可用
IP Internet Protocol 网际协议;IP 地址是网络寻址标识
IPAM IP Address Management IP 地址管理
IPVS IP Virtual Server Linux IP 虚拟服务器负载均衡机制
L2 Layer 2 网络第二层,数据链路层
LB Load Balancer 负载均衡器
NDP Neighbor Discovery Protocol IPv6 邻居发现协议
PDB Pod Disruption Budget Pod 中断预算,约束自愿驱逐
PSA Pod Security Admission Kubernetes Pod 安全准入
TLS Transport Layer Security 传输层安全协议
VIP Virtual IP address 虚拟 IP 地址

前置:自建 HA 集群、经过网络团队保留的同二层 VIP 地址池、交换机允许 ARP/NDP;示例采用 IPv4 L2。MetalLB 不是云 LB、防火墙或 TLS Gateway。L2 模式每个 VIP 由一个节点宣告,有单节点带宽上限;大规模/跨二层场景评估 BGP/ECMP。

1. 确认没有第二个地址宣告者#

kubectl get ds,deploy -A
kubectl -n kube-system get configmap kube-proxy -o yaml
kubectl get svc -A --field-selector spec.type=LoadBalancer

IPVS kube-proxy 需 strictARP=true,修改后按受控流程滚动 kube-proxy;iptables/eBPF 按实际实现核对,不盲改。若 Cilium 已管理 LB IPAM/L2/BGP,不能让 MetalLB 宣告相同池。VIP 排除 DHCP、节点地址、API VIP和其他设备。

2. 固定版本安装#

export METALLB_CHART_VERSION='REPLACE_CHART_VERSION'
helm repo add metallb https://metallb.github.io/metallb
helm repo update
helm show values metallb/metallb --version "$METALLB_CHART_VERSION" > metallb-defaults.yaml
helm template metallb metallb/metallb --version "$METALLB_CHART_VERSION" -n metallb-system > metallb-rendered.yaml
# 审阅 controller/speaker 镜像、RBAC、hostNetwork/权限、资源和调度。
helm upgrade --install metallb metallb/metallb --version "$METALLB_CHART_VERSION" -n metallb-system --create-namespace --wait --timeout 10m
kubectl -n metallb-system get pods -o wide

speaker 需要系统级网络能力,PSA 例外只给本 namespace。按所选版本配置 PDB/资源和 speaker 节点范围;成员通信端口与网络策略一并放行。

3. 绑定地址池与真实业务#

保存 metallb-pool.yaml,示例地址必须替换为已保留的实际网段:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata: {name: enterprise-vips, namespace: metallb-system}
spec:
  autoAssign: false
  addresses: [192.0.2.240-192.0.2.250]
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata: {name: enterprise-vips, namespace: metallb-system}
spec:
  ipAddressPools: [enterprise-vips]
kubectl apply -f metallb-pool.yaml

验证先创建仅内网可达的真实 API Service,保存 internal-api.yaml:

apiVersion: v1
kind: Service
metadata:
  name: orders-l2-check
  namespace: orders
  annotations: {metallb.io/address-pool: enterprise-vips}
spec:
  type: LoadBalancer
  externalTrafficPolicy: Cluster
  selector: {app.kubernetes.io/name: orders-api}
  ports: [{name: http, port: 80, targetPort: http}]
kubectl apply -f internal-api.yaml
kubectl -n orders get svc orders-l2-check -w

只允许受控测试网段访问此明文诊断入口,不发布 DNS;正式入口给 Gateway 数据面 的 Service 绑定地址池并终止 TLS。MetalLB 不执行所有云平台的 loadBalancerSourceRanges 防火墙语义,限制在网络防火墙/数据面落实。

4. 故障验收#

从集群外同网络测试 VIP,持续业务请求;记录当前宣告节点,通过受控节点维护使该节点退出宣告,验证新节点接管、ARP 缓存收敛时间、连接中断与恢复。不要在远程无带外入口时断网。externalTrafficPolicy: Local 可保留客户端 IP,但只宣告有本地就绪端点的节点,需额外验证副本分布。

失败恢复原 speaker/网络配置和 Gateway 入口;不把同 VIP 同时手工配置到两台主机。删除 orders-l2-check 回收测试地址;正式 Service 仍引用池时不能删除 IPAddressPool。

参考:安装、配置、L2 行为。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭