当前位置: 首页 > news >正文

kubeneters-循序渐进Cilium网络(三)

文章目录

  • 概要
  • 命名空间之间的路由
  • 同一节点上的 Pod 到 Pod 路由
  • 跨节点的 Pod 间路由
  • 总结

概要

在前一篇讨论网络接口的内容中,详细分析了如何识别所有参与 Pod 间路由的接口。同时,以简明的非技术语言阐述了 Cilium 在 Kubernetes 集群中的路由机制。接下来,将展示具体实现。

我们仍将沿用上一章节形成的示意图:
在这里插入图片描述
继续采用相同的方法,模拟数据包从左上角的公寓(Pod)10.0.1.73 出发,传递至 Kubernetes 集群中的其他 Pod。在此之前,将看看命名空间的概念,并通过新的类比进一步完善示意图。

命名空间之间的路由

命名空间是一种逻辑对象组,用于在集群中实现隔离。然而,在默认配置的 Kubernetes 集群中,所有 Pod 无论是否属于同一命名空间,都可以彼此通信。因此,命名空间的隔离功能并不等同于限制 Pod 之间的通信。若需控制这种通信行为,需要通过创建网络策略来实现。
命名空间可以类比为集群中所有建筑的同一楼层。每座建筑内处于相同楼层的所有公寓在逻辑上归属于同一命名空间。以下示例展示了命名为 web 的命名空间结构。

$ kubectl get pods -n web -owide
NAME                              READY   STATUS    RESTARTS   AGE   IP           NODE                   NOMINATED NODE   READINESS GATES
redis-77598f9f86-g4dqg            1/1     Running   0          19h   10.0.1.73    k8sworker1.pci.co.id   <none>           <none>
redis-77598f9f86-hpmsh            1/1     Running   0          18h   10.0.0.222   k8smaster.pci.co.id    <none>           <none>
service-python-7f7c9d4fc4-jhp4d   1/1     Running   0          8d    10.0.1.135   k8sworker1.pci.co.id   <none>           <none>
webserver-5f9579b5b5-4vj77        1/1     Running   0          19h   10.0.0.150   k8smaster.pci.co.id    <none>           <none>
webserver-5f9579b5b5-qw2m4        1/1     Running   0          19h   10.0.1.48    k8sworker1.pci.co.id   <none>           <none>

这是一层楼上的四个公寓/Pod,被归类为同一个命名空间:
在这里插入图片描述
路由过程不涉及 Pod 所在的命名空间,仅使用目标 IP 地址。接下来,将展示如何从同一栋大楼(节点)中的公寓 10.0.1.73路由至公寓 10.0.1.48。

同一节点上的 Pod 到 Pod 路由

从 Pod 10.0.1.73 启程,目标为访问 10.0.1.48。首先,需查阅路由表以确定到达目标的路径。然而,在出发之前,必须获取目标的 MAC 地址。只有同时获得目标的 IP 地址和 MAC 地址,才能开始路由过程。因此,需要查看 ARP 表,查找目标的 MAC 地址。ARP 表包含了同一 IP 子网内已知的 MAC 地址与 IP 地址的映射。如果该地址不在表中,则会发送 ARP 请求,向网络中的其他设备查询目标的 MAC 地址。收到目标地址后,将其记录到 ARP 表中。此时,经过确认,已准备好启动路由过程,Pod 开始出发。
接下来,分析如何在源 Pod 10.0.1.73中追踪该过程。

$ kubectl exec -it -n web redis-77598f9f86-g4dqg  -- ip route
default via 10.0.1.70 dev eth0 mtu 1450
10.0.1.70 dev eth0 scope link

路由指令非常简洁,对于每个目标,均通过 10.0.1.70,并使用 Pod 中的唯一网络接口 eth0。可以从上述示意图中看出,10.0.1.70是 cilium_host 的 IP 地址。接下来,检查 ARP 表:

$ kubectl exec -it -n web redis-77598f9f86-g4dqg  -- arp -a

arp -a 命令列出了 ARP 表的内容,但其中没有任何记录。
一种发送侦查请求的方法是使用 arping 工具向目标发送请求。
需要注意的是,假如所使用镜像不包含这些 命令,可以使用下面的方式安装

kubectl exec -it -n web redis-77598f9f86-g4dqg  -- apt update
kubectl exec -it -n web redis-77598f9f86-g4dqg  -- apt install net-tools
kubectl exec -it -n web redis-77598f9f86-g4dqg  -- apt update arping

当然,建议尽量使用 busybox 和 netshoot镜像,这些镜像提供了在故障排除过程中非常有用的网络工具。
确认有了这些网络命令工具后,可以向目标发出请求:

$ kubectl exec -it -n web redis-77598f9f86-g4dqg  --  arping 10.0.1.48
arping: lookup dev: No matching interface found using getifaddrs().
arping: Unable to automatically find interface to use. Is it on the local LAN?
arping: Use -i to manually specify interface. Guessing interface eth0.
ARPING 10.0.1.48
58 bytes from 9a:a4:00:74:ef:bb (10.0.1.48): index=0 time=5.200 usec
58 bytes from 9a:a4:00:74:ef:bb (10.0.1.48): index=1 time=7.701 usec
58 bytes from 9a:a4:00:74:ef:bb (10.0.1.48): index=2 time=7.401 usec

缺失的信息,即目标的 MAC 地址,现已获取。接下来,可验证该信息是否已记录在源 Pod 的 ARP 表中:

$  kubectl exec -it -n web redis-77598f9f86-g4dqg  -- arp -a
? (10.0.1.70) at 9a:a4:00:74:ef:bb [ether] on eth0

所需信息已成功获取。然而,可能会疑惑为何在此未显示目标 IP 地址 10.0.1.48。在传统网络中,通常能够看到目标 IP 地址,但在 Kubernetes 集群中,网络由 Cilium 管理。此外,从源 Pod 的路由表可以观察到,所有目标的通信均通过 cilium_host 接口进行。
因此,即便是在同一 IP 子网内的 Pod 间进行通信,节点上的 cilium_host 依然会接收并处理所有流量。
此外,以下命令可用于快速显示集群中 cilium_host 和各节点的所有 IP 地址:

$ kubectl get ciliumnodes
NAME                   CILIUMINTERNALIP   INTERNALIP   AGE
k8smaster.pci.co.id    10.0.0.169         172.19.6.5   49d
k8sworker1.pci.co.id   10.0.1.70          172.19.6.8   47d

在传统网络的二层交换中,目标 MAC 地址通常与目标 IP 地址直接关联。然而,在 Kubernetes 网络中情况有所不同。那么,究竟是哪一个接口的 MAC 地址为 9a:a4:00:74:ef:bb ?以下将对此进行解析:

$ ip a | grep -B1 -A2 -i "9a:a4:00:74:ef:bb"
1857: lxc45ed99168f62@if1856: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 9a:a4:00:74:ef:bb brd ff:ff:ff:ff:ff:ff link-netns cni-635aef78-02ec-0461-5e37-830ca81c8812inet6 fe80::98a4:ff:fe74:efbb/64 scope linkvalid_lft forever preferred_lft forever

该 MAC 地址对应的是节点的 LXC 接口,这是源 Pod 通往目标的下一步路径。在本系列网络文章的第一篇中已提及,在 LXC 接口处有一个“服务者”等待(配置了一个服务组件),于引导通信流向目标
从传统的 Linux 路由视角来看,此处目标的通信路径并不直观。这是因为路由由 Cilium Agent 使用 eBPF 技术完成。鉴于目标与源 Pod 位于同一 IP 子网内,Cilium Agent 会将流量直接切换至目标的 LXC 接口,最终到达目标 Pod。
目标 Pod 在响应源 Pod 时,会经历相同的过程。为确保表述完整,以下展示了目标 Pod 中的路由表和 ARP 表:

$ kubectl exec -it -n web webserver-5f9579b5b5-qw2m4 -- ip route
default via 10.0.1.70 dev eth0 mtu 1450
10.0.1.70 dev eth0 scope link$ kubectl exec -it -n web webserver-5f9579b5b5-qw2m4 -- arp -a
? (10.0.1.70) at a6:bf:8b:47:ee:3e [ether] on eth0$ ip a | grep -B1 -A2 -i "a6:bf:8b:47:ee:3e"
1859: lxc9a32fc44db3c@if1858: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether a6:bf:8b:47:ee:3e brd ff:ff:ff:ff:ff:ff link-netns cni-980c48cf-6b31-2ca3-4b39-fa0b409a1b66inet6 fe80::a4bf:8bff:fe47:ee3e/64 scope linkvalid_lft forever preferred_lft forever

从传统 Linux 路由的视角来看,所有流量均被转发至 cilium_host,目标 MAC 地址则对应于节点中与 Pod 关联的 LXC 接口。这一行为与源 Pod 的情况完全相同。

跨节点的 Pod 间路由

接下来将探讨如何从源 Pod 10.0.1.73(位于某一节点)访问目标 Pod 10.0.0.222(位于另一节点)。初始的路由过程与之前相同,但当流量到达 LXC 接口的“服务者”时,目标 IP 地址被判定为不属于同一 IP 子网,因此流量会被引导至大厅中的 cilium_host。随后,流量通过 cilium_vxlan 接口进行路由,最终到达托管目标 Pod 的节点。
现将查看主机的路由表:

kubeuser@k8sworker1:~$ ip route
default via 172.19.7.254 dev eth0 proto static
10.0.0.0/24 via 10.0.1.70 dev cilium_host proto kernel src 10.0.1.70 mtu 1450
10.0.1.0/24 via 10.0.1.70 dev cilium_host proto kernel src 10.0.1.70
10.0.1.70 dev cilium_host proto kernel scope link
172.19.6.0/23 dev eth0 proto kernel scope link src 172.19.6.8

在此并未呈现太多信息,因为路由是通过 eBPF 完成的,并由 Cilium Agent 管理,正如前述所示。
另外,为了全面展示相关信息,Cilium Agent Pod 中的网络接口输出和 ip route 与节点的完全相同。这是因为在启动时,Cilium Agent 会将这些信息提供给节点。可通过以下命令检查 Cilium Agent:

kubectl exec -it -n kube-system cilium-kbwq7  -- ip a
kubectl exec -it -n kube-system cilium-kbwq7  -- ip route

因此,流量通过 VXLAN 隧道到达节点 目标节点。以下是该节点的路由表

kubeuser@k8smaster:~/yaml$ ip route
default via 172.19.7.254 dev eth0 proto static
10.0.0.0/24 via 10.0.0.169 dev cilium_host proto kernel src 10.0.0.169
10.0.0.169 dev cilium_host proto kernel scope link
10.0.1.0/24 via 10.0.0.169 dev cilium_host proto kernel src 10.0.0.169 mtu 1450
172.19.6.0/23 dev eth0 proto kernel scope link src 172.19.6.5

从传统的 Linux 路由视角来看,除了所有针对 Pod 子网的流量都会被引导到由 Cilium Agent 管理的 cilium_host 外,并未显示出更多的内容。这一过程与在其他节点所观察到的情况完全一致。当流量到达 cilium_vxlan 接口时,借助 eBPF 映射,流量将被引导通过一条隐秘通道,最终到达左上角 Pod 的 LXC 区域接口,进而抵达目标。

总结

Cilium 在 Kubernetes 中使用 eBPF 进行数据包路由的工作原理。在传统 Linux 路由视角下,流量会通过常规路由过程传递,但 Cilium 通过 eBPF 技术实现了更高效的路由。特别是,Cilium 使用了“服务者”模式和秘密通道,使得流量在 Kubernetes 集群内部更加迅速和精确地转发。
在跨节点路由中,Cilium 会将流量通过 cilium_vxlan 接口传递,进一步利用 eBPF 引导流量到达目标 Pod。而通过传统 Linux 路由命令查看时,虽然看不见所有的细节,但通过 Cilium 代理的管理和 eBPF 的支持,流量路由的速度显著提升。
总的来说,Cilium 的网络路由通过结合传统网络技术与现代的 eBPF 技术,提供了更高效、灵活的网络连接方案。
kubeneters-循序渐进Cilium网络(一)
kubeneters-循序渐进Cilium网络(二)
kubeneters-循序渐进Cilium网络(三)
[kubeneters-循序渐进Cilium网络(四)

相关文章:

kubeneters-循序渐进Cilium网络(三)

文章目录 概要命名空间之间的路由同一节点上的 Pod 到 Pod 路由跨节点的 Pod 间路由总结 概要 在前一篇讨论网络接口的内容中&#xff0c;详细分析了如何识别所有参与 Pod 间路由的接口。同时&#xff0c;以简明的非技术语言阐述了 Cilium 在 Kubernetes 集群中的路由机制。接…...

编译与汇编

本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析&#xff0c;语法分析&#xff0c;语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …...

对MySQL滴MVCC理解(超详细)

学习目标 什么是MVCC&#xff1f;MVCC的核心概念MVCC 的工作原理MVCC 的优势MVCC 的劣势 什么是MySQL中InnoDB下滴快照读和当前读&#xff1f;一、快照读&#xff08;Snapshot Read&#xff09;二、当前读&#xff08;Current Read&#xff09;三、快照读和当前读的区别四、当前…...

Mac玩Steam游戏秘籍!

Mac玩Steam游戏秘籍&#xff01; 大家好&#xff01;最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心&#xff0c;我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏&#xff0c;简单又实用&#xff01; 第一步&#xff1a;下载Crossover 首先&…...

matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题

function [best_chromosome, best_fitness] optimized_genetic_algorithm()%% 遗传算法参数初始化% 定义井信息&#xff0c;包括坐标、管道长度、流量、压力等wells defineWells(); % 返回井的结构体数组N length(wells); % 注汽井数量% 遗传算法相关参数L_chromosome 20; …...

电商项目-基于ElasticSearch实现商品搜索功能(三)

本系列文章主要介绍基于 Spring Data Elasticsearch 实现商品搜索的后端代码&#xff0c;介绍代码逻辑和代码实现。 主要实现功能&#xff1a;根据搜索关键字查询、条件筛选、规格过滤、价格区间搜索、搜索查询分页、搜索查询排序、高亮查询。 主要应用技术:canal&#xff0c;…...

【Vim Masterclass 笔记12】S06L26 + L27:Vim 文本的搜索、查找及替换同步练习(含点评课)

文章目录 S06L26 Exercise 07 - Search, Find, and Replace1 训练目标2 操作指令2.1. 打开 search-practice.txt 文件2.2. 同一行内的搜索练习2.3. 当前文件内的搜索练习2.4. 单词搜索练习2.5. 全局替换练习 3 退出 Vim S06L27 同步练习点评课 写在前面 Vim 的文本检索、查找与…...

Jsoup实现实时爬取

文章目录 1.作用2.使用pom文件引入示例代码(来自官网) 3.测试代码4.上线代码控制层业务层 1.作用 获取Html文档&#xff0c;然后解析出需要的字段 2.使用 pom文件引入 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redi…...

如何在Ubuntu上安装Cmake

前言 ​ 本文主要阐述如何在Ubuntu22.04上面安装cmake&#xff0c;具体可看下面的操作。 正文 一、环境 Ubuntu22.04 cmake-3.31.4.tar.gz 二、步骤 参考这个方案&#xff1a; 【运维】Ubuntu如何安装最新版本的Cmake&#xff0c;编译安装Cmake&#xff0c;直接命令安装…...

图解Git——分支开发工作流《Pro Git》

分支开发工作流 由于分支管理的便捷&#xff0c; 才衍生出这些典型的工作模式&#xff0c;你可以根据项目实际情况选择。 1. 长期分支 适用于持续开发和发布周期长的项目。常见的长期分支包括&#xff1a; master&#xff1a;只保留稳定的代码&#xff0c;通常用于生产环境。…...

没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放

引文&#xff1a; 组里的小伙伴在修改视频播放相关的代码&#xff0c;修改之前的方案使用CDN转发&#xff0c;可以实现流式播放&#xff0c;修改之后的代码因为没有正确的使用Http Range Request, 导致画面访问Azure Blob存储的视频没有实现流式播放&#xff0c;整理下线索在这…...

回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测

回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测 目录 回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 RVM-Adaboost相关向量机集成学习多输入单输出回归预测是一种先进的机器学习方法&#xff0c;用于处理…...

开发人员学习书籍推荐(C#、Python方向)

作为一名开发人员&#xff0c;持续学习和提升自己的技术水平是至关重要的。如今&#xff0c;技术不断更新换代&#xff0c;新的开发框架、语言和工具层出不穷。对于刚入行的开发者或希望深入某一领域的工程师来说&#xff0c;选对书籍是学习的捷径之一。本篇文章将推荐一些经典…...

Springboot + vue 小区物业管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…...

基于深度学习的视觉检测小项目(十二) 使用线条边框和渐变颜色美化界面

到目前为止&#xff0c;已经建立起了基本的项目架构&#xff0c;样式表体系也初步具备&#xff0c;但是与成品的界面相比&#xff0c;还是差点什么。 我的界面效果图&#xff1a; 优秀demo的界面截图&#xff1a; 是的&#xff0c;我的界面太“平” 了&#xff0c;没有立体感&…...

基于OQuPy的量子编程实例探究:理论、实践与展望

基于OQuPy的量子编程探究:理论、分析与实践 一、引言 1.1 研究背景与意义 近年来,量子计算作为一种革命性的计算范式,在科学界与产业界引发了广泛关注。它依托量子力学原理,运用量子比特(qubit)进行信息处理,与传统计算相比,具备并行处理、指数级加速等显著优势,为解…...

【数据库】二、关系数据库

文章目录 二、关系数据库1 关系2 关系数据库3 完整性约束4 关系运算 二、关系数据库 1 关系 域&#xff1a;一组具有相同数据类型的值的集合。 笛卡尔积&#xff1a;所有域&#xff08;域可相同&#xff09;中所有取值的组合 例如&#xff1a;D1{1,2,3}&#xff0c;D2{A,b}&…...

C#类型转换

C#是静态类型的语言&#xff0c;变量一旦声明就无法重新声明或者存储其他类型的数据&#xff0c;除非进行类型转换。本章的主要任务就是学习类型转换的知识。类型转换有显式的&#xff0c;也有隐式的。所谓显式&#xff0c;就是我们必须明确地告知编译器&#xff0c;我们要把变…...

【Vue】Vue组件--上

目录 一、组件基础 二、组件的嵌套关系 1. 基础架构 2. 嵌套 三、组件注册方式 1. 局部注册&#xff1a; 2. 全局注册&#xff1a; 四、组件传递数据 1. 基础架构 2. 传递多值 3. 动态传递数据 五、组件传递多种数据类型 1. Number 2. Array 3. Object 六、组…...

21、Transformer Masked loss原理精讲及其PyTorch逐行实现

1. Transformer结构图 2. python import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_printoptions(precision3, sci_modeFalse)if __name__ "__main__":run_code 0batch_size 2seq_length 3vocab_size 4logits torch.randn(batch…...

UE4动画蓝图实战:用双骨骼IK节点搞定手部穿模,附完整蓝图节点截图

UE4动画蓝图实战&#xff1a;双骨骼IK节点解决手部穿模的完整指南在角色动画开发中&#xff0c;手部穿模问题堪称"视觉杀手"。想象一下精心设计的角色挥拳时&#xff0c;拳头直接穿过墙壁或敌人身体——这种违和感足以毁掉整个场景的沉浸感。本文将彻底解决这个痛点&…...

Sentinel-3B OLCI 3 级全球分箱地球观测降分辨率(ERR)叶绿素(CHL)数据,版本 2022.0

Sentinel-3B OLCI Level-3 Global Binned Earth-observation Reduced Resolution (ERR) Chlorophyll (CHL) Data, version 2022.0 简介 叶绿素 a 数据集提供全球网格化的表层叶绿素 a 浓度&#xff08;浮游植物生物量的替代指标&#xff09;合成数据。CHL 支持时间序列和气候…...

Office RibbonX Editor:让Office界面定制变得像搭积木一样简单

Office RibbonX Editor&#xff1a;让Office界面定制变得像搭积木一样简单 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbon…...

当 AI Coding 进入复杂企业系统,为什么提效远没有宣传里那么美好 ?

以 Claude Code、Codex 为代表的自主编码智能体&#xff08;Coding Agents&#xff09;&#xff0c;正在以惊人的速度席卷软件开发者生态。与此同时&#xff0c;类似“10 倍开发效率”“普通人也能随手构建软件”“程序员即将失业”的说法&#xff0c;也随处可见。这种不分场景…...

特定任务需求场景下的过约束并联机构构型设计与控制方法【附代码】

✨ 长期致力于曲面加工、构型综合、运动学和动力学建模、性能评价、多目标优化、滑模控制、鲁棒控制、视觉传感技术研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;…...

基于TESS光变曲线与深度学习的O型星物理参数预测研究

1. 项目概述与核心挑战在恒星天体物理研究中&#xff0c;大质量O型星扮演着至关重要的角色。它们不仅是宇宙中光度最高的天体之一&#xff0c;其强烈的辐射、恒星风和最终的超新星爆发&#xff0c;更是驱动星系化学演化和能量注入星际介质的关键引擎。然而&#xff0c;深入理解…...

3步高效解决TranslucentTB任务栏透明化难题:完整配置指南

3步高效解决TranslucentTB任务栏透明化难题&#xff1a;完整配置指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Window…...

从Stable Diffusion到DiT:为什么说Transformer是扩散模型的下一站?

从Stable Diffusion到DiT&#xff1a;Transformer如何重塑扩散模型的未来 在图像生成领域&#xff0c;扩散模型正经历着从U-Net架构向Transformer架构的范式转移。这一转变不仅仅是技术组件的简单替换&#xff0c;而是代表着生成式AI在可扩展性、训练效率和模型容量方面的重大突…...

从配置到运行时:Forge Admin 的动态 API 配置管理是怎么做的

问题&#xff1a;同一个接口&#xff0c;今天要加认证、明天要加加密、后天要限流&#xff0c;这些行为散落在拦截器、过滤器、注解里&#xff0c;改一次牵一发动全身&#xff0c;怎么集中管理和动态刷新&#xff1f; 1. 这个问题在企业后台里为什么常见 在企业后台开发中&am…...

白嫖Codex!一行代码不花接入国产DeepSeek-v4-pro,从此告别ChatGPT月费

Codex 如何接入国产模型 DeepSeek-v4-pro 保姆级教程 使用 Claude Code、Codex 已经好几个月了&#xff0c;不得不感叹现在的 AI 工具真的太强大了。目前市面上很多 Claude Code 如何接入大模型的教程&#xff0c;但 Codex 却比较少&#xff0c;一方面因为 Codex 需要 ChatGPT …...