LoadBalancer for bare metal Kubernetes cluster-MetalLB

news/2024/10/14 5:34:30

在 Kubernetes 中,对于 LoadBalancer 类型的 Service,k8s 并没有为裸机集群实现负载均衡器,因此我们只有在以下 IaaS 平台(GCP, AWS, Azure)上才能使用 LoadBalancer 类型的 service。

因此裸机集群只能使用 NodePort 或者 externalIPs service 来对面暴露服务,然而这两种方式和 LoadBalancer service 相比都有很大的缺点,而 MetalLB 的出现就是为了解决这个问题。 也就是说在裸机的 K8s 集群无法使用 LoadBancer 类型的 Service。否则,您会发现 LoadBancer 的 Service 一直处于 Pending 状态,而 MetalLB 的出现就是为了解决这个问题。

MetalLB

MetalLB 是一款开源软件,它采用标准的路由协议(ARP 或 BGP)实现了裸机 K8s 集群的负载均衡功能。

https://metallb.io/installation/

工作模式:

L2 模式 (ARP)¶

L2 模式下,MetalLB 会通过 memberlist 选举出一个 Leader 节点,此节点负责向本地网络宣告 LoadBalancerIP。 从网络的角度来看,这台机器似乎有多个 IP 地址,它会响应来自 LoadBancerIP 的 ARP 请求。 L2 模式最大的优势是它不需要依赖譬如路由器等硬件的依赖便可工作。

  • 优势:通用型,不需要额外的硬件支持
  • 缺点:单节点的带宽限制、稍缓慢的故障转移(10s 左右)

L3 模式 (BGP)¶

在 BGP 模式下,集群中的每个节点都会与路由器建立 BGP Peer,并使用该会话向集群外部通告集群服务的 LoadBalanceIP。 BGP Router 基于每个不同的连接选择一个下一跳(即集群某个节点,这不同于 L2 模式下所有流量先到达某个 Leader 节点)。

  • 优势:负载均衡性更好
  • 缺点:
    • 当某个节点故障,所有 BGP 会话将会中断
    • Calico BGP 模式无法和 MetaLB L3 模式并存,会存在冲突,详情请参考 ISSUES WITH CALICO

安装 MetalLB

我的网络插件使用的是kube-router, 默认启用了ARP,所以直接安装:

image-20241013144444215

[root@master-01 metallb]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
[root@master-01 metallb]# kubectl get pod -A | grep metallb
metallb-system   controller-6dd967fdc7-9lq2p                                   1/1     Running     0             11h
metallb-system   speaker-kjm8c                                                 1/1     Running     0             11h
metallb-system   speaker-knv64                                                 1/1     Running     0             11h
metallb-system   speaker-rcxhc                                                 1/1     Running     0             11h

L2 模式测试

[root@master-01 metallb]# cat IPAddressPool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: poolnamespace: metallb-system
spec:addresses:# 可分配的 IP 地址,可以指定多个,包括 ipv4、ipv6,我的路由器网段就是下面的网段- 192.168.1.240-192.168.1.250 
[root@master-01 metallb]# cat L2Advertisement.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: examplenamespace: metallb-system
spec:ipAddressPools:- pool #上一步创建的 ip 地址池,通过名字进行关联
[root@master-01 metallb]# kubectl create -f IPAddressPool.yaml
[root@master-01 metallb]# kubectl create -f L2Advertisement.yaml
Nginx 部署测试
[root@master-01 metallb]# cat nginx-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: docker.io/nginx:latestports:- containerPort: 80
[root@master-01 metallb]# cat nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:selector:app: nginxports:- name: nginx-portprotocol: TCPport: 80targetPort: 80type: LoadBalancer
[root@master-01 metallb]# kubectl create -f nginx-deployment.yml
[root@master-01 metallb]# kubectl create -f nginx-svc.yaml
[root@master-01 metallb]# kubectl get deployments.apps nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           10h
[root@master-01 metallb]# kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.68.0.1      <none>          443/TCP        11h
nginx        LoadBalancer   10.68.74.145   192.168.1.240   80:31054/TCP   10h
[root@master-01 metallb]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-755fbfbc49-gljgb   1/1     Running   0          10h
nginx-deployment-755fbfbc49-l2928   1/1     Running   0          10h
nginx-deployment-755fbfbc49-lvbsp   1/1     Running   0          10h
[root@master-01 metallb]# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:80:af:bc brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.1.56/24 brd 192.168.1.255 scope global dynamic noprefixroute ens33valid_lft 45382sec preferred_lft 45382secinet6 fe80::20c:29ff:fe80:afbc/64 scope link noprefixroutevalid_lft forever preferred_lft forever
[root@master-01 metallb]# curl -I 192.168.1.240
HTTP/1.1 200 OK
Server: nginx/1.27.2
Date: Sun, 13 Oct 2024 20:34:22 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 02 Oct 2024 15:13:19 GMT
Connection: keep-alive
ETag: "66fd630f-267"
Accept-Ranges: bytes

image-20241014003558937

数据库测试
[root@master-01 metallb]# cat mysql.yml
apiVersion: v1
kind: ConfigMap
metadata:name: mysql-confignamespace: db
data:my.cnf: |[mysqld]bind-address = 0.0.0.0
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: mysqlname: mysqlnamespace: db
spec:replicas: 2selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:volumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-data- name: config-volumeconfigMap:name: mysql-configcontainers:- env:- name: MYSQL_ROOT_PASSWORDvalue: "Huawei12#$"- name: MYSQL_USERvalue: "k8s"- name: MYSQL_PASSWORDvalue: "Huawei12#$"image: "mysql:5.6"imagePullPolicy: IfNotPresentname: mysqlports:- containerPort: 3306protocol: TCPvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: config-volumemountPath: /etc/mysql/conf.d
---
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-data
spec:capacity:storage: 2GiaccessModes:- ReadWriteManynfs:path: /mysqlserver: 192.168.1.56persistentVolumeReclaimPolicy: RetainmountOptions:- vers=4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-datanamespace: db
spec:accessModes:- ReadWriteManyresources:requests:storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:labels:expose: "true"app: mysqlname: mysqlnamespace: db
spec:type: LoadBalancerports:- name: httpport: 80protocol: TCPtargetPort: 3306selector:app: mysql
[root@master-01 metallb]# kubectl get pod,svc -n db
NAME                        READY   STATUS    RESTARTS      AGE
pod/mysql-585df6d54-76pqp   1/1     Running   0             3m57s
pod/mysql-585df6d54-xq5qw   1/1     Running   2 (35s ago)   3m57sNAME            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
service/mysql   LoadBalancer   10.68.157.159   192.168.1.241   80:30771/TCP   3m57s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

01-k8s集群搭建 安装KubeSphere

前言 旧游无处不堪寻,无寻处,未有少年心 1.k8s简介 简介 Kubernetes 简称 k8s。是用于自动部署,扩展和管理容器化应用程序的开源系统。 中文官网:https://kubernetes.io/zh/ 中文社区:https://www.kubernetes.org.cn/ 官方文档:https://kubernetes.io/zh/docs/home/ 社区…

DockerCompose部署环境

前言 道阻且长,行则将至 1.安装docker 如果系统中已经存在旧的Docker,则先卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine首先要安装一个yum工具 yum install -y y…

实验一 现代C++ 基础编程

task1 代码:#include <iostream> #include <string> #include <vector> #include <algorithm>using namespace std;// 声明 // 模板函数声明 template<typename T> void output(const T &c);// 普通函数声明 void test1(); void test2(); v…

VMware中三种网络模式(快速笔记)

0、精髓1、桥接模式架构图(VMnet0)与主机共用一块网卡,分配到与主机同网段下的不同的IP地址2、NAT模式架构图(VMnet8)使用虚拟网卡并与主机连接,但共用主机IP3、主机模式架构图(VMnet1)注:本随笔仅为个人速记笔记,详细还请参考这篇博客https://www.cnblogs.com/linjiaxin/p…

Dockerr安装Oracle以及使用DBeaver连接

拉取镜像 pull container-registry.oracle.com/database/free:latest创建容器说明一下我现在的最新版本是23docker run -d --name oracle23i -h xrilang -p 1521:1521 container-registry.oracle.com/database/free:latest查看日志 docker logs oracle23i设置密码 因为创建容器…

数据结构 - 栈

栈是一种特殊线性数据结构,操作遵循后进先出原则,可解决表达式求值等问题。栈分为顺序栈和链栈,各有特点。文章详细介绍了栈的定义、分类及实现方式,包括顺序栈和链栈的ADT定义及基本操作实现。栈一种常见的特殊线性数据结构,其特殊之处在于其操作顺序,下面会详细介绍,也…

《使用Gin框架构建分布式应用》阅读笔记:p20-p31

《用Gin框架构建分布式应用》学习第2天,p20-p31总结,总计12页。 一、技术总结 1.第一个gin程序 // main.go package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"m…

hot100 review

56. 合并区间 https://leetcode.cn/problems/merge-intervals/description/?envType=study-plan-v2&envId=top-100-liked 该怎么排序区间 vector<vector>& intervals sort(intervals)即可 238. 除自身以外数组的乘积 https://leetcode.cn/problems/product-of-a…