K8s 网络新手教程(Kubernetes Networking Guide for Beginners)

本文主要是介绍K8s 网络新手教程(Kubernetes Networking Guide for Beginners),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

K8s 网络新手教程(Kubernetes Networking Guide for Beginners)

原文链接: Kubernetes Networking Guide for Beginners

译者注: 建议对照阅读 The Layers of the OSI Model Illustrated. (有机会翻译下这篇, 挖坑不填 )

译者注:

  • Node: Pod 运行的环境。根据实际情况, 可以是虚拟机或物理机。
  • Pod: Kubernetes 创建和管理计算资源的最小可部署单元, 类似于虚拟机/物理机的"逻辑主机"。
  • Container: 进程及其相关依赖构成的标准化的集合。
  • Service: 对运行在多个 Pod 中的单个应用程序的一种抽象。

由于没有预先了解过相关的网络知识,我在初学 Kubernetes 时, 经常会迷失在各种高深的行话和晦涩的图表中。

为了避免后来人遇到和我一样的情况, 我在这里总结了一份为新手学习 Kubernetes 需要预先了解的网络知识。

学习 Kubernetes 网络, 需要理解以下五个基本的知识点:

  • 同一个 Pod 中的各个 Containers 之间的通信
  • 同一个 Node 中的各个 Pod 之间的通信
  • 不同 Node 的 Pod 之间的通信
  • Pod 和 Service 之间的通信
  • DNS 如何工作?如何发现 IP 地址?
    在这里插入图片描述

同一个 Pod 中的各个 Containers 之间的通信

假设有两个运行在同一个 Pod 的 Container, 它们之间如何通信呢?

答案是: 类似于在同一个主机通信的进程, 他们通过 localhost 和端口号。

这是因为同一个 Pod 的容器共享相同的 network namespace —— 这使得它们可以共享网络资源。

什么是网络名称空间(network namespace)?

网络名称空间是网卡(Network Interface)和路由表的集合。

名称空间可以减少同一个虚拟机中的碰撞和冲突。
(在同一个网络名称空间下监听同一个端口号会发生冲突)

每个 Pod 中都有一个 pause container, 负责维护 Pod 的网络名称空间。

译者注:
更多关于 pause container: The Almighty Pause Container

每个 Pod 拥有独立的网络名称空间,在同一个 Pod 的 Container 因此享有相同的网络名称空间。这就是为什么同一个 Pod 下的容器之间可以通过 localhost 通信的原因。同时, 这也是为什么同一个 Pod 的不同 Container 的 port 会冲突的原因。

在这里插入图片描述

同一个 Node 的不同 Pod 之间的通信

每个 Pod 有自己的网络名称空间和自己的 IP 地址。

Pod 认为自己有一个普通的网络以太网设备 eth0 来处理网络请求,这是 Kubernetes 创建的虚拟的以太网设备。

这个 虚拟以太网设备 是连接 Pod 和 Node 网络的一个通道,它的一端是 Pod 的 eth0,一端是 Node 的 vethX

Pod 发送请求到其他 Node 时, 请求会通过 eth0 转发到它所在 Node 对应的 vethX 接口。

那么, 这个请求又是怎么到达其他 Pod 的呢?

答案是通过 网桥(Network Bridge)

什么是网桥?

网桥是连接独立子网的网络设备。当请求达到网桥, 它会询问所有连接它的网络设备是否是该请求的目的 IP 指定的设备。然后, 它会将请求转发到对应的设备。

(每个 Pod 有自己的 IP 地址, 并且它知道自己的 IP 地址是什么)

在 Kubernetes 中, 这个网桥叫做 cbr0。每个 Node 的 cbr0 保存了它的所有 Pod 的转发信息, 以此将同一 Node 下的所有 Pod 连接起来。

在这里插入图片描述

不同 Node 的 Pod 之间的通信

注: 这部分不同的云厂商/网络插件实现可能会有所不通过。

那么不同 Node 的 Pode 之间如何进行通信呢?

当网桥询问了所有它所有连接的 Pod 后, 发现并没有找到目的 IP 对应的设备。

之后, 网桥会找到默认网关, 上升到集群级别查询该 IP 地址。

集群级别有一个不同 Node 的路由表, 登记 Node 内的 Pods 所在的子网。

举个例子, Kubernetes 为 Node 1 的 Pods 提供 IP 地址: 100.96.1.1, 100.96.1.2 等。Kubernetes 为 Node 1 的 Pods 提供 IP 地址: 100.96.2.1, 100.96.2.2 等。

查询该路由表, 会将发送到 100.96.1.xxx 的请求转发到 node1,将发送到 100.96.2.xxx 的请求转发到 node2。

在这里插入图片描述

Pod 和 Service 之间的通信

Kubernetes 的 Service 将一个 IP 地址绑定到多个 Pod。网络请求发送到一个终端(Endpoint, 域名/IP 地址), service 代理将请求转发到该 service 对应的 Pod。

Kubernetes 通过在每个 Node 运行的 kube-proxy 进程实现这个功能。

kube-proxy 将虚拟 IP 地址映射为一组实际的 Pod IP 地址。

一旦 kube-proxy 将 Service 的虚拟 IP 映射到了一个实际的 Pod IP, 剩下的操作就和和上面提到的流程一样了。

译者注:

  • 更多关于 kube-proxy: Virtual IPs and service proxies

DNS 是如何工作的?它是如何发现 IP 地址的?

Kubernetes 集群通过 DNS 解析将域名映射为对应的 IP 地址。

Kubernetes 集群会给每个服务分配一个像 my-service.my-namespace.svc.cluster.local 这样的域名。

同样地,Kubernetes 也会为 Pod 自动分配 DNS 域名。你也可以通过 YAML 文件的 hostnamesubdomain 字段指定 Pod 的域名。

这样,当通过域名访问 Service 时, DNS 服务就会将它解析为对应的 IP 地址。

然后 kube-proxy 会将 Service 的 IP 地址转化为 Pod 的 IP 地址。最后就可以根据该 Pod 是否在同一个 Node 按照上述流程将请求转发到对应的 Container。

译者注:

在这里插入图片描述

==================== 我是分割线 ====================
号外~ 号外~
字节跳动 2022 届校招提前批开始啦~

如何加入我们:
字节跳动校招内推码: UQAYUMY
投递链接: https://jobs.toutiao.com/s/eGx5Pv4
或直接发送简历到邮件:yangling.leo@bytedance.com

我们是谁:
字节跳动基础架构团队主要负责公司私有云建设,支撑着今日头条、抖音、西瓜视频等多款明星产品。
我们积极拥抱开源和创新的软硬件架构,构建一系列基础设施引导研发活动的最佳实践,为整个公司的发展保驾护航。

我们在找谁:
2022届获得本科及以上学历,计算机相关专业
热爱计算机科学和互联网技术
掌握扎实的计算机基础知识,深入理解数据结构、算法和操作系统知识

这篇关于K8s 网络新手教程(Kubernetes Networking Guide for Beginners)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355591

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑