【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

输出的信息如下:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息

golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息 package mainimport ("fmt""regexp""github.com/StackExchange/wmi""github.com/shirou/gopsutil/v3/disk" )// 定义 WMI 类结构体 type Win32_LogicalDiskToPartition struct {Ant…

高数4.2 积分方法-换元积分法

1. 第一类换元积分法 2. 第二类换元积分法

算法【Java】 —— 滑动窗口

滑动窗口 在上一篇文章中,我们了解到了双指针算法,在双指针算法中我们知道了前后指针法,这篇文章就要提到前后指针法的一个经典的使用 —— 滑动窗口,在前后指针法中,我们知道一个指针在前,一个指针在后&a…

JavaScript初级——运算符

一、算数运算符 1、运算符也叫操作符。通过运算符可以对一个或多个值进行运算,并获取运算结果。 比如:typeof 就是运算符,可以获得一个值的类型,他会将该值的类型以字符串的形式返回 (number、string、boolean、undefi…

【秋招笔试】8.12-4399秋招(第一套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

计算机网络12——IM聊天系统——项目分析和架构搭建

1、IM——聊天系统主要功能 (1)注册 根据:昵称,手机号,密码 (2)登录 根据:手机号,密码 (3)添加好友 根据:昵称 (4&…

Secure CRT 9.x版本高亮着色配置文件

Secure CRT的网络配置文件高亮显示,还在完善,逐渐适配不同厂商 设备名字自动蓝色高亮显示设备接口名高亮显示IPv4地址、IPv6地址、MAC地址高亮显示掩码、反掩码高亮显示设备SN号高亮显示接口状态、设备状态等高亮显示各路由协议高亮显示 【下载地址】效果…

XSS-复现dom破坏案例和靶场

目录 xss注入原理: xss是什么? xss原理: DOM: 闯关: 第一关:Ma Spaghet! 源码: 要求: 分析: 第二关: Jefff 源码: 要求: …

ubuntu基于sealos搭建k8s集群,helm3安装配置自动化扩容Prometheus,grafana出图展示,以及动态web搭建

1.项目简介 大方向:k8s云原生方向,运维技术,配置问题解决 解决技术:ubuntu模板机安装,配置远程xshell连接ubuntu,设置静态ip,换ubuntu阿里云源,配置集群间域名解析,解决双IP冲突网…

ubuntu下使用docker、socket、yolov5进行图像处理数据交互记录

ubuntu下使用docker、socket、yolov5进行图像处理数据交互记录 概述:主要实现了在宿主机上通过8000端口传递一张图像给docker镜像,然后镜像中处理后,通过8001端口回传处理后的图像给宿主机。 第一章、构建镜像 一、dockerfile文件 1.拉取…

尚品汇-前端面包屑平台属性、排序处理(三十三)

目录: (1)面包屑处理平台属性 (2)排序处理 (2)单点登录业务介绍 (1)面包屑处理平台属性 前端显示:面包屑显示效果 搜list搜索方法继续添加返回的平台属性…

Lora 全文翻译

作者: 地点:hby 来源:https://arxiv.org/pdf/2106.09685 工具:文心 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 摘要 自然语言处理的一个重要范式包括在通用领域数据上进行大规模预训练,并适应特定任务或…

php 在app中唤起微信app进行支付,并处理回调通知

<?phpnamespace app\api\controller;use think\facade\Db; use think\facade\Log;class Wxzf {

什么是视频比特率?与视频时长是什么关系

​ ‌比特率是指单位时间内传输或处理的比特的数量&#xff0c;单位为‌bps(‌bit per second)。‌ 比特率经常用于描述在电信和计算领域中数据传输的速度&#xff0c;也可以作为衡量音频和视频文件数据率的指标。比特率越高&#xff0c;传送的数据越大&#xff0c;音频或视频…

Notion快速使用

探索Notion&#xff1a;全能笔记软件的新世界 1. 什么是Notion&#xff1f; 在数字化时代&#xff0c;一款集颜值与功能于一身的笔记软件无疑是学习与工作的得力助手。今天&#xff0c;我要向大家介绍的就是这样一款全能型选手——Notion。Notion不仅以其高颜值在众多笔记软件…

拟南芥中基因家族序列的提取

1.拟南芥基因组数据的下载 phytozome 是一个收录植物基因组数据的网站&#xff0c;数据整理比较规范&#xff0c;已 经提供了去除可变剪切的 cds 和 protein 序列文件。只有 gff3 文件需要 过滤处理 2. 对拟南芥的注释文件gff3文件进行ID处理&#xff0c;最终得到以下4个文件 …

【uni-app】使用天气API做一个天气APP(全过程)- 实况、逐小时、40日

头一次使用uni-app写代码, 现学现卖, 写的不好的地方见谅, 申请个appid就可以运行 切换城市界面比较简单, 城市名称需要符合天气api参数规则, 录入的城市不要带市区县; 格式如: 青岛、铁西、海淀、沛县 APP效果 功能说明 实况天气逐小时预报未来7日天气未来40日天气空气质量详…

C语言 | Leetcode C语言题解之第336题回文对

题目&#xff1a; 题解&#xff1a; #define SIZE 9470 #define N 168000 #define P 13331typedef unsigned long long ULL; ULL p[301];//p[i]存储P^ivoid init()//初始化p进制次幂数组 {int i;p[0]1;for(i1;i<300;i){p[i]p[i-1]*P;} }int** palindromePairs(char**words,…

探索 Resolume Arena 7 - 引领 VJ 音视频创作的卓越软件

Resolume Arena 7 是一款专为 Mac 和 Windows 系统设计的强大 VJ 音视频软件&#xff0c;为创意专业人士和爱好者提供了丰富而出色的功能。 这款软件拥有直观且用户友好的界面&#xff0c;即使对于初学者来说&#xff0c;也能快速上手并开始创作。其强大的媒体管理功能&#x…

SpringBoot事务-调度-缓存

一.Spring Boot中的事务管理 设置事务 Transactional(isolation Isolation.DEFAULT) Transactional(propagation Propagation.REQUIRED) 开启事务 EnableTransactionManagement 1. 开启事务管理 要开启 Spring 的事务管理&#xff0c;你需要在你的 Spring Boot 应用中添加 …