k8s中iptables与ipvs详解——2023.05

背景介绍

从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

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: K8sIPVSiptables的区别在于它们是不同的负载均衡技术。IPVS是一种基于内核的负载均衡技术,它可以在内核层面进行负载均衡,提高了负载均衡的效率和性能。而iptables是一种基于用户空间的负载均衡技术,它需要在用户空间进行处理,因此效率和性能相对较低。在K8sIPVS通常用于服务的负载均衡,而iptables则用于网络策略的实现。 ### 回答2: Kubernetes(简称为k8s)是一种通用的开源平台,用于自动部署、扩展和管理容器化应用程序。在KubernetesIPVSiptables是两种不同的网络代理,它们之间有很多区别。 首先,IPVS是基于四层网络代理,而iptables是基于五层网络代理。IPVS通过监听网络流量并进行路由,可以对L4层上的传输控制协议(TCP)、用户数据报协议(UDP)和其他协议进行路由和负载均衡。这意味着IPVS可以实现精细的四层网络代理,并更好地处理垂直扩展负载均衡和在k8s集群上运行的数据库等服务。 另一方面,iptables可以处理传输控制协议(TCP)和用户数据报协议(UDP)之外的网络层上的协议(例如,Internet控制报文协议ICMP)。因此,在k8s使用iptables来代理网络不仅可以实现简单的TCP或UDP流量路由,还可以进行更细粒度的路由(如IP地址或网络端口)。 其次,IPVSiptables的工作方式也有所不同。IPVS使用IP地址和端口号将流量重定向到不同的后端Pod,而iptables使用更细粒度的规则,它通常会检查包的一些字段(如源和目的地址、端口和协议),并使用这些字段来匹配规则的条件。当数据包满足匹配条件时,iptables可以更容易地将流量重定向到特定的后端Pod,从而实现负载均衡。 因此,从功能和执行方式上来看,IPVSiptables都有其优劣。在使用k8s网络代理时,应根据特定的使用场景和需求以及负载均衡策略权衡二者之间的区别,选择最适合的选项。需要注意的是,在不同时期,k8s网络代理观念也会有所变化,甚至会出现新的选项。因此,在选择k8s网络代理时,应及时了解k8s的最新情况和趋势,以便为集群带来更好的网络性能和扩展性。 ### 回答3: k8sipvsiptables是两种不同的负载均衡技术,它们的作用都是将请求平均地分配到不同的后端服务,以提高系统的可用性。它们之间的区别包括以下几个方面: 1. 实现原理:ipvs是基于网络层实现的负载均衡技术,它使用Linux内核提供的网络层IP Virtual Server机制,通过虚拟IP地址实现负载均衡,将来自客户端的请求转发到不同的后端服务。而iptables是基于应用层实现的负载均衡技术,它使用Linux内核提供的iptables规则,针对特定的应用端口对请求进行过滤和转发。 2. 性能:由于ipvs是基于网络层实现的,所以它的性能比iptables更高。ipvs的转发速度比iptables快,同时ipvs可以使用网卡的多队列技术,支持多核CPU,可以更好地利用服务器的硬件资源。 3. 功能:ipvsiptables在功能上也有较大的区别。ipvs不仅可以实现负载均衡,还可以实现网络地址转换(NAT)、流量控制、反向代理等功能。而iptables则更适合实现网络安全相关的功能,如防火墙、入侵检测等。 4. 稳定性:ipvs作为Linux内核的一部分,稳定性更高。而iptables则可能会受到用户规则的影响,导致系统出现异常。 综上所述,ipvsiptables各有优缺点,在k8s的应用也会因情况而异。如果对性能有较高要求,需要进行流量控制或反向代理,则可以选择ipvs。如果需求更偏向于网络安全,则可以选择iptables

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小bā吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值