【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?
目录
- Pod
- Kubernetes 网络模型
- 同一Pod上的容器之间进行通信
- 同一Node上的不同Pod之间进行通信
- 不同Node上的Pod之间进行通信
- Service
- 参考
Pod
首先来回顾一下Pod:
Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载,并封装一个或多个 Docker 容器、任何所需的存储以及唯一的 IP 地址。
Kubernetes 网络模型
集群中每一个 Pod 都会获得自己的、 独一无二的 IP 地址。一个Pod里的一组容器共享相同的IP地址。
Kubernetes 强制要求所有网络设施都满足以下基本要求(从而排除了有意隔离网络的策略):
- Pod 能够与所有其他节点上的 Pod 通信, 且不需要网络地址转译(NAT)
- 节点上的代理(比如:系统守护进程、kubelet)可以和节点上的所有 Pod 通信。
考虑到这些限制,我们剩下四个不同的网络问题需要解决:
- 容器到容器网络
- Pod 到 Pod 网络
- Pod 到服务网络
- 互联网到服务网络
同一Pod上的容器之间进行通信
通常,我们将虚拟机中的网络通信视为直接与以太网设备交互。默认情况下,Linux 将每个进程分配给根网络命名空间,以提供对外部世界的访问。如下图所示:
Pod 被建模为一组共享网络命名空间的 Docker 容器。Pod 中的容器都具有通过分配给 Pod 的网络命名空间分配的相同 IP 地址和端口空间,并且可以通过 localhost 找到彼此,因为它们驻留在同一命名空间中。
根本原因是使用Docker的一种网络模型:–net=container 能够让同一个Pod内的多个docker容器相互通信。
container模式指定新创建的Docker容器和已经存在的一个容器共享一个网络命名空间,也就是说新创建的Docker容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
在k8s中每个Pod容器有一个pause容器,它拥有独立的网络命名空间,在Pod内启动Docker容器时候使用 –net=container就可以让当前Docker容器加入到Pod容器拥有的网络命名空间(pause容器)。
同一Node上的不同Pod之间进行通信
从 Pod 的角度来看,它存在于自己的以太网命名空间中。不同的Pod存在于不同的网络命名空间里。
但是可以使用Linux虚拟以太网设备或由两个虚拟接口组成的veth对 将两个网络命名空间进行连接 。要连接 Pod 命名空间,我们可以将 veth 对的一侧分配给根网络命名空间,将另一侧分配给 Pod 的网络命名空间。然后使用网桥把两个虚拟网络组成为一个以太网。如下图所示:
在上面这个网络模型下,Pod之间是如何通信的呢?
- Pod 1 向其自己的以太网设备发送数据包eth0,该设备可作为 Pod 的默认设备。对于 Pod 1,eth0通过虚拟以太网设备连接到根命名空间veth0
- 网桥cbr0配置有veth0连接到它的网段。一旦数据包到达网桥,网桥就会使用 ARP 协议解析将数据包发送到的正确网段
- 当数据包到达虚拟设备veth1时,它会直接转发到 Pod 2 的命名空间以及该命名空间内的设备eth0
不同Node上的Pod之间进行通信
同样会用到虚拟接口和网桥。
- 数据包首先通过 Pod 1 的以太网设备发送,该设备与根命名空间 中的虚拟以太网设备配对。最终,数据包到达根命名空间的网桥
- ARP 将在网桥处失败,因为没有设备连接到具有数据包正确 MAC 地址的网桥。发生故障时,网桥将数据包从默认路由(根命名空间的eth0设备)发送出去。此时,路由离开节点并进入网络
- 我们现在假设网络可以根据分配给节点 的 CIDR 块将数据包路由到正确的节点。数据包进入目标节点(在 VM 2 上)的根命名空间eth0,并通过网桥路由到正确的虚拟以太网设备
- 最后,路由通过驻留在 Pod 4 命名空间内的虚拟以太网设备对完成
一般来说,每个节点都知道如何将数据包传递到在其内运行的 Pod。一旦数据包到达目标节点,数据包的流动方式与在同一节点上的 Pod 之间路由流量的方式相同。
Service
我们要知道,Pod的IP地址不持久,会随着扩展或缩小、应用程序崩溃或节点重启而出现和消失。哪怕重启一个Pod,它的IP也可能和前一次不一样。
所以Kubernetes 里使用Service来管理一组 Pod 的状态,允许我们跟踪一组随时间动态变化的 Pod 的IP 地址。Service充当 Pod 的抽象,并将单个虚拟 IP 地址分配给一组 Pod 的IP 地址。
任何发送到服务虚拟 IP 的流量都将被路由到与该虚拟 IP 关联的 Pod 集。这允许与 Service 关联的 Pod 集随时更改 ,只要虚拟IP不改,客户端就感觉不到Pod的变化。
创建新的 Kubernetes Service时,系统会创建一个新的虚拟 IP(也称为集群 IP)。集群内的任何位置,寻址到虚拟 IP 的流量都将负载均衡到与Service关联的一组Pod。实际上,Kubernetes 会自动创建并维护一个分布式集群内负载均衡器,该均衡器将流量分配到Service关联的健康 Pod。
参考
https://sookocheff.com/post/kubernetes/understanding-kubernetes-networking-model/
https://kubernetes.io/zh-cn/docs/concepts/services-networking/
相关文章:

【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?
目录 PodKubernetes 网络模型同一Pod上的容器之间进行通信同一Node上的不同Pod之间进行通信不同Node上的Pod之间进行通信Service参考 Pod 首先来回顾一下Pod: Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载,并封装一…...
神经网络冻结参数后权重仍然更新
1. 背景 冻结model中的cnn1层: model.cnn1.requires_grad False 运行后发现cnn1的参数仍然在更新 作为一个编程菜逼,我乍一看没毛病呀,凌晨1点的我越调越迷糊,终于最终还是找到了问题,还是基础不牢 2.原因 应使…...

STM32学习7 按键扫描
STM32学习7 按键扫描 一、实验电路介绍二、按键GPIO初始化三、扫描原理1. GPIO引脚配置2. 状态轮询3. 按键状态检测4. 循环扫描的优缺点优点:缺点: 四、一次扫描与持续扫描五、代码实现1. 头文件定义2. 函数实现3. 主体函数 一、实验电路介绍 本实验使用…...

图像物体的边界- 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个…...

.idea文件详解
.idea文件的作用: .idea文件夹是存储IntelliJ IDEA项目的配置信息,主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。一般用git做版本控制的时候会把.idea文件夹排除,因为这个文件下保存的…...

安卓JNI基础知识
JNI基础知识 JNI简介NDK配置开发环境JNI实践配置CMakeJNI编码JNI注册1.静态注册2.动态注册 编译方式CMakeLists编译Makefile编译命令编译 JNI和C/C代码分离Java调用C/C查看so中包含的方法 C/C调用Java打印C/C的log生成多个共享库soJNI调试 本文整理了JNI技术基础知识 JNI简介 …...

Nginx高级技巧:实现负载均衡和反向代理
文章目录 Nginx概述Nginx作用正向代理反向代理负载均衡动静分离 Nginx的安装 -->Docker3.1 安装Nginx3.2 Nginx的配置文件3.3 修改docker-compose文件 Nginx源码安装nginx常用命令nginx配置文件配置文件位置配置文件结构详情 Nginx的反向代理【重点】基于Nginx实现反向代理4…...

2024年2月最新微信域名检测拦截接口源码
这段PHP代码用于检测指定域名列表中的域名是否被封。代码首先定义了一个包含待检测域名的数组 $domainList,然后遍历该数组,对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下: 1. 定义待检测的域名列表。 2. 遍历域名…...

1、Linux-安装
一、Linux和Windows的一些区别 1、Linux严格区分大小写——【Windows创建文件夹时不区分大小写】 2、Linux中所有内容都以文件形式存储,包括硬件 3、Linux不靠拓展名区分文件类型,而是可以通过读取文件开头的一些字节来区分。 但是在实际使用中一般要…...
flutter 父组件调用子组件方法
当子组件是有状态组件 声明GlobalKey 如 声明 GlobalKey formKey GlobalKey<FormState>(); Form( key: formKey, autovalidateMode: AutovalidateMode.always, child: Column( children: <Widget>[ TextFormField( autofocus: true, initialValue: "a&quo…...

京东云硬钢阿里云:承诺再低10%
关注卢松松,会经常给你分享一些我的经验和观点。 阿里云刚刚宣布史上最大规模的全线产品降价20%,这热度还没过,京东云当晚就喊话:“随便降、比到底!,全网比价,击穿低价,再低10%”,并…...

Phoncent博客:探索AI写作与编程的无限可能
Phoncent博客,一个名为Phoncent的创新AIGC博客网站,于2023年诞生。它的创始人是庄泽峰,一个自媒体人和个人站长,他在网络营销推广领域有着丰富的经验。庄泽峰深知人工智能技术在内容创作和编程领域的潜力和创造力,因此…...

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范
【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁👊 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 💝 问题背景 大家好,我是寸铁!…...

SpringBootWeb快速入门
1.创建springboot工程,新建module 2.勾选web开发相关依赖 3.删除多余文件 4.新建类 5.启动类中运行main方法 6.启动 默认端口号8080 7.打开浏览器,地址栏输入 8.报错 9.原因,控制层位置放错,剪切controller层放进com.example …...

【书生·浦语大模型实战营】第 2 节 -课后作业
第二节 -轻松玩转书生浦语大模型趣味 Demo-课后作业 0.课程体验0.1 鸡兔同笼0.2 逻辑推理0.3 AI会毁灭人类吗? 1.课后作业1.1 基础作业1.1.1 作业11.1.2 作业2 0.课程体验 课程链接:https://github.com/internLM/tutorial 首先,这个课程是免费…...
Java如何使用OpenCV
背景:利用OpenCV功能批量处理视频 OpenCV(Open Source Computer Vision Library)是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的功能和工具,可用于处理图像和视频数据,并在各种应用中发挥着重要作…...

C++指针(三)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…...

消息中间件之RocketMQ源码分析(二十七)
Broker提交或回滚事务消息 当生产者本地事务处理完成并且Broker回查事务消息后,不管执行Commit还是Rollback,都会根据用户本地事务的执行结果发送一个End_transaction的RPC请求给Broker,Broker端处理该请求的类是EndTransactionProcessor 第一步&…...

C习题002:澡堂洗澡
问题 输入样例 在这里给出一组输入。例如: 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如: No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…...

智能双星:遥测终端机与柳林“巡检机器人“,助力智能运维新升级!
随着科技的不断发展,智能化、自动化的运维管理已经成为企业追求高效、稳定运营的重要方向。柳林遥测终端机、柳林e拍云平台以及巡检机器人的组合,为企业带来了一种全新的、前置的、无感的智能运维体验。 柳林遥测终端机,以其强大的数据采集和…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...