MetalLB简介

MetalLB 是为裸机Kubernetes集群实现的负载均衡器,使用标准路由协议ARP或BGP。Kubernetes官方没有为裸机集群提供网络负载均衡器(LoadBalancer类型的服务)的实现。各家云厂商(GCP、AWS、Azure…)有相应实现,但必须运行在自身的云环境上才能使用,如果没有在受支持的IaaS平台(GCP、AWS、Azure…)上运行,那么负载均衡器在创建时将无限期地保持pending状态。


裸机集群环境剩下两个较小的工具来将用户流量引入他们的集群,“NodePort”和“externalIPs”服务。这两种选择在生产使用方面都有很大的缺点,这使得裸机集群成为 Kubernetes 生态系统中的二等公民。

MetalLB 旨在通过提供与标准网络设备集成的网络负载均衡器实现来纠正这种不平衡,以便裸机集群上的外部服务也尽可能“正常工作”。

MetalLB 由David Anderson开发,直到 2019 年 3 月,MetalLB 的版权归谷歌所有,目前已经脱离谷歌,原作者现在已经授权一个维护人员团队协助推进项目。

官方网站:https://metallb.universe.tf
项目地址:https://github.com/metallb/metallb

Metallb原理

Metallb 会在 Kubernetes 内运行,监控服务对象的变化,一旦察觉有新的LoadBalancer 服务运行,并且没有可申请的负载均衡器之后,就会完成两部分的工作:

1.地址分配
用户需要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务。

2.地址广播
根据不同配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播。

基本原理图:

Metallb 支持两种模式:

  • Layer2
  • BGP

MetalLB安装

1、前提条件

已准备kuberntes集群:v1.23.6,已准备网络插件:calico等。

root@master:~# kubectl get nodes -o wide
NAME      STATUS   ROLES                  AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION      CONTAINER-RUNTIME
master    Ready    control-plane,master   8d    v1.23.6   192.168.72.30   <none>        Ubuntu 22.04 LTS   5.15.0-27-generic   cri-o://1.23.2
worker1   Ready    <none>                 8d    v1.23.6   192.168.72.31   <none>        Ubuntu 22.04 LTS   5.15.0-27-generic   cri-o://1.23.2
worker2   Ready    <none>                 8d    v1.23.6   192.168.72.32   <none>        Ubuntu 22.04 LTS   5.15.0-27-generic   cri-o://1.23.2

如果在 IPVS 模式下使用 kube-proxy,从 Kubernetes v1.14.2 开始,必须启用严格的 ARP模式。请注意,如果使用 kube-router 作为服务代理,则不需要这个,因为它默认启用严格的 ARP。

可以通过在当前集群中编辑 kube-proxy 配置来实现这一点,执行一下命令:

kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

2、Metallb 安装

Metallb 支持 yaml文件、Kustomize、Helm 和 MetalLB Operator多种安装方法,这里使用yaml方式进行安装。

下载release版本

wget https://github.com/metallb/metallb/archive/refs/tags/v0.12.1.tar.gz
tar -zxvf metallb-0.12.1.tar.gz
cd metallb-0.12.1/manifests

执行yaml文件进行安装

kubectl apply -f namespace.yaml
kubectl apply -f metallb.yaml

查看运行的pods,metalLB包含两个部分: a cluster-wide controller, and a per-machine protocol speaker.

root@ubuntu:/data/k8s/metallb-0.12.1/manifests# kubectl -n metallb-system get pods
NAME                         READY   STATUS    RESTARTS   AGE
controller-57fd9c5bb-txv25   1/1     Running   0          63m
speaker-8sfx2                1/1     Running   0          63m
speaker-hpblt                1/1     Running   0          63m
speaker-hpwm7                1/1     Running   0          63m

查看其它信息,包含了 “controller” deployment,和 the “speaker” DaemonSet.

root@ubuntu:/data/k8s/metallb-0.12.1/manifests# kubectl -n metallb-system get deploy
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
controller   1/1     1            1           64mroot@ubuntu:/data/k8s/metallb-0.12.1/manifests# kubectl -n metallb-system get ds
NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
speaker   3         3         3       3            3           kubernetes.io/os=linux   64m

目前还没有宣布任何内容,因为我们没有提供ConfigMap,也没有提供负载均衡地址的服务。接下来要生成一个 Configmap 文件,为 Metallb 设置网址范围以及协议相关的选择和配置,这里以一个简单的二层配置为例。

配置Layer2模式

创建config.yaml提供IP地址池,查看提供的默认示例configmap

root@ubuntu:/data/k8s/metallb-0.12.1/manifests# cat example-layer2-config.yaml

修改ip地址池,从集群IP地址段中为MetalLB分配部分IP地址:

root@ubuntu:/data/k8s/metallb-0.12.1/manifests# vim example-layer2-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |address-pools:- name: defaultprotocol: layer2addresses:- 192.168.72.200-192.168.72.250

执行yaml文件

kubectl apply -f example-layer2-config.yaml

创建后端应用和服务测试

root@ubuntu:/data/k8s/metallb-0.12.1/manifests# kubectl apply -f tutorial-2.yaml

查看yaml文件配置,包含了一个deployment和一个LoadBalancer类型的service,默认即可。

root@ubuntu:/data/k8s/metallb-0.12.1/manifests# cat tutorial-2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1ports:- name: httpcontainerPort: 80---
apiVersion: v1
kind: Service
metadata:name: nginx
spec:ports:- name: httpport: 80protocol: TCPtargetPort: 80selector:app: nginxtype: LoadBalancer

查看service分配的EXTERNAL-IP

[centos@k8s-master ~]$ kubectl get service
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1      <none>           443/TCP        3d15h
nginx        LoadBalancer   10.101.112.1   192.168.72.200   80:31274/TCP   123m

从集群外访问该IP地址

配置BGP模式

1、frr安装,准备一个Ubuntu 22.04节点192.168.72.16作为frr路由器。

创建/etc/frr/daemons配置文件

podman run --name frr docker.io/frrouting/frr:v8.2.2
mkdir /etc/frr
podman cp frr:/etc/frr/daemons /etc/frr/daemons

启用bgp模式

sed -i 's#bgpd=no#bgpd=yes#g' /etc/frr/daemons

创建bgp配置文件

cat >/etc/frr/bgpd.conf<<EOF
! -*- bgp -*-
hostname ukw-p-rtr-01
frr defaults datacenter
log file stdout
service integrated-vtysh-config
!
!
router bgp 65000bgp router-id 192.168.72.16neighbor 192.168.72.30 remote-as 65001neighbor 192.168.72.31 remote-as 65001neighbor 192.168.72.32 remote-as 65001!address-family ipv4 unicastredistribute connectedredistribute kernelneighbor V4 soft-reconfiguration inboundneighbor V4 route-map ALLOW-ALL inneighbor V4 route-map ALLOW-ALL outexit-address-family!
route-map ALLOW-ALL permit 10
!
line vty
!
EOF

启动frr容器

podman run -d --name frr-upstream \-v /etc/frr:/etc/frr:Z \--net=host \--privileged \docker.io/frrouting/frr:v8.2.2

查看bgp配置

podman exec -it frr-upstream vtysh ubuntu# show ip bgp neighborubuntu# show ip bgp summary IPv4 Unicast Summary (VRF default):
BGP router identifier 192.168.72.16, local AS number 65000 vrf-id 0
BGP table version 3
RIB entries 3, using 552 bytes of memory
Peers 3, using 2149 KiB of memoryNeighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
192.168.72.30   4      65001        86       380        0    0    0 00:04:09            1        3 N/A
192.168.72.31   4      65001        86       381        0    0    0 00:04:09            1        3 N/A
192.168.72.32   4      65001        86       393        0    0    0 00:04:09            1        3 N/ATotal number of neighbors 3

删除原有configmap配置,重新配置

apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |peers:- peer-address: 192.168.72.16peer-asn: 65000my-asn: 65001address-pools:- name: defaultprotocol: bgpaddresses:- 192.168.72.150-192.168.72.199

删除控制器 pod 进行重启,此时可以看到 Service 分配到了新的 IP:

kubectl -n metallb-system delete pods  -l app=metallb,component=controller

检查 speaker POD 的日志,可以看到与 peer 192.168.72.16 之间的通信已经开始,并对外发布了 IP 地址的公告:

root@master:~# kubectl -n metallb-system logs -f speaker-8sfx2  |grep 192.168.72.16
{"caller":"level.go:63","configmap":"metallb-system/config","event":"peerAdded","level":"info","msg":"peer configured, starting BGP session","peer":"192.168.72.16","ts":"2022-04-29T09:47:27.801204546Z"}
{"caller":"level.go:63","event":"sessionUp","level":"info","localASN":65001,"msg":"BGP session established","peer":"192.168.72.16:179","peerASN":65000,"ts":"2022-04-29T09:47:27.804513819Z"}

然后可以在 frr 路由器节点查看路由表,从表中可以找到 192.168.72.150/32192.168.72.151/32 两条 BGP 的路由。

root@ubuntu:~# ip route
default via 192.168.72.8 dev ens160 proto static
10.88.0.0/16 dev cni-podman0 proto kernel scope link src 10.88.0.1 linkdown
192.168.72.0/24 dev ens160 proto kernel scope link src 192.168.72.16
192.168.72.150 nhid 29 proto bgp metric 20 nexthop via 192.168.72.30 dev ens160 weight 1nexthop via 192.168.72.31 dev ens160 weight 1nexthop via 192.168.72.32 dev ens160 weight 1
192.168.72.151 nhid 29 proto bgp metric 20 nexthop via 192.168.72.30 dev ens160 weight 1nexthop via 192.168.72.31 dev ens160 weight 1nexthop via 192.168.72.32 dev ens160 weight 1

参考:
https://mp.weixin.qq.com/s/6FZ2v7f6FHCtx8MEKMLagQ

Kuberntes部署MetalLB负载均衡器相关推荐

  1. Docker Swarm集群中部署Traefik负载均衡器

    一.创建单节点的Docker Swarm集群 docker swarm init 二.在Swarm集群中创建一个网络 docker network create --driver=overlay tr ...

  2. 在Rancher 1.6上部署Traefik负载均衡器

    一.给Traefik主机打标签 01-给即将部署Traefik的主机节点打上标签.jpg 02-主机打完traefik_lb标签后的状态.jpg 二.在Rancher应用商店中部署Traefik 应用 ...

  3. ONAP桂林版本部署

    ONAP桂林版本部署(从docker安装到k8s集群到Helm再到ONAP) 1 docker-k8s-Helm-ONAP 1.1 Kubernetes环境搭建方式 1.1.1 Kubeadm 1.1 ...

  4. 自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信

    目录 一.Kubernetes简介 1.Kubernetes简介 2.kubernetes设计架构 3.Kubernetes核心组件 4.kubernetes设计结构 二.Kubernetes部署 1 ...

  5. Nginx+Tomcat实现负载均衡、动静分离集群部署

    Nginx+Tomcat实现负载均衡.动静分离集群部署 一.Tomcat多实例部署 1.安装好jdk 2.安装tomcat 3.配置tomcat环境变量 4.修改tomcat2中的server.xml ...

  6. Kubernetes 部署高可用集群(二进制,v1.18)下

    高可用架构(扩容多Master架构) Kubernetes作为容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失效状 ...

  7. K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍

    Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...

  8. 半小时学会在Win10上部署K8S,玩转云原生【全干货,建议收藏】

    01 引子 起因也是因为最近刚好重做了系统,把win10从home版升级到了专业版,可以愉快的安装docker destop 而不需要借助 docker toolbox了. 这个使用体验的提升真的是很 ...

  9. 基于Win10单机部署kubernetes应用

    01 引子 鸽了好久了,终于又一次克服了拖延症,决心写点啥,起因也是因为最近刚好重做了系统,把win10从home版升级到了专业版,可以愉快的安装docker destop 而不需要借助 docker ...

最新文章

  1. c++ hook 钩子的使用介绍
  2. 【JAVA集合类(大公司面试喜欢问的) 】
  3. css text top,text-align属性(css中文本对齐属性)
  4. zabbix服务器没有.pid文件,PID file /run/zabbix/zabbix_server.pid not readable (yet?) after start. 报错解决...
  5. C++静态库与动态库(简介)
  6. 产品所有者也应该是Scrum教练吗?
  7. 被嫌弃的互联网的 “一生”(上)
  8. C++ vector容器类型 (转)
  9. python使用UUID生成唯一标识
  10. Flutter社区和资源传送门
  11. linux输入子系统概述,4. Linux - 输入子系统框架详解
  12. 图片标注工具LabelImg使用教程
  13. Lomboz插件安装
  14. VS2017使用C#编写程序员告白小软件
  15. 线性回归——多重共线性
  16. 关于jmeter TPS解读
  17. web资源优化-图片篇(一)
  18. 语音识别平台_语音识别 平台_微信语音识别开放平台 - 云+社区 - 腾讯云
  19. 08年十大可能被炒CEO出炉 AMD鲁毅智位列第一
  20. 《奋斗》中的经典台词

热门文章

  1. 验证码---短信验证码
  2. c语言坐标系的方向,左/右手坐标系与坐标正/负方向旋转的详细介绍
  3. 社交电商大池,抖音也来了!
  4. (00)Chronicle Queue 介绍
  5. 夏天到来了,可以去做这5个生意,投入成本不大,利润却非常不错
  6. jupyter notebook加入matlab内核
  7. 天玑8100相当于骁龙系列的哪款芯片
  8. 自适应巡航 自动泊车 车道偏离 碰撞预警 自动驾驶之辅助驾驶技术简介
  9. 如何在powerpoint 2007 中播放 swf文件
  10. 最新Things3 for Mac(最好用的GTD时间管理工具)中文:使用教程