悠然此心 發表於 2025-5-16 22:31:00

K8s进阶之MetalLB实现LoadBalancer

<h2 id="概述">概述</h2>
<p>LoadBalancer官网文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer<br>
MetalLB官网地址:https://metallb.universe.tf/installation/<br>
MetalLB仓库地址:https://github.com/metallb/metallb</p>
<p>LoadBalancer是实现负载均衡的Service,主要应用场景是云厂商环境,它能够为服务提供外部可访问的 IP 地址。这种类型的服务通过云服务提供商的负载均衡器实现,允许外部流量进入集群中的 Pod。<br>
<img src="https://img2024.cnblogs.com/blog/3468887/202505/3468887-20250514212024308-747651103.png" alt="image" loading="lazy"></p>
<p>MetalLB 是一个为 Kubernetes 集群提供负载均衡的开源项目。在裸机环境中,Kubernetes 原生的 LoadBalancer 服务类型无法直接使用,因为云厂商的负载均衡器在裸机环境中不可用。MetalLB 通过实现标准的负载均衡器行为,填补了这一空白。</p>
<h2 id="metallb主要功能">MetalLB主要功能</h2>
<ul>
<li>地址分配:MetalLB 可以从预配置的 IP 地址池中分配 IP 地址给 LoadBalancer 类型的服务。</li>
<li>负载均衡实现:支持两种主要的负载均衡模式:
<ul>
<li>Layer 2 模式:通过 ARP/NDP 协议响应,将流量直接转发到节点。</li>
<li>BGP 模式:通过边界网关协议与网络设备交换路由信息。</li>
</ul>
</li>
<li>健康检查:自动检测节点健康状态,确保流量不会被发送到不可用的节点。</li>
</ul>
<h2 id="部署metallb">部署MetalLB</h2>
<pre><code># 下载
# wget https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-frr.yaml

# 配置镜像源,解决镜像拉不下来
# sed -i s#quay.io#quay.m.daocloud.io#g metallb-frr.yaml

# 应用资源文件
# kubectl apply -f metallb-frr.yaml

# 检查各种资源的启动状态
# 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   &lt;none&gt;         &lt;none&gt;
pod/speaker-69stl               4/4   Running   0             11m    10.0.0.31      node01   &lt;none&gt;         &lt;none&gt;
pod/speaker-lg2fp               4/4   Running   0             11m    10.0.0.30      master01   &lt;none&gt;         &lt;none&gt;
pod/speaker-xhh4v               4/4   Running   0             11m    10.0.0.32      node02   &lt;none&gt;         &lt;none&gt;

NAME                              TYPE      CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/metallb-webhook-service   ClusterIP   10.96.3.91   &lt;none&gt;      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
</code></pre>
<h3 id="创建地址池配置">创建地址池配置</h3>
<pre><code># 定义清单文件
# 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

# 创建地址池
# kubectl apply -f ippool.yaml
ipaddresspool.metallb.io/first-pool created


# 检查配置
# 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"]

</code></pre>
<h3 id="创建l2广告配置">创建L2广告配置</h3>
<pre><code># 定义资源文件
# cat l2.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
# 注意名称空间
namespace: metallb-system
spec:
ipAddressPools:
# 地址池的名称
- first-pool

# 创建l2广告配置
# kubectl apply -f l2.yaml
l2advertisement.metallb.io/example created

# 获取l2的配置
# kubectl get L2Advertisement -n metallb-system
NAME      IPADDRESSPOOLS   IPADDRESSPOOL SELECTORS   INTERFACES
example   ["first-pool"]

</code></pre>
<h2 id="创建deploy">创建deploy</h2>
<pre><code># 定义资源清单
# 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
# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx created

# 检查是否启动
# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
deployment-nginx   3/3   3            3         108s
</code></pre>
<h2 id="创建loadbalancer的service">创建LoadBalancer的service</h2>
<pre><code># 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
# kubectl apply -f service-loadbanlacer.yaml
service/loadbalancer-svc created
# 注意EXTERNAL-IP这一列,IP地址会在MetalLB分配的IP地址范围之内
# 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
</code></pre>
<h2 id="访问测试">访问测试</h2>
<h3 id="在宿主机上进行curl访问">在宿主机上进行curl访问</h3>
<pre><code># curl 10.0.0.150:80
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
&lt;style&gt;
    body {
      width: 35em;
      margin: 0 auto;
      font-family: Tahoma, Verdana, Arial, sans-serif;
    }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;
&lt;p&gt;If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&lt;/p&gt;

&lt;p&gt;For online documentation and support please refer to
&lt;a href="http://nginx.org/"&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;
Commercial support is available at
&lt;a href="http://nginx.com/"&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h3 id="通过浏览器访问">通过浏览器访问</h3>
<p>http://10.0.0.150/<br>
<img src="https://img2024.cnblogs.com/blog/3468887/202505/3468887-20250516222933048-1584935583.png" alt="image" loading="lazy"></p>
<p>结尾:想要了解service的其它类型可以查看这篇文章:K8s新手系列之Service资源</p>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18876710,微信Vac6666666,欢迎交流</p><br><br>
来源:https://www.cnblogs.com/huangSir-devops/p/18876710
頁: [1]
查看完整版本: K8s进阶之MetalLB实现LoadBalancer