概述
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
- # 下载
- [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>
- </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 target="_blank" href="http://nginx.org/">nginx.org</a>.<br/>
- Commercial support is available at
- <a target="_blank" 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资源
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |