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

【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之间是如何通信的呢?

  1. Pod 1 向其自己的以太网设备发送数据包eth0,该设备可作为 Pod 的默认设备。对于 Pod 1,eth0通过虚拟以太网设备连接到根命名空间veth0
  2. 网桥cbr0配置有veth0连接到它的网段。一旦数据包到达网桥,网桥就会使用 ARP 协议解析将数据包发送到的正确网段
  3. 当数据包到达虚拟设备veth1时,它会直接转发到 Pod 2 的命名空间以及该命名空间内的设备eth0

不同Node上的Pod之间进行通信

同样会用到虚拟接口和网桥。

在这里插入图片描述

  1. 数据包首先通过 Pod 1 的以太网设备发送,该设备与根命名空间 中的虚拟以太网设备配对。最终,数据包到达根命名空间的网桥
  2. ARP 将在网桥处失败,因为没有设备连接到具有数据包正确 MAC 地址的网桥。发生故障时,网桥将数据包从默认路由(根命名空间的eth0设备)发送出去。此时,路由离开节点并进入网络
  3. 我们现在假设网络可以根据分配给节点 的 CIDR 块将数据包路由到正确的节点。数据包进入目标节点(在 VM 2 上)的根命名空间eth0,并通过网桥路由到正确的虚拟以太网设备
  4. 最后,路由通过驻留在 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/

相关文章:

  • 【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)
  • 计算机网络(2)-----数据链路层
  • 集合篇之ArrayList
  • 【软件测试】--功能测试4-html介绍
  • untiy 室内灯光最佳实践
  • 爬取博客的图片并且将它存储到响应的目录
  • C#高级:DataGridView的详解
  • 练习2-线性回归迭代(李沐函数简要解析)
  • 命令行启动mongodb服务器的问题及解决方案 -- Unrecognized option: storage.journal
  • springboot 实现本地文件存储
  • SD NAND:为车载显示器注入智能与安全的心脏
  • selenium测试工具用来模拟用户浏览器的操作
  • MySQL常见面试题总结
  • Node.js基础---Express中间件
  • 利用 lxml 库的XPath()方法在网页中快速查找元素
  • C++类中的特殊成员函数
  • canvas绘制圆角头像
  • Codepen 每日精选(2018-3-25)
  • js操作时间(持续更新)
  • leetcode46 Permutation 排列组合
  • MaxCompute访问TableStore(OTS) 数据
  • Promise初体验
  • RxJS: 简单入门
  • 包装类对象
  • ------- 计算机网络基础
  • 开源SQL-on-Hadoop系统一览
  • 开源地图数据可视化库——mapnik
  • 力扣(LeetCode)21
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端相关框架总和
  • 一份游戏开发学习路线
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # 飞书APP集成平台-数字化落地
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (C++20) consteval立即函数
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net Redis的秒杀Dome和异步执行
  • .NET 回调、接口回调、 委托
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET导入Excel数据
  • @Bean, @Component, @Configuration简析
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [100天算法】-二叉树剪枝(day 48)
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [ACM] hdu 1201 18岁生日
  • [Android]使用Android打包Unity工程
  • [APIO2015]巴厘岛的雕塑
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成