裸金属 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=LoadBalancerIPVS 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 widespeaker 需要系统级网络能力,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。