kubernetes--kube-proxy组件深入理解

简介: 每台机器上都运行一个kube-proxy服务’它监听API server中service和endpoint的变化情 况,并通过iptables等来为服务配置负载均衡(仅支持TCP和UDP)

kube-proxy的工作原理

每台机器上都运行一个kube-proxy服务’它监听API server中service和endpoint的变化情 况,并通过iptables等来为服务配置负载均衡(仅支持TCP和UDP)

kube-proxy可以直接运行在物理机上,也可以以static pod或者DaemonSet的方式运行。 kube-proxy当前支持一下几种实现

•userspace:最早的负载均衡方案,它在用户空间监听一个端口,所有服务通过iptables 转发到这个端口,然后在其内部负载均衡到实际的Pod。该方式最主要的问题是效率低, 有明显的性能瓶颈。

•iptables:目前推荐的方案,完全以iptables规则的方式来实现service负载均衡。该方式 最主要的问题是在服务多的时候产生太多的iptables规则,非增量式更新会引入一定的时 延,大规模情况下有明显的性能问题

•ipvs:为解决iptables模式的性能问题,vl.8新增了ipvs模式,采用增量式更新,并可以 保证service更新期间连接保持不断开

•winuserspace:同userspace,但仅工作在windows上6c7a0b7c70444bfd870d1e7fc9b95d9b.png

netfilter的运行机制e60be972a1ff4a19963a1f50560b7fae.pngipvs和iptables有什么区别?

iptables是Linux操作系统中的一种防火墙技术,它能够通过配置规则来控制网络流量,从而保护网络安全。iptables能够支持多种网络负载均衡算法,但它并不能实现高性能的负载均衡,适用于对性能要求较低的场景。

ipvs是Linux操作系统中的一种内核级别的负载均衡技术,它能够在内核中实现负载均衡,从而提高网络服务的性能和可用性。ipvs能够支持多种负载均衡算法,并且具有高性能、高可用性和高可扩展性的特点。适用于对性能要求较高的场景。

总的来说,iptables更适用于控制网络流量和保护网络安全,而ipvs更适用于提高网络服务的性能和可用性。它们在功能上有所不同,但也可以结合使用,以实现更加完善的网络负载均衡。

from chatGPT

iptables在网络栈的hook点更多,而ipvs的hook点很少

我的理解: k8s为何要使用iptables? 主要是做负载均衡的,而iptables的链路较长hook较多。当iptables规则较多时会有性能问题,因此ipvs横空出世,解决了iptables的性能问题还基于netfilter对svc进行负载。


k8s的svc的雄心是做一个开箱即用的分布式负载均衡,而不像springcloud针对java做的哪一套.

iptables的hook点85d130e997884b3682e317816f1f4298.png

ipvs的hook点9ba0df507eb544998bfd91c0d4543efc.png

IPVS支持的锚点和核心函数674c60b8d4264d4b9d85aa5705e61e93.png

ipvs 的clusterIP 能ping通,而mode为iptables不行

ipvs mode会虚拟一个kube-ipvs0的设备,集群内所有的clusterIP svc都会绑定在这个设备上。因此可以ping.

iptables mode则不会对clusterip 绑定任何设备,所以无法ping通.dd95c9a8284a42d58569c0480f227169.png

如何切换?

kube-proxy 的实现方式可以是ipvs或者iptables.

mode字段进行切换,如果使用ipvs需要加载相应的内核模块.

#] more /etc/kubernetes/kube-proxy.yaml
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 10.50.10.31
clientConnection:
  kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig
clusterCIDR: 10.244.0.0/16
healthzBindAddress: 10.50.10.31:10256
kind: KubeProxyConfiguration
metricsBindAddress: 10.50.10.31:10249
mode: "ipvs"

ipvs安装

如果模块未安装kube-proxy会自动回退到iptables

# 1.安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadmin -y
# 2.添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 3.为脚本添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4

为何推荐ipvs?

iptables模式 如果有1000个pod,首个包过来以千分一的概率撞到,因此首包的延迟较高。另外一个原因是iptables是不做增量处理,每次都做全量改变,当iptables很大的时候会很慢.

而ipvs 进行了分层. 只会在iptables中增加一条iptables 规则 KUBE-NODE-PORT-TCP ,ipset 会把相同的规则(ip + 端口)放在ipset这简化了iptables。

-A KUBE-MARK-DROP -j MARK --set-xmark 0x8000/0x8000
-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE -A KUBE-SEP-55QZ6T7MF3AHPOOB -s 10.244.1.6/32 -m comment --comment "default/http:" -j KUBE-MARK-MASQ -A KUBE-SEP-55QZ6T7MF3AHPOOB -p tcp -m comment --comment "default/http:" -m tcp -j DNAT --to-destination 10.244.1.6:80 -A KUBE-SEP-KJZJRL2KRWMXNR3J -s 10.244.1.5/32 -m comment --comment "default/http:" -j KUBE-MARK-MASQ -A KUBE-SEP-KJZJRL2KRWMXNR3J -p tcp -m comment --comment "default/http:" -m tcp -j DNAT --to-destination 10.244.1.5:80 -A KUBE-SERVICES -d 10.101.85.234/32 -p tcp -m comment --comment "default/http: cluster IP" -m tcp --dport 80 -j KUBE-SVC-7IMAZDGB2ONQNK4Z
-A KUBE-SVC-7IMAZDGB2ONQNK4Z -m comment --comment "default/http:" -m statistic --mode random -probability 0.50000000000 -j KUBE-SEP-KJZJRL2KRWMXNR3J
-A KUBE-SVC-7IMAZDGB2ONQNK4Z -m comment --comment "default/http:" -j KUBE-SEP-55QZ6T7MF3AHPOOB

•iptables: 完全以iptables规则的方式来实现service负载均衡。该方式 最主要的问题是在服务多的时候产生太多的iptables规则,非增量式更新会引入一定的时 延,大规模情况下有明显的性能问题

•ipvs:为解决iptables模式的性能问题,vl.8新增了ipvs模式,采用增量式更新并可以 保证service更新期间连接保持不断开

为什么iptables或者ipvs在每个节点上都是全量呢?

执行如下命令你会发现在所有节点上都会这个clusterip 10.96.70.31 的ipvs规则。这是为何呢?

ansible k8s-all -m shell -a 'ipvsadm -l -n | grep -C 5 '10.96.70.31''

想一下之前那种集中式的负载均衡,所有流量过来都要经过那台负载均衡,而k8s直接将负载均衡做到了每一个节点上,这和svc的设计结合起来就是一个分布式的负载均衡.

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
1085 2
|
Kubernetes API 调度
在K8S中,各个组件及其作用是什么?
在K8S中,各个组件及其作用是什么?
|
Kubernetes 容器
Kubernetes附加组件Dashboard部署实战篇
关于如何在Kubernetes集群中部署和配置Dashboard组件的详细实战指南,涵盖了从创建证书、部署Dashboard、设置服务访问到登录认证的完整流程。
1572 0
Kubernetes附加组件Dashboard部署实战篇
|
Kubernetes 调度 容器
k8s descheduler 组件安装
k8s descheduler 组件安装
|
存储 Kubernetes API
在K8S中,Kubernetes的组件有哪些?
在K8S中,Kubernetes的组件有哪些?
|
存储 Kubernetes API
在K8S中,各组件是如何实现高可用的?
在K8S中,各组件是如何实现高可用的?
|
存储 Kubernetes API
在K8S中,各个组件及其作用是什么呢?
在K8S中,各个组件及其作用是什么呢?
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
存储 Kubernetes API
在K8S中,calico有哪些组件?都是做什么的?
在K8S中,calico有哪些组件?都是做什么的?
|
域名解析 Kubernetes 负载均衡
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?

热门文章

最新文章

推荐镜像

更多