k8s中iptables与ipvs详解——2023.05

news2025/3/4 20:09:04

文章目录

      • 背景介绍
      • 一、Iptables模式
      • 二、IPVS模式(NAT模式)
      • 三、内部原理理解
        • Iptables
        • ipvs
        • 区别
      • 补充:CoreDNS

背景介绍

从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是ipvs采用的hash表,iptables采用一条条的规则列表。iptables又是为了防火墙设计的,集群数量越多iptables规则就越多,而iptables规则是从上到下匹配,所以效率就越是低下。因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能

每个节点的kube-proxy负责监听API server中service和endpoint的变化情况。将变化信息写入本地userspace、iptables、ipvs来实现service负载均衡,使用NAT将vip流量转至endpoint中。由于userspace模式因为可靠性和性能(频繁切换内核/用户空间)早已经淘汰,所有的客户端请求svc,先经过iptables,然后再经过kube-proxy到pod,所以性能很差。

ipvs和iptables都是基于netfilter的,两者差别如下:
ipvs 为大型集群提供了更好的可扩展性和性能
ipvs 支持比 iptables 更复杂的负载均衡算法(最小负载、最少连接、加权等等)
ipvs 支持服务器健康检查和连接重试等功能

在这里插入图片描述

一、Iptables模式

在这种模式下,kube-proxy监视API Server中service和endpoint的变化情况。对于每个service,它都生成相应的iptables规则,这些规则捕获到service的clusterIP和port的流量,并将这些流量随机重定向到service后端Pod。对于每个endpoint对象,它生成选择后端Pod的iptables规则。

如果选择的第一个Pod没有响应,kube-proxy将检测到到第一个Pod的连接失败,并将自动重试另一个后端Pod。
在这里插入图片描述

缺点:

iptables 因为它纯粹是为防火墙而设计的,并且基于内核规则列表,集群数量越多性能越差。

一个例子是,在5000节点集群中使用 NodePort 服务,如果我们有2000个服务并且每个服务有10个 pod,这将在每个工作节点上至少产生20000个 iptable 记录,这可能使内核非常繁忙。

二、IPVS模式(NAT模式)

在这种模式下,kube-proxy监听API Server中service和endpoint的变化情况,调用netlink接口创建相应的ipvs规则,并定期将ipvs规则与Kubernetes服 Services和Endpoints同步。保证IPVS状态。当访问Services时,IPVS将流量定向到后端pod之一。
IPVS代理模式基于netfilter hook函数,该函数类似于iptables模式,但使用hash表作为底层数据结构,在内核空间中工作。这意味着IPVS模式下的kube-proxy使用更低的重定向流量。其同步规则的效率和网络吞吐量也更高。
在这里插入图片描述

ipvs依赖iptables进行包过滤、SNAT、masquared(伪装)。 使用 ipset 来存储需要 DROP 或 masquared 的流量的源或目标地址,以确保 iptables 规则的数量是恒定的,这样我们就不需要关心我们有多少服务了

如果没有加载并启用ipvs模块,或者没有配置ipvs相关配置,则会被降级成iptables模式。

三、内部原理理解

Iptables

以k8s中的nginx这个service举例,这是一个nodePort类型的service
在这里插入图片描述

用命令
iptables-save |grep nginx
可以看到这个service中的iptables规则
在这里插入图片描述

找到他对外暴露的端口30601
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/nginx" -m tcp --dport 30601 -j KUBE-SVC-2CMXP7HKUVJN7L6M
找到他CLUSTER-IP的这一条规则,即139的规则
-A KUBE-SERVICES -d 10.102.19.139/32 -p tcp -m comment --comment "default/nginx cluster IP" -m tcp --dport 80 -j KUBE-SVC-2CMXP7HKUVJN7L6M
由这条规则看出,如果访问的是10.102.19.139的80端口。则会将访问转发到 KUBE-SVC-2CMXP7HKUVJN7L6M
在搜索 KUBE-SVC-2CMXP7HKUVJN7L6M的规则
iptables-save |grep KUBE-SVC-2CMXP7HKUVJN7L6M
在这里插入图片描述

主要是最后三条规则

-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-LNPQQIWGFNOA5PA2
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-5YYPNSSTAPIDIORU
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -j KUBE-SEP-245ABZALMPSVYEFI

继续查找第一条规则所转发的路径
iptables-save |grep KUBE-SEP-LNPQQIWGFNOA5PA2
在这里插入图片描述
主要是这条规则

-A KUBE-SEP-LNPQQIWGFNOA5PA2 -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.169.147:80

查找第二条转发的路径
iptables-save |grep KUBE-SEP-5YYPNSSTAPIDIORU
在这里插入图片描述

主要为这条规则

-A KUBE-SEP-5YYPNSSTAPIDIORU -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.124:80

查看第三条转发的规则
iptables-save |grep KUBE-SEP-245ABZALMPSVYEFI
在这里插入图片描述

主要是这条规则

-A KUBE-SEP-245ABZALMPSVYEFI -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.125:80

所以,现在理清整个iptables的规则
第一步,流量的入口.请求进入他nodePort的30601端口或者service的ip加80端口

-A KUBE-NODEPORTS -p tcp -m comment --comment "default/nginx" -m tcp --dport 30601 -j KUBE-SVC-2CMXP7HKUVJN7L6M
-A KUBE-SERVICES -d 10.102.19.139/32 -p tcp -m comment --comment "default/nginx cluster IP" -m tcp --dport 80 -j KUBE-SVC-2CMXP7HKUVJN7L6M

第二步:负载均衡,他是采用random和权重值的方式进行负载均衡,因为iptables是从上到下匹配的,但因为权重值的原因,例如此service有三个pod访问路径。他在访问第一条的时候概率为0.3333,访问第二条概率为0.5,第三条为1,而他又是由上向下按顺序匹配,使得访问三条规则的概率一样,这样实现负载均衡

-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-LNPQQIWGFNOA5PA2
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-5YYPNSSTAPIDIORU
-A KUBE-SVC-2CMXP7HKUVJN7L6M -m comment --comment "default/nginx" -j KUBE-SEP-245ABZALMPSVYEFI

第三步:将访问转发到实际的容器中

-A KUBE-SEP-LNPQQIWGFNOA5PA2 -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.169.147:80
-A KUBE-SEP-5YYPNSSTAPIDIORU -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.124:80
-A KUBE-SEP-245ABZALMPSVYEFI -p tcp -m comment --comment "default/nginx" -m tcp -j DNAT --to-destination 10.244.36.125:80

ipvs

我们查看kube-proxy的日志,能发现service默认是采用iptables为网络模式
在这里插入图片描述

所以,如果要使用IPVS,我们首先需要将默认的iptables切换为IPVS

service切换IPVS
使用那种网络模式是有kube-proxy决定的,所以修改网络模式就是修改kube-proxy容器内容
kubeadm方式修改ipvs模式

第一步:
kubectl edit configmap kube-proxy -n kube-system
在这里插入图片描述

第二步:找到mode字段,可以看到mode是空的,因为iptables是默认的网络模式,所以当mode为空时kube-proxy会选用iptables模式
在这里插入图片描述

第三步:给mode赋值ipvs并保存退出
在这里插入图片描述
在这里插入图片描述

最后一步,删除节点原kube-proxy的pod,让k8s自己重建,则网络模式会被修改为ipvs
在这里插入图片描述
在这里插入图片描述

可以看到网络模式已经被修改为ipvs
在这里插入图片描述

二进制方式修改ipvs模式
配置文件路径根据实际安装目录为准

# vi kube-proxy-config.yml
mode: ipvs
ipvs:
  scheduler: "rr“
# systemctl restart kube-proxy

ipvs规则
查看ipvs的规则
先安装ipvsadm
yum install ipvsadm -y
查看ipvs规则
ipvsadm -L -n
在这里插入图片描述

区别

Iptables VS IPVS
Iptables:
• 灵活,功能强大
• 规则遍历匹配和更新,呈线性时延
IPVS:
• 工作在内核态,有更好的性能
• 调度算法丰富:rr,wrr,lc,wlc,ip hash…

补充:CoreDNS

Service DNS名称
CoreDNS:是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中, CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。

参考文章:
k8s-service底层之 Iptables与 IPVS:https://blog.csdn.net/huahua1999/article/details/124237065
K8S中iptables和ipvs区别:https://blog.csdn.net/qq_36807862/article/details/106068871

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

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

相关文章

mysql ACID实现基本原理(面试题)

mysql ACID实现基本原理(面试题) 原子性一致性隔离性持久性 ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的…

中介效应分析全流程汇总

一、中介效应说明 中介效应主要研究自变量对因变量影响的过程中,自变量是否通过中介变量再对因变量产生影响,那什么情况表明中介效应存在呢?如果自变量对因变量影响过程中,中介变量在模型中有着桥梁般的作用,那说明中…

Service事务优化(方法能否被事务控制?)

1.updateFile方法是否应该开启事务? 目前如果在updateFile方法上添加Transactional,当调用updateFile方法前会开启数据库事务,如果上传文件过程时间较长(例如用户在上传超大视频文件),那么数据库的食物持续…

IP-Guard客户端上插入加密盘时提示格式化,能否禁止该弹窗?

客户端上插入加密盘时提示格式化,能否禁止该弹窗? 1、当Shell Hardware Detection服务启动时,操作系统检测硬件的速度要快于客户端,而此时操作系统是不能识别加密后的移动盘的,因此认为加密盘异常,提示需要格式化,策略-客户端配置,选择禁止windows7播放功能。配置后不…

AI绘画出《三体》里的叶文杰

文 / 高扬(微信公众号:量子论) 春节的时候,我看完了《三体》第一部。现在《三体》动画片、《三体》国内版电视剧相继上线,毁誉参半。 一千个读者心里有一千个哈姆雷特,正好谷雨最近在研究MidJourney。我让她…

C++进阶 —— multimap

目录 一&#xff0c;multimap介绍 二&#xff0c;multimap使用 一&#xff0c;multimap介绍 multimap是关联式容器&#xff0c;按照特定顺序存储键值对<key、value>&#xff0c;其中多个键值对之间的key可以重复&#xff1b;通常按照key排序和唯一标识元素&#xff0c;…

阿里一面凉凉,幸获内推华为技术四面,offer到手

上个月&#xff0c;哥们从某小厂离职&#xff0c;转投阿里云&#xff0c;简历优秀&#xff0c;很顺利地拿到了面试通知&#xff0c;但之后的进展却让哥们怀疑人生了&#xff0c;或者说让哥们懵逼的是&#xff0c;面试阿里云居然第一面就被吊打&#xff1f;让哥们开始怀疑自己&a…

大型复杂地质模型如何实现可视化?知名公司MineRP给你答案!

行业&#xff1a;采矿业 挑战&#xff1a;采矿业客户在寻找未开发的矿体和有效挖掘方面面临着越来越多的挑战&#xff1b;不同的采矿系统之间缺乏整合&#xff0c;呈现出零散的矿山运营视图&#xff1b;地质模型、采矿计划、时间表和点云以及其他需要可视化的矿山技术数据集可…

算法(63)-二叉树的递归-搜索二叉树-满二叉树-平衡二叉树-

目录 1.二叉树 2.搜索二叉树&#xff1a; 3.满二叉树&#xff1a; 4.平衡二叉树 1.二叉树 先、中、后序遍历 先序&#xff08;中、左、右&#xff09;&#xff1a;1&#xff0c;2&#xff0c;4&#xff0c;5&#xff0c;3&#xff0c;6&#xff0c;7 中序&#xff08;…

两个好用到爆的Python模块,建议收藏~

在日常开发工作中&#xff0c;经常会遇到这样的一个问题&#xff1a;要对数据中的某个字段进行匹配&#xff0c;但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据&#xff0c;里面省份一栏有的写“广西”&#xff0c;有的写“广西壮族自治区”&#xff0c;甚至还有写…

Axure教程——直方图(中继器)

本文将教大家如何用AXURE用中继器制作直方图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://yjkepz.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87842701 二、制作方法 &#xff08;1&#xff09;制作刻度表 设计5个刻…

golang链接mysql

复习一下 对象 package mainimport("fmt" )type User struct{uid intname string }func main(){var user Userfmt.Println(user) }协程 package mainimport("fmt" )func test(){fmt.Println("test func") }func main(){go test()fmt.Println(…

Socket安全(一)

文章目录 1. 安全Socket2. 保护通信3. 创建安全客户端Socket4. 选择密码组5. 事件处理器6. 会话管理 1. 安全Socket 前面介绍了Socket的基本使用&#xff0c;这里开始介绍Socket的安全问题&#xff0c;作为一个Internet用户&#xff0c;你确实有一些保护手段可以保护自己的隐私…

KUC755AE105 3BHB005243R0105 串行连接的自动配置

KUC755AE105 埃德蒙顿(pr web)-2007年5月23日-MatrikonOPC宣布为Allen-Bradley PLC发布MatrikonOPC服务器。该OPC服务器为所有Allen-3BHB005243R0105 分布式控制系统(DCS)提供了可靠的连接&#xff0c;代表了连接Allen-Bradley设备的真正的“一体化”解决方案。Allen-Bradley…

自动化测试中的失败截图和存log

如果我们在执行自动化测试的时候&#xff0c;希望能在失败的时候保存现场&#xff0c;方便事后分析。 对于UI自动化&#xff0c;我们希望截图在测试报告中。 对于api自动化&#xff0c;我们希望截取出错的log在测试报告中。 我开始自己蛮干&#xff0c;写了两个出错截图的方法。…

linux init系统和系统管理器-Systemd学习

一、Systemd 概述 1.1、init 程序介绍及其发展历程 Linux init程序是系统启动时第一个启动的进程&#xff0c;它负责初始化系统资源&#xff0c;加载操作系统核心模块&#xff0c;启动系统服务和用户进程。init程序是系统启动的重要组成部分&#xff0c;它为后续的系统操作提…

2023年上半年信息系统项目管理师上午真题及答案解析

1.“新型基础设施”主要包括信息技术设施、融合基础设施和创新基础设施三个方面。其中信息基础设施包括&#xff08; &#xff09;。 ①通信基础设施 ②智能交通基础设施 ③新技术基础设施 ④科教基础设施 ⑤算力基础设施 A.①③⑤ B.①④⑤ C.②③④ D.②…

【JavaSE】Java基础语法(三十六):File IO流

文章目录 1. File1.1 File类概述和构造方法1.2 绝对路径和相对路径1.3 File 类的常用方法1.4 递归删除文件夹及其下面的文件 2. IO2.1 分类2.2 字节输出流2.3 字节输入流2.4 文件的拷贝2.5 文件拷贝效率优化2.6 释放资源2.7 缓冲流2.8 编码表 3. commons-io 工具包3.1 API 1. F…

如何在竞争激烈的市场环境下打造技术铁粉:CSDN的案例分析

如何在竞争激烈的市场环境下打造技术铁粉&#xff1a;CSDN的案例分析 随着互联网的快速发展&#xff0c;技术平台不仅成为了人们获取信息、学习知识和交流经验的重要渠道&#xff0c;也成为了各大企业和个人展示自我、争夺市场份额的关键竞技场。在这个过程中&#xff0c;CSDN…

ts reference 报错 ReferenceError: AA is not defined解决方案

我先说重点&#xff01;你看懂了就不用往下看了 ///<reference path"2.ts" /> 像上面这种代码是要编译后才有效果的&#xff0c;所以有些小伙伴发现教程demo也跑不了&#xff0c;跟命名空间啥的没关系&#xff01; 正文 你如果也报我我下面这种错误&#xff…