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 间路由总结 概要 在前一篇讨论网络接口的内容中,详细分析了如何识别所有参与 Pod 间路由的接口。同时,以简明的非技术语言阐述了 Cilium 在 Kubernetes 集群中的路由机制。接…...
编译与汇编
本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析,语法分析,语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …...
对MySQL滴MVCC理解(超详细)
学习目标 什么是MVCC?MVCC的核心概念MVCC 的工作原理MVCC 的优势MVCC 的劣势 什么是MySQL中InnoDB下滴快照读和当前读?一、快照读(Snapshot Read)二、当前读(Current Read)三、快照读和当前读的区别四、当前…...
Mac玩Steam游戏秘籍!
Mac玩Steam游戏秘籍! 大家好!最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心,我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏,简单又实用! 第一步:下载Crossover 首先&…...
matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题
function [best_chromosome, best_fitness] optimized_genetic_algorithm()%% 遗传算法参数初始化% 定义井信息,包括坐标、管道长度、流量、压力等wells defineWells(); % 返回井的结构体数组N length(wells); % 注汽井数量% 遗传算法相关参数L_chromosome 20; …...
电商项目-基于ElasticSearch实现商品搜索功能(三)
本系列文章主要介绍基于 Spring Data Elasticsearch 实现商品搜索的后端代码,介绍代码逻辑和代码实现。 主要实现功能:根据搜索关键字查询、条件筛选、规格过滤、价格区间搜索、搜索查询分页、搜索查询排序、高亮查询。 主要应用技术:canal,…...
【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文档,然后解析出需要的字段 2.使用 pom文件引入 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redi…...
如何在Ubuntu上安装Cmake
前言 本文主要阐述如何在Ubuntu22.04上面安装cmake,具体可看下面的操作。 正文 一、环境 Ubuntu22.04 cmake-3.31.4.tar.gz 二、步骤 参考这个方案: 【运维】Ubuntu如何安装最新版本的Cmake,编译安装Cmake,直接命令安装…...
图解Git——分支开发工作流《Pro Git》
分支开发工作流 由于分支管理的便捷, 才衍生出这些典型的工作模式,你可以根据项目实际情况选择。 1. 长期分支 适用于持续开发和发布周期长的项目。常见的长期分支包括: master:只保留稳定的代码,通常用于生产环境。…...
没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放
引文: 组里的小伙伴在修改视频播放相关的代码,修改之前的方案使用CDN转发,可以实现流式播放,修改之后的代码因为没有正确的使用Http Range Request, 导致画面访问Azure Blob存储的视频没有实现流式播放,整理下线索在这…...
回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测
回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测 目录 回归预测 | MATLAB实RVM相关向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 RVM-Adaboost相关向量机集成学习多输入单输出回归预测是一种先进的机器学习方法,用于处理…...
开发人员学习书籍推荐(C#、Python方向)
作为一名开发人员,持续学习和提升自己的技术水平是至关重要的。如今,技术不断更新换代,新的开发框架、语言和工具层出不穷。对于刚入行的开发者或希望深入某一领域的工程师来说,选对书籍是学习的捷径之一。本篇文章将推荐一些经典…...
Springboot + vue 小区物业管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
基于深度学习的视觉检测小项目(十二) 使用线条边框和渐变颜色美化界面
到目前为止,已经建立起了基本的项目架构,样式表体系也初步具备,但是与成品的界面相比,还是差点什么。 我的界面效果图: 优秀demo的界面截图: 是的,我的界面太“平” 了,没有立体感&…...
基于OQuPy的量子编程实例探究:理论、实践与展望
基于OQuPy的量子编程探究:理论、分析与实践 一、引言 1.1 研究背景与意义 近年来,量子计算作为一种革命性的计算范式,在科学界与产业界引发了广泛关注。它依托量子力学原理,运用量子比特(qubit)进行信息处理,与传统计算相比,具备并行处理、指数级加速等显著优势,为解…...
【数据库】二、关系数据库
文章目录 二、关系数据库1 关系2 关系数据库3 完整性约束4 关系运算 二、关系数据库 1 关系 域:一组具有相同数据类型的值的集合。 笛卡尔积:所有域(域可相同)中所有取值的组合 例如:D1{1,2,3},D2{A,b}&…...
C#类型转换
C#是静态类型的语言,变量一旦声明就无法重新声明或者存储其他类型的数据,除非进行类型转换。本章的主要任务就是学习类型转换的知识。类型转换有显式的,也有隐式的。所谓显式,就是我们必须明确地告知编译器,我们要把变…...
【Vue】Vue组件--上
目录 一、组件基础 二、组件的嵌套关系 1. 基础架构 2. 嵌套 三、组件注册方式 1. 局部注册: 2. 全局注册: 四、组件传递数据 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…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
