首页 > 其他分享 >kube-proxy 三种模式分析

kube-proxy 三种模式分析

时间:2023-08-08 17:02:06浏览次数:42  
标签:iptables service ipvs 模式分析 proxy kube 内核

kube-proxy 三种模式分析


kubernetes 上面的 service 资源的实现方式是由 kube-proxy 提供的模式决定的

kube-proxy 提供三种模式:userspace (Kubernetes1.2版本之前)、iptables、ipvs(推荐的)

如果不满足ipvs时,会自动降为iptables模式

再讲三种模式前,先简单说下Service的工作原理;

在 kubernetes 平台之上,Pod 是由生命周期的,为了给客户端提供一个固定的访问端点,因此我们在客户端与服务端(pod)之间加了一层固定的中间层,这个中间层,我们称它为 Service,当某个 service 服务背后资源发生了改变时,service 根据标签选择器,会立即判断是 pod 多了一个还是少了一个,这种信息会立即反应到 API server 上,因为多个 pods 的信息是需要存在 kube-apiserver 的 etcd 中的,而 kube-proxy 能够 watch(监控) 到这种变化,并立即将其转化为 ipvs 规则或者 iptables 规则 ,它的转换是动态的,并且是实时的,同理如果一个pod 被删除了,它的状态信息也会反馈到 kube-apiserver 的 etcd 当中,而后这种变化会被kube-proxy watch监控到,它会立即将其转化为 iptables 或者 IPVS 规则,基本上都是立即同步的。

userspace 


当client pod 访问某个服务时,会先到达当前节点的内核空间 iptables 规则(我们知道 iptables规则就是 service 的规则),这个 service 规则的工作方式是 ,请求到达 service 以后,由 service 把它转化为本地监听到某个套接字上面的用户空间程序 kube-proxy,然后由它来处理,处理完以后再转给 service IP,最终代理到这个 service 关联和各个 pod, 实现调度,大家发现,这个请求由 client Pod 发给 service,service 还要回到监听这个端口的 kube-proxy, 再由 kube-proxy 再进行分发,kube-proxy 是工作在用户空间的进程,所以被称为userspace,这种方式,效率很低,原因在于,先要到内核空间,回到 kube-proxy 的用户空间,由各种 kube-proxy 封装成报文代理完成以后,再推到内核空间,然后有 iptables 规则进行转发,需要在内核空间与用户空间来回转换 2 次,效率低下。

 

iptables 


客户端 client Pod 发起请求时,直接请求 serviceIP,这个请求报文在本地内核空间中的serivce 规则所截取,直接调度到 server pod 上面,工作在内核空间,直接由 iptables 规则直接负责调度,前面哪种方式是由工作在 userspace 用户空间的 kube-proxy 方式进行调度,他们两个不同,而这种方式叫 iptables 实现;iptables 与之前 userspace 相比,完全工作在内核态而且不用在经过 kube-proxy 中转一次,不需要用户空间与内核空间来回调度,只需要在内核空间就完成了,iptables 模式性能更强,但这样有一个缺点,随着集群规模的扩大,iptables 数量会增加的比较快,不太适合大规模使用,所以就有了下面的 ipvs 模式。

IPVS


IPVS 知识点可以查看另外一篇文章:xxxxx客户端 client Pod 的请求到达内核空间以后,由 ipvs 规则来调度,内核空间直接调度给 pod 资源,所以第三种模型叫 IPVS 模型,ipvs 的工作过程上面已经讲的很清楚。

由于 kube-proxy 的 ipvs 模式需要提供 iptables 包过滤、SNAT、masquared(伪装)等,具体来说,ipvs 将使用 ipset 来存储需要 DROP 或 masquared 的流量的源或目标地址的规则集,以确保 iptables 规则的数量是恒定的,不会因为集群规模的扩大,而 iptables 条目增加,这里有一个关键是 SNAT,端口转换,通过上面的分析,我们只能使用 ipvs 的 NAT 模式。

很显然我们在安装并配置 kubernetes 的时候,你设定service工作在什么模式下,它就应该会生成对应的模式的规则,kubernetes  1.10 之前的版本,使用的是 iptables 规则,Kubernetes 1.2 版本之前是使用的 userspace 的模式,kubernetes 1.11 及以后默认使用的是 ipvs,如果ipvs 没有被激活,它将自动降级为 iptables 模式。

ipvs与iptables模式对比

ipvs 在大型集群规模部署时,性能更好;

ipvs 可以动态修改 ipset 集合;

ipvs 支持更为复杂的调度算法(最小负载、最少连接、加权等);

ipvs 支持服务器健康检查和连接重试等;

 

ipvs 是否可以满足所有场景

从上面看 ipvs 有这么多的好处?

那么是 ipvs 是否可以满足所有场景呢?答案是否定的?

因为 ipvs 无法提供包过滤、SNAT、masquared等功能,在某些场景下,还是需要与 iptables 搭配使用(如 Service 类型为 NodePort 时),ipvs 使用 ipset 来存储需要 DROP 或 masquared 的流量的源或目标地址,以确保 iptables 规则的数量是恒定不变的。

标签:iptables,service,ipvs,模式分析,proxy,kube,内核
From: https://www.cnblogs.com/muyi-yang/p/17614810.html

相关文章

  • 云原生周刊:KubeCon China 2023 详细议程公布 | 2023.8.7
    开源项目推荐SpiderpoolSpiderpool是一个Kubernetes底层网络解决方案。它提供丰富的IPAM功能和CNI集成能力,为开源社区的CNI项目提供支持,允许多个CNI有效协作。它能让底层CNI在裸机、虚拟机和任何公共云等环境中完美运行。PreevyPreevy是一款功能强大的命令行界......
  • kubernetes-Deployment和DaemonSet
    在Kubernetes中,Deployment和DaemonSet是两个不同的资源类型,用于不同的目的。Deployment用于在集群中运行可扩展的应用程序,可以管理Pod的副本数量,执行滚动升级和回滚操作。DaemonSet用于确保在集群的每个节点上运行一个Pod副本。它通常用于部署运行在每个节点上的系统级别的服务......
  • kubernetes-发布netcore项目
    一,安装k8s环境 参考:https://www.yuque.com/fairy-era/yg511q/lmy7gc二,通过Dockerfile文件将本地项目打包成镜像。发送到本地仓库或者阿里云(https://promotion.aliyun.com/ntms/act/kubernetes.html),方便在node机器上拉取镜像,不然每个node机器都要重新制作镜像。三,在k8s的ma......
  • Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
    Kubernetes(简称为:k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务发现、扩容缩容、监控,维护等一整套功能,努力成为跨主机集......
  • 使用kubeadm快速部署一个k8s集群
    1.部署Kubernetes集群方式(1)kubeadmKubeadm是一个K8s部署工具,提供kubeadminit和kubeadmjoin,用于快速部署Kubernetes集群。官方地址:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/(2)二进制包从github下载发行版的二进制包,手动部署每个组件,组成Kube......
  • Kubernetes概述
    1、kubernetes基本介绍kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。传统的应用部署方式......
  • 使用Helm在Kubernetes部署Elasticsearch和Kibana
    使用Helm在Kubernetes部署Elasticsearch和Kibana发布于 19/03/2022 by Lisenet我们将安装Elasticsearch和Kibana,并为 ElasticStack加上安全的https流量和基本安全设置。预先要求我们用的是 Kuberneteshomelab这篇文章.本文中使用的配置文件可在 GitHub. 复制下列......
  • Kubernetes中的ingress问题
    大佬们想问一下我这个问题该如何解决啊,ip访问没问题,但是域名就有问题了     ......
  • KubeSphere 社区双周报 | 本周六上海站 Meetup 准时开启 | 2023.7.21-08.03
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.07.21-2023.08.04。贡献者名单新晋KubeSphereCon......
  • kubelet启动报错
    报错启动不成功,查看/var/log/messages报错信息如下:Aug419:12:40k8s-master03kubelet:E080419:12:40.72626421343run.go:74]"commandfailed"err="failedtorunKubelet:validateserviceconnection:CRIv1runtimeAPIisnotimplementedforendpoint\......