概述
LoadBalancer官网文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer
MetalLB官网地址:https://metallb.universe.tf/installation/
MetalLB仓库地址:https://github.com/metallb/metallb
LoadBalancer是实现负载均衡的Service,主要应用场景是云厂商环境,它能够为服务提供外部可访问的 IP 地址。这种类型的服务通过云服务提供商的负载均衡器实现,允许外部流量进入集群中的 Pod。

MetalLB 是一个为 Kubernetes 集群提供负载均衡的开源项目。在裸机环境中,Kubernetes 原生的 LoadBalancer 服务类型无法直接使用,因为云厂商的负载均衡器在裸机环境中不可用。MetalLB 通过实现标准的负载均衡器行为,填补了这一空白。
- 地址分配:MetalLB 可以从预配置的 IP 地址池中分配 IP 地址给 LoadBalancer 类型的服务。
- 负载均衡实现:支持两种主要的负载均衡模式:
- Layer 2 模式:通过 ARP/NDP 协议响应,将流量直接转发到节点。
- BGP 模式:通过边界网关协议与网络设备交换路由信息。
- 健康检查:自动检测节点健康状态,确保流量不会被发送到不可用的节点。
| |
| [root@master01 ~/metalLB] |
| |
| |
| [root@master01 ~/metalLB] |
| |
| |
| [root@master01 ~/metalLB] |
| |
| |
| [root@master01 ~/metalLB] |
| NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES |
| pod/controller-749d99c9bf-89jdj 1/1 Running 1 (83s ago) 6m3s 100.95.185.241 node02 <none> <none> |
| pod/speaker-69stl 4/4 Running 0 11m 10.0.0.31 node01 <none> <none> |
| pod/speaker-lg2fp 4/4 Running 0 11m 10.0.0.30 master01 <none> <none> |
| pod/speaker-xhh4v 4/4 Running 0 11m 10.0.0.32 node02 <none> <none> |
| |
| NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR |
| service/metallb-webhook-service ClusterIP 10.96.3.91 <none> 443/TCP 11m component=controller |
| |
| NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR |
| daemonset.apps/speaker 3 3 3 3 3 kubernetes.io/os=linux 11m frr,reloader,frr-metrics,speaker quay.m.daocloud.io/frrouting/frr:9.1.0,quay.m.daocloud.io/frrouting/frr:9.1.0,quay.m.daocloud.io/frrouting/frr:9.1.0,quay.m.daocloud.io/metallb/speaker:v0.14.9 app=metallb,component=speaker |
| |
| NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR |
| deployment.apps/controller 1/1 1 1 11m controller quay.m.daocloud.io/metallb/controller:v0.14.9 app=metallb,component=controller |
| |
| NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR |
| replicaset.apps/controller-749d99c9bf 1 1 1 11m controller quay.m.daocloud.io/metallb/controller:v0.14.9 app=metallb,component=controller,pod-template-hash=749d99c9bf |
创建地址池配置
| |
| [root@master01 ~/metalLB] |
| apiVersion: metallb.io/v1beta1 |
| kind: IPAddressPool |
| metadata: |
| name: first-pool |
| namespace: metallb-system |
| spec: |
| addresses: |
| |
| - 10.0.0.150-10.0.0.180 |
| |
| |
| [root@master01 ~/metalLB] |
| ipaddresspool.metallb.io/first-pool created |
| |
| |
| |
| [root@master01 ~/metalLB] |
| NAME AUTO ASSIGN AVOID BUGGY IPS ADDRESSES |
| first-pool true false ["10.0.0.150-10.0.0.180"] |
| |
创建L2广告配置
| |
| [root@master01 ~/metalLB] |
| apiVersion: metallb.io/v1beta1 |
| kind: L2Advertisement |
| metadata: |
| name: example |
| |
| namespace: metallb-system |
| spec: |
| ipAddressPools: |
| |
| - first-pool |
| |
| |
| [root@master01 ~/metalLB] |
| l2advertisement.metallb.io/example created |
| |
| |
| [root@master01 ~/metalLB] |
| NAME IPADDRESSPOOLS IPADDRESSPOOL SELECTORS INTERFACES |
| example ["first-pool"] |
| |
创建deploy
| |
| [root@master01 ~/deploy] |
| apiVersion: apps/v1 |
| kind: Deployment |
| metadata: |
| name: deployment-nginx |
| namespace: default |
| spec: |
| |
| replicas: 3 |
| selector: |
| |
| matchLabels: |
| app: nginx |
| template: |
| metadata: |
| name: pod-nginx |
| labels: |
| app: nginx |
| spec: |
| containers: |
| - name: container-nginx |
| image: nginx:1.14.1 |
| restartPolicy: Always |
| |
| |
| [root@master01 ~/deploy] |
| deployment.apps/deployment-nginx created |
| |
| |
| [root@master01 ~/deploy] |
| NAME READY UP-TO-DATE AVAILABLE AGE |
| deployment-nginx 3/3 3 3 108s |
创建LoadBalancer的service
| [root@master01 ~/service] |
| apiVersion: v1 |
| kind: Service |
| metadata: |
| name: loadbalancer-svc |
| spec: |
| |
| type: LoadBalancer |
| selector: |
| app: nginx |
| ports: |
| - port: 80 |
| targetPort: 80 |
| nodePort: 32000 |
| [root@master01 ~/service] |
| service/loadbalancer-svc created |
| |
| [root@master01 ~/service] |
| NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
| loadbalancer-svc LoadBalancer 10.96.0.141 10.0.0.150 80:32000/TCP 19s |
访问测试
在宿主机上进行curl访问
| [root@master01 ~/service]# curl 10.0.0.150:80 |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Welcome to nginx!</title> |
| <style> |
| body { |
| width: 35em; |
| margin: 0 auto; |
| font-family: Tahoma, Verdana, Arial, sans-serif; |
| } |
| </style> |
| </head> |
| <body> |
| <h1>Welcome to nginx!</h1> |
| <p>If you see this page, the nginx web server is successfully installed and |
| working. Further configuration is required.</p> |
| |
| <p>For online documentation and support please refer to |
| <a href="http://nginx.org/">nginx.org</a>.<br/> |
| Commercial support is available at |
| <a href="http://nginx.com/">nginx.com</a>.</p> |
| |
| <p><em>Thank you for using nginx.</em></p> |
| </body> |
| </html> |
通过浏览器访问
http://10.0.0.150/

结尾:想要了解service的其它类型可以查看这篇文章:K8s新手系列之Service资源
原创作者: huangSir-devops 转载于: https://www.cnblogs.com/huangSir-devops/p/18876710