K8s进阶之MetalLB实现LoadBalancer

概述

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。
K8s进阶之MetalLB实现LoadBalancer

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-system 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]# cat ippool.yaml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata:   name: first-pool   namespace: metallb-system spec:   addresses:   # 注意改为你自己为MetalLB分配的IP地址   - 10.0.0.150-10.0.0.180  # 创建地址池 [root@master01 ~/metalLB]# kubectl apply -f ippool.yaml ipaddresspool.metallb.io/first-pool created   # 检查配置 [root@master01 ~/metalLB]# kubectl get IPAddressPool -n metallb-system NAME         AUTO ASSIGN   AVOID BUGGY IPS   ADDRESSES first-pool   true          false             ["10.0.0.150-10.0.0.180"]  

创建L2广告配置

# 定义资源文件 [root@master01 ~/metalLB]# cat l2.yaml apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata:   name: example   # 注意名称空间   namespace: metallb-system spec:   ipAddressPools:   # 地址池的名称   - first-pool  # 创建l2广告配置 [root@master01 ~/metalLB]# kubectl apply -f l2.yaml l2advertisement.metallb.io/example created  # 获取l2的配置 [root@master01 ~/metalLB]# kubectl get L2Advertisement -n metallb-system NAME      IPADDRESSPOOLS   IPADDRESSPOOL SELECTORS   INTERFACES example   ["first-pool"]  

创建deploy

# 定义资源清单 [root@master01 ~/deploy]# cat deploy-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata:   name: deployment-nginx   namespace: default spec:   # 设置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.yaml deployment.apps/deployment-nginx created  # 检查是否启动 [root@master01 ~/deploy]# kubectl get deploy NAME               READY   UP-TO-DATE   AVAILABLE   AGE deployment-nginx   3/3     3            3           108s 

创建LoadBalancer的service

[root@master01 ~/service]# cat service-loadbanlacer.yaml apiVersion: v1 kind: Service metadata:   name: loadbalancer-svc spec:   # 指定svc的类型为LoadBalancer   type: LoadBalancer   selector:     app: nginx   ports:   - port: 80     targetPort: 80     nodePort: 32000 [root@master01 ~/service]# kubectl apply -f service-loadbanlacer.yaml service/loadbalancer-svc created # 注意EXTERNAL-IP这一列,IP地址会在MetalLB分配的IP地址范围之内 [root@master01 ~/service]# kubectl get svc loadbalancer-svc 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/
K8s进阶之MetalLB实现LoadBalancer

结尾:想要了解service的其它类型可以查看这篇文章:K8s新手系列之Service资源

发表评论

评论已关闭。

相关文章