手把手教你用MetalLB给K8s里的MinIO集群配个固定IP(附访问测试)

张开发
2026/4/13 6:47:10 15 分钟阅读

分享文章

手把手教你用MetalLB给K8s里的MinIO集群配个固定IP(附访问测试)
手把手教你用MetalLB给K8s里的MinIO集群配个固定IP附访问测试在私有化部署MinIO集群时最让人头疼的问题莫过于如何稳定暴露服务。不同于公有云环境一键配置负载均衡的便捷本地K8s集群往往需要自建解决方案。我曾在一个金融项目上因为NodePort端口频繁变更导致客户端连接异常最终选择MetalLB作为网络出口的守门人。1. 为什么需要MetalLB当你在裸金属服务器或虚拟机环境部署Kubernetes时Service类型选择LoadBalancer通常会卡在Pending状态——因为集群缺少云厂商提供的负载均衡器。这时MetalLB的价值就凸显出来了它通过两种模式解决这个问题Layer2模式通过ARP/NDP协议宣告IP地址适合大多数本地网络环境BGP模式与物理网络设备建立BGP会话适合大型网络架构关键对比特性MetalLB方案NodePort方案Ingress方案访问稳定性⭐⭐⭐⭐⭐固定IP⭐⭐依赖节点IP⭐⭐⭐需域名配置复杂度⭐⭐需额外部署⭐原生支持⭐⭐⭐需控制器协议支持TCP/UDP全支持TCP/UDP全支持主要HTTP/HTTPS适用场景生产环境测试环境Web服务暴露提示如果只是临时测试NodePort确实更简单。但生产环境中频繁变动的端口和节点IP会让运维工作变成噩梦。2. MetalLB部署实战2.1 前置条件检查在开始之前请确保你的K8s集群满足网络插件兼容性Calico需特殊配置预留的IP地址池建议至少5个连续IPKubernetes版本≥1.13检查CNI插件兼容性kubectl get pods -n kube-system | grep -E flannel|calico|cilium2.2 安装MetalLB使用官方manifest快速部署kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml等待所有Pod就绪watch kubectl get pods -n metallb-system2.3 配置IP地址池创建地址池配置文件ip-pool.yamlapiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.168.1.100-192.168.1.105 autoAssign: true apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2-advert namespace: metallb-system spec: ipAddressPools: - first-pool应用配置kubectl apply -f ip-pool.yaml注意地址池范围不要与现有DHCP范围重叠否则会导致IP冲突3. MinIO服务暴露方案3.1 创建LoadBalancer服务典型的MinIO服务配置minio-svc.yamlapiVersion: v1 kind: Service metadata: name: minio-external namespace: minio annotations: metallb.universe.tf/loadBalancerIPs: 192.168.1.100 # 指定静态IP spec: type: LoadBalancer ports: - name: api port: 9000 targetPort: 9000 - name: console port: 9001 targetPort: 9001 selector: app: minio sessionAffinity: ClientIP关键参数说明sessionAffinity: 保持客户端会话一致性loadBalancerIPs: 固定IP避免客户端配置变更3.2 验证服务状态检查服务分配情况kubectl get svc -n minio minio-external预期输出NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE minio-external LoadBalancer 10.96.45.12 192.168.1.100 9000:30789/TCP,9001:31002/TCP 2m3.3 网络连通性测试从集群外部执行基础测试# 测试API端口 telnet 192.168.1.100 9000 # 测试控制台端口 curl -I http://192.168.1.100:9001/minio/health/live4. 客户端访问实践4.1 安装mc客户端Linux系统安装命令wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc chmod x /usr/local/bin/mc4.2 配置访问别名设置永久访问别名mc alias set myminio http://192.168.1.100:9000 minioadmin minioadmin123验证连接mc admin info myminio4.3 文件操作测试上传下载测试流程# 创建测试桶 mc mb myminio/test-bucket # 上传文件 echo Hello MetalLB test.txt mc cp test.txt myminio/test-bucket/ # 下载文件 mc cp myminio/test-bucket/test.txt ./downloaded.txt # 校验文件 md5sum test.txt downloaded.txt5. 高级配置技巧5.1 多协议支持如果需要同时暴露HTTP和HTTPSports: - name: https-api port: 9443 targetPort: 9000 protocol: TCP5.2 健康检查优化自定义探针配置livenessProbe: httpGet: path: /minio/health/live port: 9000 initialDelaySeconds: 30 periodSeconds: 155.3 流量控制限制节点流量分配metadata: annotations: metallb.universe.tf/allow-shared-ip: false在金融行业项目中我们最终采用MetalLBKeepalived的方案实现高可用将服务中断时间控制在秒级。实际压测显示单个MetalLB实例可稳定处理10Gbps级别的流量完全满足MinIO集群的性能需求。

更多文章