K8s进阶之MetalLB实现LoadBalancer

打印 上一主题 下一主题

主题 1910|帖子 1910|积分 5730

概述

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主要功能


  • 地址分配:MetalLB 可以从预配置的 IP 地址池中分配 IP 地址给 LoadBalancer 类型的服务。
  • 负载均衡实现:支持两种主要的负载均衡模式:

    • Layer 2 模式:通过 ARP/NDP 协议响应,将流量直接转发到节点。
    • BGP 模式:通过边界网关协议与网络设备交换路由信息。

  • 健康检查:自动检测节点健康状态,确保流量不会被发送到不可用的节点。
摆设MetalLB
  1. # 下载
  2. [root@master01 ~/metalLB]# wget https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-frr.yaml
  3. # 配置镜像源,解决镜像拉不下来
  4. [root@master01 ~/metalLB]# sed -i s#quay.io#quay.m.daocloud.io#g metallb-frr.yaml
  5. # 应用资源文件
  6. [root@master01 ~/metalLB]# kubectl apply -f metallb-frr.yaml
  7. # 检查各种资源的启动状态
  8. [root@master01 ~/metalLB]# kubectl get all -o wide -n metallb-system
  9. NAME                              READY   STATUS    RESTARTS      AGE    IP               NODE       NOMINATED NODE   READINESS GATES
  10. pod/controller-749d99c9bf-89jdj   1/1     Running   1 (83s ago)   6m3s   100.95.185.241   node02     <none>           <none>
  11. pod/speaker-69stl                 4/4     Running   0             11m    10.0.0.31        node01     <none>           <none>
  12. pod/speaker-lg2fp                 4/4     Running   0             11m    10.0.0.30        master01   <none>           <none>
  13. pod/speaker-xhh4v                 4/4     Running   0             11m    10.0.0.32        node02     <none>           <none>
  14. NAME                              TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
  15. service/metallb-webhook-service   ClusterIP   10.96.3.91   <none>        443/TCP   11m   component=controller
  16. NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE   CONTAINERS                         IMAGES                                                                                                                                                            SELECTOR
  17. 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
  18. NAME                         READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                          SELECTOR
  19. deployment.apps/controller   1/1     1            1           11m   controller   quay.m.daocloud.io/metallb/controller:v0.14.9   app=metallb,component=controller
  20. NAME                                    DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                                          SELECTOR
  21. 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
复制代码
创建地址池配置
  1. # 定义清单文件
  2. [root@master01 ~/metalLB]# cat ippool.yaml
  3. apiVersion: metallb.io/v1beta1
  4. kind: IPAddressPool
  5. metadata:
  6.   name: first-pool
  7.   namespace: metallb-system
  8. spec:
  9.   addresses:
  10.   # 注意改为你自己为MetalLB分配的IP地址
  11.   - 10.0.0.150-10.0.0.180
  12. # 创建地址池
  13. [root@master01 ~/metalLB]# kubectl apply -f ippool.yaml
  14. ipaddresspool.metallb.io/first-pool created
  15. # 检查配置
  16. [root@master01 ~/metalLB]# kubectl get IPAddressPool -n metallb-system
  17. NAME         AUTO ASSIGN   AVOID BUGGY IPS   ADDRESSES
  18. first-pool   true          false             ["10.0.0.150-10.0.0.180"]
复制代码
创建L2广告配置
  1. # 定义资源文件
  2. [root@master01 ~/metalLB]# cat l2.yaml
  3. apiVersion: metallb.io/v1beta1
  4. kind: L2Advertisement
  5. metadata:
  6.   name: example
  7.   # 注意名称空间
  8.   namespace: metallb-system
  9. spec:
  10.   ipAddressPools:
  11.   # 地址池的名称
  12.   - first-pool
  13. # 创建l2广告配置
  14. [root@master01 ~/metalLB]# kubectl apply -f l2.yaml
  15. l2advertisement.metallb.io/example created
  16. # 获取l2的配置
  17. [root@master01 ~/metalLB]# kubectl get L2Advertisement -n metallb-system
  18. NAME      IPADDRESSPOOLS   IPADDRESSPOOL SELECTORS   INTERFACES
  19. example   ["first-pool"]
复制代码
创建deploy
  1. # 定义资源清单
  2. [root@master01 ~/deploy]# cat deploy-nginx.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6.   name: deployment-nginx
  7.   namespace: default
  8. spec:
  9.   # 设置Pod的副本数量
  10.   replicas: 3
  11.   selector:
  12.     # 标签匹配规则
  13.     matchLabels:
  14.       app: nginx
  15.   template:
  16.     metadata:
  17.       name: pod-nginx
  18.       labels:
  19.         app: nginx
  20.     spec:
  21.       containers:
  22.       - name: container-nginx
  23.         image: nginx:1.14.1
  24.       restartPolicy: Always
  25. # 创建deploy
  26. [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
  27. deployment.apps/deployment-nginx created
  28. # 检查是否启动
  29. [root@master01 ~/deploy]# kubectl get deploy
  30. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  31. deployment-nginx   3/3     3            3           108s
复制代码
创建LoadBalancer的service
  1. [root@master01 ~/service]# cat service-loadbanlacer.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: loadbalancer-svc
  6. spec:
  7.   # 指定svc的类型为LoadBalancer
  8.   type: LoadBalancer
  9.   selector:
  10.     app: nginx
  11.   ports:
  12.   - port: 80
  13.     targetPort: 80
  14.     nodePort: 32000
  15. [root@master01 ~/service]# kubectl apply -f service-loadbanlacer.yaml
  16. service/loadbalancer-svc created
  17. # 注意EXTERNAL-IP这一列,IP地址会在MetalLB分配的IP地址范围之内
  18. [root@master01 ~/service]# kubectl get svc loadbalancer-svc
  19. NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
  20. loadbalancer-svc   LoadBalancer   10.96.0.141   10.0.0.150    80:32000/TCP   19s
复制代码
访问测试

在宿主机上举行curl访问
  1. [root@master01 ~/service]# curl 10.0.0.150:80
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Welcome to nginx!</title>
  6. </head>
  7. <body>
  8. <h1>Welcome to nginx!</h1>
  9. <p>If you see this page, the nginx web server is successfully installed and
  10. working. Further configuration is required.</p>
  11. <p>For online documentation and support please refer to
  12. <a target="_blank" href="http://nginx.org/">nginx.org</a>.<br/>
  13. Commercial support is available at
  14. <a target="_blank" href="http://nginx.com/">nginx.com</a>.</p>
  15. <p><em>Thank you for using nginx.</em></p>
  16. </body>
  17. </html>
复制代码
通过浏览器访问

http://10.0.0.150/

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表