Kubernetes: kube-proxy 和 CNI 是如何协作的?

news2024/11/26 3:51:07

在 Kubernetes 中,kube-proxyCNI 插件协同工作,确保集群内 Pod 之间的互联互通。

Kube-proxy & CNI

如上图所示,假设我们有一个类型为 ClusterIPService,它对应两个位于不同节点的 Pod。

当我们从 Pod A 对该 Service 发起请求时:

  1. Pod A: 192.168.0.2 --> service-name(通过域名访问 Service)。
  2. CoreDNS 进行域名解析,返回 service-name 的 clusterIP 地址:
    Pod A: 192.168.0.2 --> 10.111.13.31
  3. Linux 内核的 Netfilter 进行 DNAT(目标网络地址转换),选择一个真实的后端 Pod IP:
    Pod A: 192.168.0.2 --> 192.168.1.4
  4. 如果请求的 Pod 位于不同节点,则 CNI 插件将根据其配置的网络模式:
    • 直接交由主机网络转发数据包,
    • 或者使用 VXLAN / IPIP 等方式封包之后再转发数据包。

以上是基本流程,但实际过程中涉及更多细节。

kube-proxy

kube-proxy 通常部署为 DaemonSet,确保所有 worker node 都有一个 pod。它连接 kube-apiserver,监听所有 Service(以及相关的 Endpoints、EndpointSlices)对象,然后通过 iptablesipvs 配置节点的 Netfilter

Netfilter 是 Linux 内核中用于处理网络数据包的框架。它工作在网络协议栈的多个位置(如输入、输出、转发),允许对数据包进行过滤、修改、重定向等操作。它的钩子机制允许在数据包处理的不同阶段插入自定义规则。

iptablesipvs 都使用了 Netfilter 的功能。

Service 的 ClusterIP 是一个 virtual IP(虚拟 IP,简称 VIP),虚拟的含义是它本身没有实际的网络实体,只是被用作数据包的处理逻辑。

kube-proxy 使用 iptables 或者 ipvs 设置 Service ClusterIP(虚拟 IP)和 DNAT/SNAT 规则。当 Pod A 访问 ClusterIP 时,Linux 内核会通过这些规则将虚拟 IP 替换为真实的 Pod IP。

查看 iptables 的规则形如:

查看 ipvs 的规则形如:

Service 可能会对应多个 Pod,此时就涉及到负载均衡算法。iptables 使用的是随机选择;而 ipvs 则支持多种算法,包括 rr(Round Robin 轮询,默认值)、lc(Least Connection 最少连接)、sh(Source Hashing 源 IP 哈希)等等十几种。

总之,kube-proxy 监听 Service 并使用 iptables 或者 ipvs 去配置 Linux 内核的数据包修改、转发规则。

CNI

当 Linux 内核完成 DNAT/SNAT 之后,接下来的步骤是发包。如果 Pod 的 MAC/IP 在集群网络中可达,则 CNI 插件无需做额外操作,直接交由主机网络发包即可。然而,很多时候无法满足此要求,因此 CNI 插件提供了 Overlay 这种网络模式,通过 VXLANIPIP 等方式再次封装数据包,然后进行传输。

有关 CNI 插件的网络模型,可以参考我之前的文章《Kubernetes CNI 网络模型概览:VETH & Bridge / Overlay / BGP》。

常见的 CNI 插件(如 FlanneCalico)使用的 VXLANIPIP 是基于 Linux 内核的功能,CNI 插件的主要作用是进行配置。

这意味着,kube-proxyCNI 插件都只是为 Linux 内核提供配置,而实际的数据包处理仍由内核完成。(某些 CNI 插件如 Cilium 通过 eBPF 等技术可以绕过内核,直接在用户空间处理数据包。)

无需 kube-proxy

kube-proxy 存在一些局限性,例如随着集群中 Service 和 Pod 数量的增长,iptables 的规则匹配效率会下降,即使 ipvs 进行了优化,依然面临性能开销。此外,频繁的 Service 和 Pod 更新会导致规则重新应用,可能带来网络延迟或中断。kube-proxy 还依赖于 Linux 内核的 Netfilter,一旦内核配置不当或不兼容,可能会出现网络问题。

事实上,kube-proxy 的工作相对简单,如果网络插件能够实现数据包的高效转发,并提供与 kube-proxy 等效的功能,那么就不再需要 kube-proxy 了。例如,Cilium 通过 eBPF 实现了无代理的服务流量转发,完全可以替代 kube-proxy

总结

在 Kubernetes 集群中,kube-proxyCNI 插件通过配置 Linux 内核的网络组件(如 NetfilterVXLAN 等),协同工作以确保 Pod 和 Service 之间的通信。随着 eBPF 等技术的发展,某些 CNI 插件能够实现无代理的服务转发,进一步优化了网络性能。

(关注我,无广告,专注于技术,不煽动情绪)


参考资料:

  • https://kubernetes.io/docs/reference/networking/virtual-ips/
  • https://docs.cilium.io/en/stable/network/kubernetes/kubeproxy-free/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2195051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言的柔性数组

目录 柔性数组1.柔性数组的特点:2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

MFC工控项目实例二十三模拟量输入设置界面

承接专栏《MFC工控项目实例二十二主界面计数背景颜色改变》 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Construction public:SenSet(CWnd* pParent NULL); //…

aws(学习笔记第三课) AWS CloudFormation

aws(学习笔记第三课) 使用AWS CloudFormation 学习内容: AWS CloudFormation的模板解析使用AWS CloudFormation启动ec2 server 1. AWS CloudFormation 的模版解析 CloudFormation模板结构 CloudFormation是AWS的配置管理工具,属于Infrastructure as Co…

黑马javaWeb笔记重点备份2:mybatis基础(注解方式)、数据库连接池概念、lombok使用

以下均来自:【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)】 https://www.bilibili.com/video/BV1m84y1w7Tb/?p75&share_sourcecopy_web&vd_source9332b8fc5ea8d349a…

AI 激活新势能,中小企业全媒体营销绽放无限可能

什么是全媒体营销: 全媒体营销是一种利用多种媒介渠道进行品牌、产品或服务推广的营销策略。它结合了传统媒体(如电视、广播、报纸、杂志)和新媒体(如互联网、社交媒体、移动应用等)的优势,以实现信息的广…

vivado 使用 UltraFast 设计方法系统级设计流程图

下图展示了 Vivado Design Suite 中包含的各种设计步骤以及特性。您可以通过赛灵思 Documentation Navigator“Design Hub View” 访问该图的互动版,单击每个步骤将链接至相关资源。 理解 UltraFast 设计方法概念 在设计开始初期就采取正确方法非常重要&#xf…

数据结构与算法笔记:概念与leetcode练习题

1、数组Array 时间复杂度 数组访问:O(1) 数组搜索:O(N) 数组插入:O(N) 数组删除:O(N) 特点 适合读,不适合写 数组常用操作 # 1、创建数组 a [] # 2、尾部添加元素 a.append(1) a.append(2) a.append(3) # 3、…

《Linux从小白到高手》理论篇:Linux的系统环境管理

List item 值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示…

大语言模型(LLM)综述

大语言模型(LLM)综述 正如缩放定律(Scaling Laws )所预测的那样, LLM 的通用语言理解和生成能力是通过在大量文本数据上训练数十亿个模型参数获得的。基于 Transformer 的大型语言模型 (LLM) 的最新进展(在 Web 规模的…

系统架构设计师⑧:软件工程-软件开发方法与模型

系统架构设计师⑧:软件工程-软件开发方法与模型 软件开发方法 常用的软件开发方法主要分为3类: 结构化法(比如C语言开发-面向过程), 面向对象法(比如C或者JAVA开发-面向对象), 面向…

永洪科技第八届全国用户大会,释放数据价值!

永洪科技,作为“致力于打造全球领先的数据技术厂商”,将于【2024年11月1日】,在【北京东方君悦大酒店】盛大召开“第八届永洪科技全国用户大会”。旨在通过AIBI的深入融合,更加智能且精准的展现及预测未来的数据走向,展…

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式,也是最简单的。存在多节点session丢失的情况,可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…

分层解耦-03.IOCDI-入门

一. IOC&DI入门 二.控制转移注解Component 因为dao和service接口的实现类对象需要传入到service和controller中,因此需要将dao和service代码加上Component注解,使之实现控制反转,将实现类对象交给IOC容器管理,成为IOC容器中…

字符编码发展史5 — UTF-16和UTF-32

上一篇《字符编码发展史4 — Unicode与UTF-8》我们讲解了Unicode字符集与UTF-8编码。本篇我们将继续讲解字符编码的第三个发展阶段中的UTF-16和UTF-32。 2.3. 第三个阶段 国际化 2.3.2. Unicode的编码方式 2.3.2.2. UTF-16 UTF-16也是一种变长编码,对于一个Unic…

构建快速应用,国内低代码开发平台的选择指南

本文盘点10款主流低代码开发平台,包括ZohoCreator、阿里宜搭等,分析其特点及应用场景。各平台各具优势,适用于不同企业和业务需求,建议企业根据自身需求和技术水平试用后选择。 一、Zoho Creator Zoho Creator 是一个低代码开发平…

软件设计之SSM(8)

软件设计之SSM(8) 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程,Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容: Mybatis 数据输出多表映射动态语句 1、数…

【Linux】基础IO(文件描述符、缓冲区、重定向)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 C文件IO相关操作 系统文件I/O open open函数返回值 文件描述符fd re…

Rspamd:开源垃圾邮件过滤系统

Rspamd 是一个开源垃圾邮件过滤和电子邮件处理框架,旨在根据各种规则评估消息,包括正则表达式、统计分析以及与 URL 黑名单等自定义服务的集成。 系统会分析每封邮件并做出判定,MTA可据此采取进一步行动,例如拒绝邮件或添加垃圾邮…

【GeekBand】C++设计模式笔记7_Bridge_桥接模式

1. “单一职责”模式 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。典型模式 DecoratorBridge 2. Bridge 桥接模式…

UE5+ChatGPT实现3D AI虚拟人综合实战

第11章 综合实战:UE5ChatGPT实现3D AI虚拟人 通过结合Unreal Engine 5(UE5)的强大渲染能力和ChatGPT的自然语言处理能力,我们可以实现一个高度交互性的AI虚拟人。本文将详细介绍如何在UE5中安装必要的插件,配置OpenAI…