在 Kubernetes 中使用 MetalLB 实现 LoadBalancer:完整指南

5 阅读2分钟

引言

  • 在公有云 Kubernetes 环境中,创建 LoadBalancer 类型的服务时,云提供商会自动分配一个外部 IP 地址。然而,在本地或裸机 Kubernetes 集群中,这一功能默认不可用。这就是 MetalLB 的用武之地——它是一个裸机 Kubernetes 集群的负载均衡器实现,为集群提供了外部 IP 地址分配和负载均衡功能。

什么是 MetalLB?

  • MetalLB 是一个专为裸机 Kubernetes 集群设计的负载均衡器实现,它通过标准路由协议将外部 IP 地址分配给服务。它解决了在本地环境中无法使用 LoadBalancer 类型服务的问题。
  • MetalLB官网:metallb.universe.tf/installatio…

安装MetalLB

 kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
 ​
 # 或者下载到本地再应用
 kubectl apply -f metallb-native.yaml
 ​
 ​
 #验证安装
 [root@master51 ~]# kubectl get pods -n  metallb-system -o wide
 NAME                          READY   STATUS    RESTARTS   AGE    IP              NODE        NOMINATED NODE   READINESS GATES
 controller-686c7db689-gpf7r   1/1     Running   0          6m5s   10.100.140.95   worker53   <none>           <none>
 speaker-bdvk5                 1/1     Running   0          30s    10.0.0.53      worker53   <none>           <none>
 speaker-xfnch                 1/1     Running   0          30s    10.0.0.52      worker52   <none>           <none>
 speaker-zshn9                 1/1     Running   0          30s    10.0.0.51      master51   <none>           <none>
 [root@master51 ~]# 
 ​

配置MetalLB

 #创建IP地址池配置文件 ipaddresspool.yaml
 apiVersion: metallb.io/v1beta1
 kind: IPAddressPool
 metadata:
   name: shic
   namespace: metallb-system
 spec:
   addresses:
   - 10.0.0.150-10.0.0.180
 
 
 #创建L2宣告配置 l2advertisement.yaml
 apiVersion: metallb.io/v1beta1
 kind: L2Advertisement
 metadata:
   name: metallb-l2-advert
   namespace: metallb-system
 spec:
   ipAddressPools:
   - shic
 
 
 #应用配置
 kubectl apply -f ipaddresspool.yaml
 kubectl apply -f l2advertisement.yaml

使用MetalLB

 #创建pod
 ......
 
 #创建svc-loadbalancer.yaml
 apiVersion: v1
 kind: Service
 metadata:
   name: svc-loadbalancer
 spec:
   selector:
     app: web
   ports:
   - port: 90          #service端口(集群内:clusterIP:90)
     targetPort: 80    #pod端口
     #当type为LoadBalancer时,如果不指定nodePort,K8s会自动分配一个(默认范围30000-32767)
     nodePort: 30080    #节点端口(集群外:nodeIP:30080)
   type: LoadBalancer
   
 
 #查看EXTERNAL-IP地址是否自动分配
 [root@master231 ~]# kubectl get svc
 NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)       AGE
 kubernetes                 ClusterIP      10.200.0.1       <none>        443/TCP       3h25m
 svc-loadbalancer   LoadBalancer   10.200.117.161   10.0.0.150    90:30080/TCP   9m28s
 
 #验证测试
 浏览器访问http://10.0.0.150:90
 或curl http://10.0.0.150:90
 或根据nodePort 访问:http://10.0.0.51:30080  http://10.0.0.52:30080  http://10.0.0.53:30080