首页 > 其他分享 >MetalLB的应用

MetalLB的应用

时间:2024-02-18 18:11:55浏览次数:23  
标签:MetalLB metallb nginx IP yaml 应用 kubectl

1.概述

MetalLB 是一个用于 Kubernetes 的负载均衡器实现,使得你可以在没有外部负载均衡器硬件(例如,在裸机集群上)的情况下使用标准的负载均衡服务。它为你的 Kubernetes 集群提供了一种创建在本地网络上可访问的 LoadBalancer 类型的服务的方法。

MetalLB 主要有两种工作模式:

  1. Layer 2 模式:在这个模式下,MetalLB 响应 ARP 请求,为服务分配的 IP 地址映射到集群中的一个节点。当服务的 IP 地址收到流量时,这个节点就会接收流量并对其进行路由到正确的服务。

  2. BGP 模式:在 BGP(Border Gateway Protocol)模式下,MetalLB 与集群外部的路由器通过 BGP 协议对话,动态地宣告服务 IP 地址的位置。这使得流量可以直接路由到提供服务的节点,而不是通过一个中间节点。

1.1.限制条件

安装 MetalLB 很简单,不过还是有一些限制:

  • 1)需要 Kubernetes v1.13.0 或者更新的版本

  • 2)集群中的 CNI 要能兼容 MetalLB,具体兼容性参考这里network-addons(本地使用Calico)

    • 像常见的 Flannel、Cilium 等都是兼容的,Calico 的话大部分情况都兼容,BGP 模式下需要额外处理

  • 3)提供一下 IPv4 地址给 MetalLB 用于分配

    • 一般在内网使用,提供同一网段的地址即可。

  • 4)BGP 模式下需要路由器支持 BGP

  • 5)L2 模式下需要各个节点间 7946 端口联通

看起来限制比较多,实际上这些都比较容器满足,除了第四条。

注:因为 BGP 对路由器有要求,因此建议测试时使用 Layer2 模式

2.安装 MetalLB

部署 MetalLB 到 Kubernetes 集群的大致步骤如下:

2.1.修改kube-proxy

如果 kube-proxy 使用的是 ipvs 模式,需要修改 kube-proxy 配置文件,启用严格的 ARP

# https://metallb.universe.tf/installation/#preparation
kubectl edit configmap -n kube-system kube-proxy
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true

2.2.使用 yaml 安装

首先,你需要应用 MetalLB 的清单来安装它。你可以用 kubectl 应用其官方清单文件:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.3/config/manifests/metallb-native.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.3/config/manifests/metallb-frr.yaml

这些命令会创建一个名为 metallb-system 的命名空间,并在这个命名空间中部署 MetalLB 所需的组件。

查看资源创建:

kubectl get  all -n  metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-6dbc8c8797-4xdcd   1/1     Running   0          4m15s
pod/speaker-2g58x                 4/4     Running   0          3m46s
pod/speaker-697n6                 4/4     Running   0          3m54s
pod/speaker-x5n2g                 4/4     Running   0          3m51s

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/webhook-service   ClusterIP   10.102.86.213   <none>        443/TCP   5m56s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   3         3         3       3            3           kubernetes.io/os=linux   5m56s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           5m56s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-6dbc8c8797   1         1         1       4m15s
replicaset.apps/controller-7d678cf54    0         0         0       5m56s

2.3.Layer 2 模式配置

2.3.1创建 IPAdressPool

这个 IPAddressPool 指定了 MetalLB 控制的 IP 地址池。在这个例子中,我们指定了 192.168.1.240 到 192.168.1.255 的地址范围。你需要根据自己的网络环境调整这些值。

mkdir -p ~/metalLb  && cd ~/metalLb
cat <<EOF > IPAddressPool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  # 可分配的 IP 地址,可以指定多个,包括 ipv4、ipv6
  - 192.168.1.240/28
EOF
kubectl apply -f IPAddressPool.yaml

2.3.2创建 L2Advertisement,并关联 IPAdressPool

如果不设置关联到 IPAdressPool,那默认 L2Advertisement 会关联上所有可用的 IPAdressPool

cat <<EOF > L2Advertisement.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool #上一步创建的 ip 地址池,通过名字进行关联
EOF

kubectl apply -f L2Advertisement.yaml

3.测试

创建一个 nginx deploy 以及一个 loadbalance 类型的 svc 来测试。

使用以下命令创建 nginx deploy:

cat <<EOF > nginx-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/nginx:latest
        ports:
        - containerPort: 80
EOF

kubectl apply -f nginx-dp.yaml

使用以下命令创建 nginx-svc:

cat <<EOF > nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx2
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: nginx-port
    protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
EOF

kubectl apply -f nginx-svc.yaml

然后查看 svc,看看是不是真的分配了 ExternalIP

kubectl get svc nginx2
NAME     TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
nginx2   LoadBalancer   10.111.75.160   192.168.1.240   80:32083/TCP   51s

telnet 192.168.1.240 80
Trying 192.168.1.240...
Connected to 192.168.1.240.
Escape character is '^]'.

当你创建这样的服务时,MetalLB 会为该服务分配一个外部 IP 地址,这个地址来自你在 IPAddressPool 中定义的地址池。

注意事项:

  • MetalLB 的 Layer 2 模式不能跨多个物理网络传递流量。

  • MetalLB 不会在主节点上分配 IP 地址,除非你特别配置它这样做。

  • 确保你的网络环境和安全策略允许使用 MetalLB 分配的 IP 地址。

  • MetalLB 需要对应的网络权限来广播信息,所以需要确保在你的集群网络策略中合理配置。

在部署和配置 MetalLB 时,请参考官方文档以获得最新的安装步骤和最佳实践。

参考文档:

标签:MetalLB,metallb,nginx,IP,yaml,应用,kubectl
From: https://www.cnblogs.com/-k8s/p/18019734

相关文章

  • 振弦采集仪在桥梁安全监测中的应用研究
    河北稳控科技振弦采集仪在桥梁安全监测中的应用研究振弦采集仪是一种常用的测量设备,用于桥梁安全监测中的应用研究。通过采集桥梁主梁上的振弦数据,可以对桥梁的结构健康状况进行监测和评估。振弦采集仪通过安装在桥梁主梁上的振弦传感器,实时采集桥梁的振动数据。振弦传感器可以......
  • 分布式缓存应用:Memcache 或 Redis
    为什么要使用分布式缓存高并发环境下,例如典型的淘宝双11秒杀,几分钟内上亿的用户涌入淘宝,这个时候如果访问不加拦截,让大量的读写请求涌向数据库,由于磁盘的处理速度与内存显然不在一个量级,服务器马上就要宕机。缓存可以将经常读取的数据存储在快速的内存中,从而避免了频繁访问慢速......
  • 鸿蒙应用开发工程师招聘多吗?工资有多少呢?
    随着鸿蒙操作系统的快速普及,越来越多的企业开始重视鸿蒙应用开发人才的培养和引进。那么,目前市场上鸿蒙应用开发工程师招聘多吗?工资有多少呢?首先,我们来了解一下鸿蒙应用开发工程师的招聘情况。随着鸿蒙操作系统的广泛应用,越来越多的企业开始意识到鸿蒙应用开发的重要性,纷纷加大招......
  • 【Java 并发】【应用】经典的生产者、消费者
    1  前言闲来无事,复习复习并发中常用到的一些协调多线程的工具哈。2 基于Java队列的实现生产者跟消费者之间要协调,他俩会出现碰撞的地方就是存放东西的容器,所以我们可以直接拿一个线程安全的队列来做容器即可,比如我这里用的ArrayBlockingQueue:/***@author:xjx*@d......
  • 在WSL2中构建龙芯MIPS编译环境并编译应用软件
    因为各种原因,一台搭载了龙芯3A4000处理器的台式电脑将成为我未来半年的日常工作机。由于只能连接单位内网,这台电脑甚至无缘于本就乏善可陈的官方软件源,寥寥几款随机附带的软件就是它的全部,连浏览器都是没有账号密码记录功能的阉割版,更别说什么VisualStudioCode、剪贴板管理、全......
  • Qt环境Windows应用程序动态变更系统默认打印机
    有些工作环境安装有多个打印机,针对不同需求进行各种输出。如果是用QPrinter进行打印控制,可以通过setPrinterName确定使用哪一个打印机,但如果程序使用了第三方功能进行打印输出,比如通过QAxObject调用系统的文字处理直接输出,就可能会遇到无法明确指定哪一个打印机的问题。这时就需要......
  • 因果推断在推荐系统debias的应用
    推荐系统的bias有很多:positionbias,popularitypias,selectionbias,exposurebias,conformitybias(从众心理)等,针对不同的bias有不同的模型来解决。核心的问题还是,这些bias导致一部分优秀的itemunderestimate或者underperform,为了更公正的推出这些item,需要去掉这些bias。......
  • Cocos2dx中应用内部横竖屏切换
    {未实践https://blog.csdn.net/ByAlick/article/details/83009941}{语言环境:Cocos2dx3.6Lua5.1AndroidStudio3.0.1问题:如何在应用内部进行横竖屏切换?解决思路:         由于产品需求,必须在应用内部进行横竖屏切换(苦比〜_〜),没办法,网上教程一大把,大多数是在一......
  • [Kyana]开发OpenHarmony应用
    Javaver.HelloWorldconfig.jsonapp{bundleName:包名 vendor:开发厂商名(小贩) version:code(内部版本号),name(用户版本号)}deviceConfig{应用在设备上的配置}module{package:包名name:当前hap包名字mainAbility:hap包的入口abilitydeviceType:当前应用......
  • 轻松实现.NET应用自动更新:AutoUpdater.NET教程
    在软件开发中,应用程序的自动更新功能是一个重要的特性,它能让用户在不手动干预的情况下获取最新的软件版本。这不仅提高了用户体验,还有助于开发者及时修复潜在的问题、增加新功能,并确保软件的安全性和稳定性。对于.NET开发者来说,实现自动更新功能并不总是那么简单。幸运的是,有一个......