Kubernetes集群如何用Ipvs替换Iptables
创始人
2025-07-13 15:50:37
0

我们都知道k8s中的 kube-proxy 是一个网络代理(proxy),它负责为 Kubernetes 集群中的服务提供负载均衡和服务发现功能。kube-proxy 会以不同的模式运行,其中 iptables 模式和 ipvs 模式是其中两种常见的模式。

iptables 和 ipvs 都是 Linux 内核中的网络代理技术,都可以用于实现负载均衡和服务发现。但两种模式之间存在以下几个区别:

实现方式不同

iptables 基于 iptables 规则实现,每个节点都会在 iptables 中添加一组规则来实现负载均衡和服务发现;而 ipvs 则是基于内核层面的负载均衡技术,可以实现更高效的网络代理处理。

性能不同

在高负载的情况下,ipvs 模式下的 kube-proxy 性能更好,因为它对网络的负载均衡处理是基于内核层面的,更加高效。但是,Iptables 模式在部分场景下也可以获得更好的性能。

功能不同

Iptables 模式下的 kube-proxy 在 Kubernetes 1.16 版本之前,使用 iptables 实现端口转发,只能实现基于TCP的负载均衡和服务发现,且不能支持四层负载均衡。而在 Kubernetes 1.16 版本中新增了 iptables-nat 模式,可以支持四层负载均衡。相比之下,ipvs 模式支持 TCP、UDP、SCTP 和四层负载均衡,支持 Online Hashed、IP Hash、Round Robin 和 Least Connection 等多种负载均衡算法。

iptable 的一个缺点在于由于工作在 Kernel 级别,如果 iptables 规则过于复杂,可能会对系统产生性能影响,并且由于 iptables 规则集中在 Kernel 中,修改比较困难。

在 Kubernetes 系统中,kubeadm 管理工具将默认选择 ipvs 模式来处理 kube-proxy,同时 Kubernetes 还提供了多种异常处理机制,如自动拉起、Rollback、故障转移等,以确保系统的可靠性、高可用性和容错性,从而避免了 iptables 处理过程中可能出现的问题,并且改善了整个系统在故障处理和容错性方面的性能。

操作是在所有节点上

开启内核支持

cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sysctl -p

开启ipvs支持

yum -y install ipvsadm ipset

临时生效

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

永久生效

cat > /etc/sysconfig/modules/ipvs.modules <

配置kube-proxy,在master上操作

因使用kubeadmin安装,所以操作方式如下

[root@master] # kubectl edit cm kube-proxy -n kube-system
configmap/kube-proxy edited

修改如下

kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
...
ipvs:
    excludeCIDRs: null
    minSyncPeriod: 0s
    scheduler: ""
    syncPeriod: 30s
  kind: KubeProxyConfiguration
  metricsBindAddress: 127.0.0.1:10249
  mode: "ipvs"                 #修改

在master重启kube-proxy

kubectl get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl delete pod -n kube-system  

验证ipvs是否开启

kubectl logs kube-proxy-cvzb4 -n kube-system
I0409 03:37:29.194391       1 server_others.go:170] Using ipvs Proxier.
W0409 03:37:29.194779       1 proxier.go:401] IPVS scheduler not specified, use rr by default
I0409 03:37:29.194981       1 server.go:534] Version: v1.15.3
I0409 03:37:29.214255       1 conntrack.go:52] Setting nf_conntrack_max to 524288
I0409 03:37:29.216744       1 config.go:96] Starting endpoints config controller
I0409 03:37:29.216812       1 controller_utils.go:1029] Waiting for caches to sync for endpoints config controller
I0409 03:37:29.217445       1 config.go:187] Starting service config controller
I0409 03:37:29.218320       1 controller_utils.go:1029] Waiting for caches to sync for service config controller
I0409 03:37:29.318218       1 controller_utils.go:1036] Caches are synced for endpoints config controller
I0409 03:37:29.318564       1 controller_utils.go:1036] Caches are synced for service config controller

验证

进入pod内,现在可以ping通servicename了,使用iptables时,发现ping的时候出现了如下错误,执行完上述操作,一切正常

root@xxxxxx-cb4c9cb8c-hpzdl:/opt# ping xxxxxx
PING xxxxxx.xxxxx.svc.cluster.local (172.16.140.78) 56(84) bytes of data.
From 172.16.8.1 (172.16.8.1) icmp_seq=1 Time to live exceeded
From 172.16.8.1 (172.16.8.1) icmp_seq=2 Time to live exceeded

错误

图片图片

解决(降低kube-proxy 版本)

kubectl -n kube-system set image daemonset/kube-proxy *=registry.aliyuncs.com/k8sxio/kube-proxy:v1.17.6

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...