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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

基于Python实现温度单位转换器(新手版)

《基于Python实现温度单位转换器(新手版)》这篇文章主要为大家详细介绍了如何基于Python实现温度单位转换器,主要是将摄氏温度(C)和华氏温度(F)相互转换,下面小编就来和大家简单介绍一下吧... 目录为什么选择温度转换器作为第一个项目项目概述所需基础知识实现步骤详解1. 温度转换公式2. 用户输入处

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl