【Kubernetes】虚拟 IP 与 Service 的代理模式
虚拟 IP 与 Service 的代理模式
- 1.userspace 代理模式
- 2.iptables 代理模式
- 3.IPVS 代理模式
由于 Service 的默认发布类型是 ClusterlP,因此也可以把 ClusterIP 地址叫作 虚拟 IP 地址。在 Kubernetes 创建 Service 时,每个节点上运行的 kube-proxy
会自动为 Service 分配一个虚拟 IP 地址,即通过 转发代理 kube-proxy
来实现 路由转发功能。kube-proxy
在具体实现 流量代理转发 与 负载均衡 时,有 3 3 3 种模式:
userspace
代理模式iptables
代理模式IPVS
代理模式
Cluster IP 地址是一个虚拟的 IP 地址,它是 Kubermetes 集群拥有的独立网络空间。它具有以下 3 3 3 个特征:
- 1️⃣ Cluster IP 地址仅作用于 Kubernetes 的 Service 对象,并由 Kubernetes 进行管理和分配。
- 2️⃣ Cluster IP 地址无法被直接访问,也没有实体的网络元素与其对应。
- 3️⃣ 不同 Service 中的 Pod 在集群内部可以通过 Cluster IP 地址进行相互访问。
1.userspace 代理模式
在 userspace
代理模式下,访问 Service 的请求首先访问 Node 节点的 iptable
表,再回到 Kubernetes 的命名空间中被 kube-proxy
转发到后端的 Pod 中。在默认情况下,userspace
代理模式下的 kube-proxy
通过轮询算法选择后端的 Pod。
🚀
userspace
代理模式最大的问题是:请求会存在一次状态转换过程(即从 Node 节点的命名空间到 Kubermetes 命名空间的转换),从而有性能上的损耗。
2.iptables 代理模式
iptables
代理模式是目前 Service 实现代理的默认方式。iptables
代理模式是通过 添加或移除 iptable
表中的路由规则 ,从而实现路由转发功能。在这种模式下,kube-proxy
会通过 API Server 监听集群中 Service 对象和 Endpoint 对象的创建和删除,从而创建 iptable
表中的规则,以实现将访问 Service 的请求重定向到后端的一组 Pod 中。
iptables
代理模式的工作机制如下图所示。iptables
代理模式的默认重定向策略会使用随机选择一个后端的 Pod。Kubernetes 也允许用户将 .service.spec.sessionAffinity
字段的值设置为 ClientIP
,以实现基于客户端会话的 IP 地址亲和性的重定向策略。
由于在 iptables
中记录了路由的规则,因此 iptables
代理模式会占用较少的系统资源。当 kube-proxy
运行在 iptables
代理模式下且与后端的 Pod 连接失败时,它会自动对后端的其他 Pod 进行连接重试。
接下来以一个示例来验证 iptables
代理模式。
使用 Deployment 控制器来部署应用,创建文件 service-demo1.yaml
,并在其中输入以下内容。
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx name: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresent
创建 Service:编辑文件 service-demo2.yaml
,在其中输入以下内容。
apiVersion: v1
kind: Service
metadata:name: service-demo2namespace: default
spec:# 这里使用 NodePort 类型的 Service 将应用程序暴露给外部type: NodePort ports:- name: httpport: 80protocol: TCPtargetPort: 80# 定义标签选择器,将服务 Service 与匹配便签的一组 Pod 关联起来selector: app: nginx
执行以下语句创建 Deployment 和 Service。
kubectl apply -f service-demo1.yaml
kubectl apply -f service-demo2.yaml
查看 Service 的信息。
kubectl get svc
输出的信息如下:
查看节点的 iptable
表中的路由规则。
iptables-save | grep 10.107.186.32
输出的 iptable
表中的路由规则信息如下:
删除 Service。
kubectl delete -f service-demo2.yaml
重新查看节点的 iptable
表中的路由规则。
iptables-save | grep 10.107.186.32
这时在 iptable
表中没有任何路由信息了。
iplables
代理模式尽管使用简单,占用的资源也较少。但它却有以下的不足:
- ⭕ 当存在大量的 Service 时,需要在
iptable
表中创建大量的路由规则,从而难以维护。 - ⭕ 在
iplable
表中进行路由规则匹配时,可能会造成转发的延时。
这时可以将 kube-proxy
运行在 IPVS 代理模式下。
3.IPVS 代理模式
与 iptables
代理模式一样,IPVS 代理模式通过 API Server 监听集群中 Service 对象和 Endpoint 对象的创建和删除,从而创建 IPVS 路由转发规则,并定期与 Service 对象和 Endpoint 对象同步 IPVS 路由转发规则,以达到路由转发的目的。请求在访问 Service 时,会被重定向到后端的一个 Pod 中。
IPVS 代理模式的工作机制如下图所示。
- IPVS 代理模式创建的是 IPVS 路由转发规则,而不是
iptables
路由转发规则。 kube-proxy
会定期与 Service 对象和 Endpoints 对象同步 IPVS 路由转发规则。
以下步骤将在 Kubernetes 集群中使用 Service 的 IPVS 代理模式。
在所有节点上安装 IPVS 模块。
apt install ipvsadm
让所有节点启用 IPVS 模块。
创建一个配置文件 /etc/sysconfig/modules/ipvs.modules
,并写入以下内容。
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
然后,将配置文件设置为可执行,并运行它,以加载所需的内核模块:
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
最后,您可以使用以下命令检查加载的内核模块:
lsmod | grep -e ip_vs -e nf_conntrack
修改 kube-proxy
的配置文件。
kubectl edit configmap kube-proxy -n kube-system
将 mode
字段改为以下形式(默认 mode: ""
为空,使用 iptables
)。
mode: "ipvs"
重启 kube-proxy
。
kubectl get pod -n kube-system --show-labels | grep kube-proxy
kubectl delete pod -n kube-system -l k8s-app=kube-proxy
编辑 service-ipvs.yaml
文件创建 Service 和 Deployment。
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx name: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:name: service-ipvsnamespace: default
spec:ports:- name: httpport: 80protocol: TCPtargetPort: 80selector: app: nginx
执行 kubectl apply -f
命令。
kubectl apply -f service-ipvs.yaml
查看 Pod 和 Service 的信息。
kubectl get pod,svc -o wide
输出的信息如下:
查看 IPVS 路由转发规则。
ipvsadm -Ln
输出的信息如下:
相关文章:

【Kubernetes】虚拟 IP 与 Service 的代理模式
虚拟 IP 与 Service 的代理模式 1.userspace 代理模式2.iptables 代理模式3.IPVS 代理模式 由于 Service 的默认发布类型是 ClusterlP,因此也可以把 ClusterIP 地址叫作 虚拟 IP 地址。在 Kubernetes 创建 Service 时,每个节点上运行的 kube-proxy 会自动…...
深度学习·Pytorch
以下代码源自李沐 自定义模块类 继承module类 继承nn.Module重写构造函数前向传播 class MLP(nn.Module):# 用模型参数声明层。这里,我们声明两个全连接的层def __init__(self):# 调用MLP的父类Module的构造函数来执行必要的初始化。# 这样,在类实例…...

fastzdp_sqlmodel新增get_first和is_exitsts方法
说明 经过fastzdp_login的整合,我们发现,fastzdp_sqlmodel还可以继续封装两个便捷的方法。 get_first:获取查询结果集中的第一条数据is_exitsts:判断数据是否已存在 封装get_first方法 def get_first(engine, model, query_di…...

嵌入式软件--数电基础 DAY 3
一、二进制 (1)文字表述 二进制数只能取0,1两个数字,逢二进一。 通过二进制表达文字。如战争时代的电报。 通过电灯泡的亮灭传递出信息。可以对灯亮和灯灭富裕一些含义,就能传达出想要的消息。 这就是编码和解码两…...

【生成式人工智能-十五-经典的影像生成方法-GAN】
经典的影像生成方法-GAN GANDiscriminatorGenerator还需要加入额外信息么 GAN可以加在其他模型上面我们可以用影像生成模型做什么? 前面讲过VAE和Flow-based以及diffusion Model ,今天讲最后一种经典的生成方法GAN。 GAN 前面讲的几种模型都是用加入额外…...

python 已知x+y=8 求x*y*(x-y)的最大值
先用导数求解 已知xy8 求xy(x-y)的最大值 令y8-x 则 f(x)x⋅(8−x)⋅(x−(8−x))x⋅(8−x)⋅(2x−8) 导数方程为 f(x)-3x^2 24x - 32 求方程 − 3 x 2 24 x − 32 0 -3x^2 24x - 32 0 −3x224x−320 的根。 首先,我们可以尝试对方程进行因式分解。观察…...

windows平台的postgresql主从数据库流备份
主: 操作系统:windows10 数据库版本:postgresql-16.2 ip:192.168.3.254 从: 操作系统:windows10 数据库版本:postgresql-16.2 ip:192.168.3.253 配置主库 配置 pg_hba.conf 文件 在 pg 的安装目录下,找到 …...
Spring 常见设计模式
什么是设计模式? 设计模式(Design pattern)是为解决软件设计中通用问题而被提出的一套指导性思想。它是一种被反复验证、经过实践证明并被广泛应用的代码设计经验和思想总结,可以帮助开发者通过一定的模式来快速的开发高质量、可维…...

优化大量数据导出到Excel的内存消耗(二):如果数据超出Excel单表上限,则进行分表
优化前:优化大量数据导出到Excel的内存消耗_大文件异步导出 内存占用高-CSDN博客 写Excel文件报错:Invalid row number (1048576) outside allowable range (0..1048575) 写入Excel时遇到IllegalArgumentException,原因是超出允许的最大行数…...
rustrover打开会报Error: Invalid toolchain
如果 cargo --version 正常输出,但在使用 RustRover 时出现“Invalid toolchain”错误,可能是由于 RustRover 工具链配置有问题或路径指向错误。 解决步骤: 1. 检查 RustRover 的工具链配置 打开 RustRover,进入 Preferences 或…...
docker-compose 安装canal
创建 Canal 配置文件 /conf/canal.properties mkdir -p conf/ touch /conf/canal.properties # canal.properties# tcp bind ip canal.ip 0.0.0.0 canal.port 11111 canal.metrics.pull.port 11112# zookeeper 集群配置 canal.zkServers canal.zookeeper.sessionTimeout…...

Unity动画模块 之 3D Rig页签
本文仅作笔记学习和分享,不用做任何商业用途本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 1.Rig页签 Rig 选项卡 - Unity 手册,rig是设置骨骼与替身系统的,工作流程如下 Avatar是什么…...
【蓝桥杯冲刺省一,省一看这些就够了-Java版本】蓝桥杯日期问题相关模板以及练习题
蓝桥杯历年省赛真题 点击链接免费加入题单 日期问题 java.time Java 中用于处理日期和时间的主要类位于 java.time 包中。以下是一些常用的类和其功能的简要介绍: LocalDate:表示日期。它提供了获取年、月、日以及日期之间比较的方法。 LocalDate to…...

【经典算法】BFS_FloodFill算法
目录 1, 算法介绍2,算法原理和代码实现(含题目链接)733.图像渲染200.岛屿的数量695.岛屿的最大面积130.被围绕的区域 3, 算法总结 1, 算法介绍 FloodFill(洪水灌溉) 算法介绍: 假设一个 4 * 4 的方格代表一块土地&am…...

RocketMQ之Topic主题详解
Topic概念定义 主题:RocketMQ中消息传输和存储的顶层容器,用于标识同类业务中逻辑的消息,可理解为消息的分类,主题消息的分类取决于业务,要发送的业务消息最好单独是一个Topic主题,以保证互相不被干扰Topi…...

实战OpenCV之图像显示
基础入门 OpenCV提供的功能非常多,图像显示是最基础也是最直观的一部分。它让我们能够直观地看到算法处理后的效果,对于调试和验证都至关重要。在OpenCV中,图像显示主要依赖于以下四个关键的数据结构和函数。 1、Mat类。这是OpenCV中最基本的…...

I2C的10-bit地址空间
10-bit地址空间: I2C支持 10-bit的设备地址,此时的时序如下图所示: 在 10-bit地址的 I2C系统中,需要两个帧来传输 slave的地址。第一个帧的前 5个 bit固定为 b11110,后接 slave地址的高 2位,第 8位仍然是 …...

TinyWebserver的复现与改进(6):定时器处理非活动连接
如果客户端长时间没有动作,会占用了许多连接资源,严重影响服务器的性能。因此需要通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。 定时器处理流程 SIGALARM触发:整个流程开始于一个 SIGALARM 信号&…...

ThinkPHP5 5.0.23 远程代码执行漏洞
目录 1、启动环境 2、漏洞利用 3、更改传参方式 4、修改参数 5、发送数据 1、启动环境 docker-compose up -d 2、访问靶机ip端口号8080 2、漏洞利用 使用burpsuite抓包软件抓包 3、更改传参方式 将 GET传参改为POST传参 4、修改参数 url参数 /index.php?scaptcha post参…...
C++鼠标键盘操作自动化
C鼠标键盘操作自动化 #pragma once #include <Windows.h> enum KEYS{A 65,W87,S83,D68,SHIFTVK_LSHIFT,ALT18,Tilde 126,//~TABVK_TAB,B66,SPACEVK_SPACE,ESCVK_ESCAPE,Q81 }; enum MOUSE {ML,MW,MR//左,中,右 }; class simulator//模拟器 { pu…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...