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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 每台机器上都运行一个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的设计结合起来就是一个分布式的负载均衡.

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4月前
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
411 0
|
4月前
|
Kubernetes API 调度
在K8S中,各个组件及其作用是什么?
在K8S中,各个组件及其作用是什么?
|
3月前
|
Kubernetes 容器
Kubernetes附加组件Dashboard部署实战篇
关于如何在Kubernetes集群中部署和配置Dashboard组件的详细实战指南,涵盖了从创建证书、部署Dashboard、设置服务访问到登录认证的完整流程。
518 0
Kubernetes附加组件Dashboard部署实战篇
|
4月前
|
存储 Kubernetes API
在K8S中,Kubernetes的组件有哪些?
在K8S中,Kubernetes的组件有哪些?
|
4月前
|
Kubernetes 调度 容器
k8s descheduler 组件安装
k8s descheduler 组件安装
|
4月前
|
存储 Kubernetes API
在K8S中,各组件是如何实现高可用的?
在K8S中,各组件是如何实现高可用的?
|
4月前
|
存储 Kubernetes API
在K8S中,各个组件及其作用是什么呢?
在K8S中,各个组件及其作用是什么呢?
|
4月前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?
|
4月前
|
存储 Kubernetes API
在K8S中,calico有哪些组件?都是做什么的?
在K8S中,calico有哪些组件?都是做什么的?
|
4月前
|
域名解析 Kubernetes 负载均衡
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?