文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Kubernetes集群中部署MetalLB实现负载均衡

2024-12-01 16:40

关注

概述

在公有云部署的kubernetes集群中,有公有云厂商提供LoadBalancer类型的Service。但是在基于本地环境部署的k8s集群是我们常用的测试环境和开发环境;需要通过NodePort和externalIPs方式将外部流量引入集群中,这就带来了很多的不便。

尤其是我们通过helm去部署一些服务时,尝尝会依赖于LoadBalancer的资源类型,导致创建的services中type: LoadBalancers会一直处于Pending状态;我们不得不进行仓库的fetch,然后手动进行values的修改。

Metallb 通过标准路由协议能解决该问题。MetalLB 也是 CNCF 的沙箱项目,最早发布在
https://github.com/google/metallb 开发,后来迁移到 https://github.com/metallb/metallb 中。

MetalLB 通过 MetalLB hooks 监听SVC的变化;然后通过Speaker组件采用对应的模式将外部流量引流到kubernetes集群node节点的可达路径。而具体到Pod中则是通过kuber-proxy依据转发模式(iptables或ipvs)将流量转发到Pod中。

MetaLB负责从主机维度实现负载均衡,而pod副本间的负载是通过kube-proxy实现。MetalLB负责IP地址分配、依据设定的广播模式进行广播、节点选举、节点失效切换等功能。而引流的过程则通过ARP、NDP和BGP标准路由协议实现。

主要的两大功能:

  1. 地址分配:用户需要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务。
  2. 地址广播(IP外部声明):根据不同配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播。

工作模式:

  1. BGP模式(Layer 3),使用BGP协议分配地址池;运行 BGP 的设备之间可以交换路由信息,我们可以将自己的 IP 段通过 BGP 协议告诉其他设备,这样其他设备就能正确的路由数据包到服务器上了。BGP 需要路由器的支持。如果Calico也是使用的BGP模式,有可能会有冲突从而导致metallb无法正常工作。
  2. ARP(IPV4)/NDP(IPV6)工作模式(Layer2);使用 ARP/NDP 协议分配地址池;在服务器的内部子网里找未使用的 IP,然后等其他电脑访问这个 IP 的时候,我们回应一个 ARP 包,其他电脑就知道这个 IP 在哪里可以通信了,尽管这个 IP 其实没有绑定到任何网卡上,也有可能只是 iptables 里的一条记录。分配的 IP 只能和服务器其他 IP 位于同一子网,这就要求我们所有的节点必须在同一个二层网络内。

更多详情请参考官方文档:https://metallb.universe.tf/。

架构

二层部署的架构图,参考红帽openshift官方文档。

上图显示了与 MetalLB 相关的以下概念:

部署

环境要求

集群版本信息如下:

支持MetalLB的CNI如下:

Network addon

Compatible

Antrea

Yes (Tested on version 1.4 and 1.5)

Calico

Mostly (see known issues)

Canal

Yes

Cilium

Yes

Flannel

Yes

Kube-ovn

Yes

Kube-router

Mostly (see known issues)

Weave Net

Mostly (see known issues)

注意事项:

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true

通过helm安装

MetalLBKubernetes manifests、Kustomize 和 Helm 三种安装方式;这里我们采用helm安装:

$ helm repo add metallb https://metallb.github.io/metallb
$ helm search repo -l metallb
$ helm fetch metallb/metallb --version=0.13.4
$ tar zxvf metallb-0.13.4.tgz
#这里我们可以根据自己的需求进行values值的修改,例如原镜像地(quay.io)址无法拉取,我们可以先拉取然后上传到自己的镜像仓库,然后修改地址
$ kubectl create namespace metallb-system
$ helm install metallb -n metallb-system ./metallb

验证安装,如下图所示

metallb-system的namespace下,会安装两个组件:

speaker pod 响应 IPv4 服务和 IPv6 的 NDP 请求。

通过manifest安装

要安装 MetalLB,使用yaml应用清单:

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

配置

由于我们的集群工作在测试环境中,我们采用的是L2工作模式下。

第 2 层模式最容易上手,并且可以在任何环境中工作——不需要花哨的路由器。

定义要分给负载均衡服务的IP地址池。

新版本metallb使用了CR(Custom Resources),这里我们通过IPAddressPool的CR,进行地址池的定义。

如果实例中不设置IPAddressPool选择器L2Advertisement;那么L2Advertisement默认为该实例所有的IPAddressPool相关联。

创建metallb-config-ipaddresspool.yaml:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.168.74.100-192.168.74.110

进行L2关联地址池的绑定。这里也可以使用标签选择器。

创建metallb-config-L2Advertisement.yaml:

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool

测试

创建类型为LoadBalancer的SVC进行测试,创建yaml文件tutorial-1.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer

结果如下图所示:

通过浏览器进行访问:

参考网址:

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯