[Gitops--4] OpenELB

news2024/11/19 20:37:14

OpenELB

OpenELB是一个开源的负载均衡器,功能和metalLB类似
OpenELB主要两种工作模式: Layer2和BGP模式.目前OpenELB的BGP不支持ipv6
OpenELB核心思想就是通过某种方式将特定的VIP的流量引导k8s集群中,然后通过Kube-proxy将流量转发到后面的特定服务.

1. OpenELB介绍

1.1 Layer2 模式

整个访问过程需要k8s集群基础环境支持发送anonymous ARP/NDP packets.OpenELB是针对裸金属设计的,因此云环境下需要注意是否能够满足条件.

  • 图中有一个类型为 LoadBalancer 的 Service,其 VIP 为 192.168.31.210(和 k8s 的节点相同网段),后端有两个 pod(分别为 pod1 和 pod2)
  • 安装在 Kubernetes 集群中的 OpenELB 随机选择一个节点(图中为 worker 1)来处理 Service 请求。当局域网中出现 arp request 数据包来查询 192.168.0.91 的 mac 地址的时候,OpenELB 会进行回应(使用 worker 1 的 MAC 地址),此时路由器(也可能是交换机)将 Service 的 VIP 192.168.31.210 和 worker 1 的 MAC 地址绑定,之后所有请求到 192.168.31.210 的数据包都会被转发到 worker1 上
  • Service 流量到达 worker 1 后, worker 1 上的 kube-proxy 将流量转发到后端的两个 pod 进行负载均衡,这些 pod 不一定在 work1 上
  • 如果worker1出现故障,那么就会把Service IP映射到worker 2上去.由于主备切换不是瞬间完成的,具体切换时间不明.

请添加图片描述

1.2 BGP模式

OpenELB 的 BGP 模式使用的是gobgp实现的 BGP 协议,通过使用 BGP 协议和路由器建立 BGP 连接并实现 ECMP 负载均衡,从而实现高可用的 LoadBalancer。

  • 图中有一个类型为 LoadBalancer 的 Service,其 VIP 为 172.22.0.2(和 k8s 的节点不同网段),后端有两个 pod(分别为 pod1 和 pod2)
  • 安装在 Kubernetes 集群中的 OpenELB 与 BGP 路由器建立 BGP 连接,并将去往 172.22.0.2 的路由发布到 BGP 路由器,在配置得当的情况下,路由器上面的路由表可以看到 172.22.0.2 这个 VIP 的下一条有多个节点(均为 k8s 的宿主机节点)
  • 当外部客户端机器尝试访问 Service 时,BGP 路由器根据从 OpenELB 获取的路由,在 master、worker 1 和 worker 2 节点之间进行流量负载均衡。Service 流量到达一个节点后,该节点上的 kube-proxy 将流量转发到后端的两个 pod 进行负载均衡,这些 pod 不一定在该节点上

请添加图片描述

1.3 注意事项

配置 ARP 参数

部署 Layer2 模式需要把 k8s 集群中的 ipvs 配置打开strictARP,开启之后 k8s 集群中的 kube-proxy 会停止响应 kube-ipvs0 网卡之外的其他网卡的 arp 请求,而由 MetalLB 接手处理。

strict ARP 开启之后相当于把 将 arp_ignore 设置为 1 并将 arp_announce 设置为 2 启用严格的 ARP,这个原理和 LVS 中的 DR 模式对 RS 的配置一样。

2. OpenELB安装

2.1 安装OpenELB必备条件

  1. 必须使用k8s集群
  2. k8s 版本必须高于1.15
  3. 如果没有k8s集群可以使用kubekey部署.

2.2 安装OpenELB

官网

https://openelb.io/

安装OpenELB

kubectl apply -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml

相关资源被创建到openelb-system命名空间下

namespace/openelb-system created
customresourcedefinition.apiextensions.k8s.io/bgpconfs.network.kubesphere.io created
customresourcedefinition.apiextensions.k8s.io/bgppeers.network.kubesphere.io created
customresourcedefinition.apiextensions.k8s.io/eips.network.kubesphere.io created
serviceaccount/kube-keepalived-vip created
serviceaccount/openelb-admission created
role.rbac.authorization.k8s.io/leader-election-role created
role.rbac.authorization.k8s.io/openelb-admission created
clusterrole.rbac.authorization.k8s.io/kube-keepalived-vip created
clusterrole.rbac.authorization.k8s.io/openelb-admission created
clusterrole.rbac.authorization.k8s.io/openelb-manager-role created
rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created
rolebinding.rbac.authorization.k8s.io/openelb-admission created
clusterrolebinding.rbac.authorization.k8s.io/kube-keepalived-vip created
clusterrolebinding.rbac.authorization.k8s.io/openelb-admission created
clusterrolebinding.rbac.authorization.k8s.io/openelb-manager-rolebinding created
service/openelb-admission created
deployment.apps/openelb-manager created
job.batch/openelb-admission-create created
job.batch/openelb-admission-patch created
mutatingwebhookconfiguration.admissionregistration.k8s.io/openelb-admission created
validatingwebhookconfiguration.admissionregistration.k8s.io/openelb-admission created

查看资源是否被正常创建

root@master-01:/opt/openelb# kubectl get pods -n openelb-system
NAME                               READY   STATUS      RESTARTS   AGE
openelb-admission-create-sxz6x     0/1     Completed   0          55m
openelb-admission-patch-4z2vh      0/1     Completed   2          55m
openelb-keepalive-vip-8b8bg        1/1     Running     0          52m
openelb-keepalive-vip-8k7rb        1/1     Running     0          52m
openelb-manager-688566cb5d-bgkrl   1/1     Running     0          53m

3 OpenELB配置

3.1 修改kube-proxy模式

运行以下命令,对kube-proxy模式进行修改.默认是iptables

kubectl edit cm -n kube-system kube-proxy
    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: true	# 默认是false,改为true
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs"  #默认是空,改为ipvs

保存退出后重启kube-proxy

kubectl rollout restart daemonset -n kube-system kube-proxy

3.2 创建地址池

layer2-eip.yaml

apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
  name: layer2-eip
spec:
  address: 192.168.31.170-192.168.31.190
  interface: eth0
  protocol: layer2

创建eip资源

kubectl apply -f layer2-eip.yaml

查看eip资源状态

kubectl get eips.network.kubesphere.io
NAME         CIDR                            USAGE   TOTAL
layer2-eip   192.168.31.170-192.168.31.190           21

4. k8s中使用OpenELB

4.1 Deployment

layer-nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: layer-nginx
  labels:
    app: layer-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: layer-nginx
  template:
    metadata:
      labels:
        app: layer-nginx
    spec:
      containers:
      - name: layer-nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

4.2 Service

layer-nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: layer-nginx-service
  annotations:
    lb.kubesphere.io/v1alpha1: openelb
    protocol.openelb.kubesphere.io/v1alpha1: layer2
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip
spec:
  selector:
    app: layer-nginx
  type: LoadBalancer
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  externalTrafficPolicy: Cluster

4.3 访问测试

修改3个容器的index.html

# kubectl exec -it layer-nginx-7d89bf4665-cjffd  bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@layer-nginx-7d89bf4665-cjffd:/# echo 1 > /usr/share/nginx/html/index.html
root@layer-nginx-7d89bf4665-cjffd:/# exit
exit
# kubectl exec -it layer-nginx-7d89bf4665-rfk26  bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@layer-nginx-7d89bf4665-rfk26:/# echo 2 > /usr/share/nginx/html/index.html
root@layer-nginx-7d89bf4665-rfk26:/# exit
exit

# kubectl exec -it layer-nginx-7d89bf4665-vz82h bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@layer-nginx-7d89bf4665-vz82h:/# echo 3 >  /usr/share/nginx/html/index.html
root@layer-nginx-7d89bf4665-vz82h:/# exit
exit

可以看到这里分配了192.168.31.170的external-ip

# kubectl get svc layer-nginx-service
NAME                  TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
layer-nginx-service   LoadBalancer   10.200.127.157   192.168.31.170   80:30972/TCP   79s
# kubectl get eip
NAME         CIDR                            USAGE   TOTAL
layer2-eip   192.168.31.170-192.168.31.190   1       21
## 集群内访问测试
# for i in {1..6};do curl 192.168.31.170;done
2
1
3
2
1
3

5. Kubesphere中使用OpenELB

5.1 创建项目

请添加图片描述

创建工作负载

请添加图片描述

请添加图片描述

没有就不挂载

请添加图片描述

如果没有就直接创建

请添加图片描述

deployment被创建完成

请添加图片描述

修改下index.html

请添加图片描述

请添加图片描述

5.2 创建Service

请添加图片描述

请添加图片描述

    lb.kubesphere.io/v1alpha1: openelb
    protocol.openelb.kubesphere.io/v1alpha1: layer2
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip

请添加图片描述

访问测试

请添加图片描述

请添加图片描述

5.3 应用路由(ingress)

请添加图片描述

设置路由规则

请添加图片描述

修改hosts或dns后可以使用域名实现服务访问

192.168.31.210 openelb.intra.com

请添加图片描述

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

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

相关文章

对于python文件,敲下回车后发生了什么

引言 我们常说 Python 一是门解释型语言,只需要敲下 python code.py就可以运行编写的代码,而无需使用类似于 javac 或者 gcc 进行编译。那么,Python 解释器是真的一行一行读取 Python 源代码而后执行吗? 实际上,Python 在执行程序…

为什么要进行倾斜摄影三维模型的顶层合并?

为什么要进行倾斜摄影三维模型的顶层合并? 1、倾斜摄影三维模型顶层合并的重要性 倾斜摄影三维模型的顶层合并是指将拍摄同一区域的多个倾斜角度的影像进行融合,生成一个连续的、完整的三维地理信息数据。其原因主要有以下几点: &#xff0…

关于倾斜摄影三维模型轻量化数据大小和质量关系分析

关于倾斜摄影三维模型轻量化数据大小和质量关系分析 倾斜摄影三维模型轻量化是一种常用的技术,通过对原始三维模型数据进行压缩和简化,减小其数据大小,从而提高数据传输和展示效率。然而,轻量化过程中可能会对数据质量产生影响。以…

性能测试——安装Loadrunner11.0的详细步骤

一、下载Loadrunner11.0版本 去相关网站下载即可 二、安装 (windows与虚拟机上安装操作大相径庭) 1、将ISO文件导入,打开光驱,运行“setup.exe“ 2、点击安装,部分机器会提示缺少“Microsoft Visual C 2005 SP1运行组…

有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 来源:力扣(LeetCode) 链接:https://leetco…

Java 将json中key值中带有下划线的部分转为驼峰格式

一、背景说明 在开发过程中,有时会遇到第三方厂商提供的接口返回结果不是严格按照驼峰命名,需要将其中带有下划线的字段进行格式化转换为驼峰命名。 如下图中的self_auth、user_id、user_name、creator_name 和 others_auths 等 key 值。 如果是对 JS…

Mysql 45讲和45问笔记(未完待续0203/04/24)

一、mysql 45讲 1)索引的本质讲解 定义解释 所以是帮助Mysql高效获取数据的排好序的数据结构 索引数据结构 ①二叉树 ②红黑树 ③Hash表 ④B-Tree 原理讲解 可以看到右边的数据结构里面,是按照k-v来存数据结构的,key是col2的字段&#xf…

【Linux】线程-线程概念

线程概念 什么是线程线程的优点和缺点线程的用途和线程异常线程与进程的区别 什么是线程 实际上,线程是一个进程内部的控制序列,一个程序的一个执行线路就是一个线程。 并且一个进程中至少有一个线程,本质上,一个进程内部如果有多…

6. 树的入门

6. 树的入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 6.1 树的基本定义 …

MybatisPlus-入门项目搭建、SQL日志打印、实体类注解、简单持久层操作

Mybatis-Plus mybatis plus概述 ​ Mybatis Plus (opens new window)简称 MP,它是一个MyBatis 的增加工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 Mybatis Plus官网:https://…

拉格朗日函数对偶问题、KKT条件

一、概念介绍 KKT最优化条件是Karush(1939)以及Kuhn和Tucker(1951)先后独立发表出来的,但在Kuhn和Tucker发表之后才逐渐受到重视,因此多数情况下记载成库恩-塔克条件(Kuhn-Tucker conditions)。先介绍几个优化的概念。 1.1 优化 最优化问题&#xff0…

大彩串口屏新品发布:大彩7寸新品RS485/232双通讯口人机界面发布!

一、产品介绍 新品发布:大彩7寸新品RS485/232双通讯口人机界面发布! 此次发布7.0寸外壳HMI产品采用普清800*480液晶屏、触摸选用电阻触摸,硬件性能上与M型医用级组态串口屏一样,软件上拥有炫酷的动画效果,页面切换流…

路侧激光雷达目标检测系统-篇2

本篇文章承接上文,主要阐述代码,分布的成果等工作。识别结果为单帧图片,每一张图片识别完之后,放在一起,就可以连续播放单帧文件,变成视频,或者直接在matlab图窗里面播放。关于这个函数的功能我…

HTML+CSS+JS 学习笔记(三)———Javascript(中)

🌱博客主页:大寄一场. 🌱系列专栏:前端 🌱往期回顾:HTMLCSSJS 学习笔记(三)———Javascript(上) 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 JavaScrip…

NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_统计语言模型的平滑策略---人工智能工作笔记0035

https://www.cnblogs.com/nickchen121/p/16470569.html#tid-458p3Y 参考这个文档学习 条件概率的链式法则:这个是需要去补充的知识. 首先我们来看一下上一节说到的预训练,可以看到,我们比如有个鹅鸭的分类问题, 这个鹅鸭分类我们是用10万张图片训练的模型,这个已经可以把这个…

3. 马氏决策过程

3. 马氏决策过程 3. 马氏决策过程3.1 马氏过程3.2 马氏奖励过程3.3 马氏决策过程3.4 贝尔曼方程与最优值 3. 马氏决策过程 3.1 马氏过程 3.2 马氏奖励过程 3.3 马氏决策过程 3.4 贝尔曼方程与最优值

如何从有故障的 SD 卡恢复文件

如何从损坏的 SD 卡中恢复文件? 您是否正在与损坏的 SD 卡作斗争?您的 SD 卡上是否有您无法承受的数据丢失,但它没有响应?好吧,我们为您解决了! SD 卡是智能手机、相机和笔记本电脑中常用的存储设备。虽然…

2. 多臂老虎机问题

多臂老虎机问题 2. 多臂老虎机问题2.1 强化学习基本概念2.2 多臂老虎机与regret值2.3 随机多臂老虎机2.4 对抗多臂老虎机2.5 上下文多臂老虎机2. 多臂老虎机问题 2.1 强化学习基本概念 2.2 多臂老虎机与regret值

SpringCloud入门实战(七)-Hystrix入门简介

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 。 💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看&…

图像基本运算

图像基本运算 图像算数运算: 1)图像加法 示例代码: import cv2 import numpy as np img1 cv2.imread(‘…/datas/fengjing1.png’)#(546, 820, 3) img2 cv2.imread(‘…/datas/logo.png’)#(512, 512, 3) print(img1.shape) img1resize cv2.resize(img1, (24…