首页/文章列表/文章详情

K8s进阶之MetalLB实现LoadBalancer

编程知识852025-05-16评论

概述

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。
image

MetalLB 是一个为 Kubernetes 集群提供负载均衡的开源项目。在裸机环境中,Kubernetes 原生的 LoadBalancer 服务类型无法直接使用,因为云厂商的负载均衡器在裸机环境中不可用。MetalLB 通过实现标准的负载均衡器行为,填补了这一空白。

MetalLB主要功能

  • 地址分配:MetalLB 可以从预配置的 IP 地址池中分配 IP 地址给 LoadBalancer 类型的服务。
  • 负载均衡实现:支持两种主要的负载均衡模式:
    • Layer 2 模式:通过 ARP/NDP 协议响应,将流量直接转发到节点。
    • BGP 模式:通过边界网关协议与网络设备交换路由信息。
  • 健康检查:自动检测节点健康状态,确保流量不会被发送到不可用的节点。

部署MetalLB

# 下载[root@master01 ~/metalLB]# wget https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-frr.yaml# 配置镜像源,解决镜像拉不下来[root@master01 ~/metalLB]# sed -i s#quay.io#quay.m.daocloud.io#g metallb-frr.yaml# 应用资源文件[root@master01 ~/metalLB]# kubectl apply -f metallb-frr.yaml# 检查各种资源的启动状态[root@master01 ~/metalLB]# kubectl get all -o wide -n metallb-systemNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod/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 SELECTORservice/metallb-webhook-service ClusterIP 10.96.3.91 <none> 443/TCP 11m component=controllerNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTORdaemonset.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=speakerNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORdeployment.apps/controller 1/1 1 1 11m controller quay.m.daocloud.io/metallb/controller:v0.14.9 app=metallb,component=controllerNAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTORreplicaset.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]# cat ippool.yamlapiVersion: metallb.io/v1beta1kind: IPAddressPoolmetadata: name: first-pool namespace: metallb-systemspec: addresses: # 注意改为你自己为MetalLB分配的IP地址 - 10.0.0.150-10.0.0.180# 创建地址池[root@master01 ~/metalLB]# kubectl apply -f ippool.yamlipaddresspool.metallb.io/first-pool created# 检查配置[root@master01 ~/metalLB]# kubectl get IPAddressPool -n metallb-systemNAME AUTO ASSIGN AVOID BUGGY IPS ADDRESSESfirst-pool true false ["10.0.0.150-10.0.0.180"]

创建L2广告配置

# 定义资源文件[root@master01 ~/metalLB]# cat l2.yamlapiVersion: metallb.io/v1beta1kind: L2Advertisementmetadata: name: example # 注意名称空间 namespace: metallb-systemspec: ipAddressPools: # 地址池的名称 - first-pool# 创建l2广告配置[root@master01 ~/metalLB]# kubectl apply -f l2.yamll2advertisement.metallb.io/example created# 获取l2的配置[root@master01 ~/metalLB]# kubectl get L2Advertisement -n metallb-systemNAME IPADDRESSPOOLS IPADDRESSPOOL SELECTORS INTERFACESexample ["first-pool"]

创建deploy

# 定义资源清单[root@master01 ~/deploy]# cat deploy-nginx.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: deployment-nginx namespace: defaultspec: # 设置Pod的副本数量 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# 创建deploy[root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yamldeployment.apps/deployment-nginx created# 检查是否启动[root@master01 ~/deploy]# kubectl get deployNAME READY UP-TO-DATE AVAILABLE AGEdeployment-nginx 3/3 3 3 108s

创建LoadBalancer的service

[root@master01 ~/service]# cat service-loadbanlacer.yamlapiVersion: v1kind: Servicemetadata: name: loadbalancer-svcspec: # 指定svc的类型为LoadBalancer type: LoadBalancer selector: app: nginx ports: - port: 80 targetPort: 80 nodePort: 32000[root@master01 ~/service]# kubectl apply -f service-loadbanlacer.yamlservice/loadbalancer-svc created# 注意EXTERNAL-IP这一列,IP地址会在MetalLB分配的IP地址范围之内[root@master01 ~/service]# kubectl get svc loadbalancer-svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEloadbalancer-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 andworking. 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/
image

结尾:想要了解service的其它类型可以查看这篇文章:https://www.cnblogs.com/huangSir-devops/p/18859122

神弓

huangSir-devops

这个人很懒...

用户评论 (0)

发表评论

captcha