概述

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>
<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的其它类型可以查看这篇文章:https://www.cnblogs.com/huangSir-devops/p/18859122

K8s进阶之MetalLB实现LoadBalancer的更多相关文章

  1. K8S LoadBalance 私有环境解决方案 == metallb 工具安装和使用介绍

    接着上文,排除故障后,我重新配置了metallb组件到k8s环境. metallb为k8s service 的loadbalance负载方式提供免费的解决方案. external-ip的收费方案,可以 ...

  2. 【华为云技术分享】跟唐老师学习云网络 : Kubernetes网络实现

    当今K8s独霸天下之时,咱们站在更高的角度,好好的看看K8s网络是以什么理念构筑的.以及一个容器集群的好保姆,是如何分别照顾 南北流量和东西流量的. 一.简单介绍下Kubernetes 略..容器集群 ...

  3. 一文看懂 Kubernetes 服务发现: Service

    Service 简介   K8s 中提供微服务的实体是 Pod,Pod 在创建时 docker engine 会为 pod 分配 ip,"外部"流量通过访问该 ip 获取微服务.但 ...

  4. Kubernetes容器编排探索与实践v1.22.1-上半部分

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  5. 云原生时代之Kubernetes容器编排初步探索及部署、使用实战-v1.22

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  6. kubernetes CKA题库(附答案)

    第一题 RBAC授权问题权重: 4% 设置配置环境:[student@node-1] $ kubectl config use-context k8s Context为部署管道创建一个新的Cluste ...

  7. 2022年Kubernetes CKA 认证真题解析完整版

    第一题 RBAC授权问题权重: 4% 设置配置环境:[student@node-1] $ kubectl config use-context k8s Context为部署管道创建一个新的Cluste ...

  8. k8s 使本地集群支持 LoadBalancer 服务

    k8s 使本地集群支持 LoadBalancer 服务 为了使本地集群支持 LoadBalancer 服务,可以参考以下两种实现方案: keepalived-cloud-provider metalL ...

  9. MetalLB自建私有Kubernetes的LoadBalancer负载均衡类型服务

    简介 在私有网络上运行 Kubernetes,和御三家相比,对 LoadBalancer 类型的服务的支持应该是众多表面差异中最醒目的一个了.类型为 LoadBalancer 的服务在 Kuberne ...

  10. k8s loadbalancer与ingress实践

    k8s可以通过三种方式将集群内服务暴露到外网,分别是NodePort.LoadBalancer.Ingress,其中NodePort作为基础通信形式我们在<k8s网络模型与集群通信>中进行 ...

随机推荐

  1. 函数static的作用

    限制作用域和保持状态 ‌函数static的作用主要体现在限制作用域和保持状态两个方面.‌‌1 限制作用域 ‌静态全局变量‌:在全局变量前加上static关键字,该变量就被定义成为一个静态全局变量.这种 ...

  2. 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?

    你好呀,我是歪歪. 事情是这样的,前几天有一个读者给我发消息,说他面试的时候遇到一个奇形怪状的面试题. 歪师傅纵横面试界多年,最喜欢的是奇形怪状的面试题. 可以说是见过大场面的人,所以让他描述一下具体 ...

  3. Clean WeChat X 微信垃圾清理工具,提升硬盘空间

    Clean WeChat X是一款专业的微信清理工具,其拥有软件轻巧.干净.高效.免费等等特点,其能识别你电脑里的微信缓存.聊天记录.文件备份.小程序等等信息,方便大家选择性的清理文件. 多账号登录: ...

  4. Shell - 脚本案例

    题记部分 一.节点状态监控脚本(nodeStatusCheck.sh) [脚本名称]nodeStatusCheck.sh [监控规则]通过ping的方式监控集群节点状态,检查节点是否失联 [实现方式] ...

  5. 响应式编程之Reactive Streams介绍

    Reactive Streams 是一种用于‌异步流处理的标准化规范,旨在解决传统异步编程中的背压管理.资源消耗及响应速度等问题‌. 一.核心概念 ‌基本模型‌ ‌发布者(Publisher)‌:负责 ...

  6. Alibaba Sentinel SSRF漏洞分析(CVE-2021-44139)

    Alibaba Sentinel SSRF漏洞分析(CVE-2021-44139) 一.Alibaba Sentienl 简介 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel ...

  7. 模型蒸馏(Distillation)案例--从DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏

    DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Distillation) 本文重点进行DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Di ...

  8. C 语言内存布局深度剖析:从栈到堆,你真的了解吗?

    大家好,我是小康. 今天咱们聊点看似复杂实则简单的东西 -- C 语言的内存布局. 别急着翻页!相信我,读完这篇文章,你会拍着大腿说:"原来这么简单!" 微信搜索 「跟着小康学编程 ...

  9. 【Web】前端框架对微软老旧浏览器的支持

    零.原因 最近要做一个项目,要能在学校机房运行的,也要在手机上运行.电脑和手机,一次性开发,那最好的就是响应式前端框架了.手机和正常的电脑兼容性问题应该都不大,但是学校机房都是Win7的系统,自带的都 ...

  10. ASP.NET Core 响应压缩中间件

    使用及对比 在 Startup.cs 中添加服务并使用即可,主代码如下: // Startup.cs public void ConfigureServices(IServiceCollection ...