QCon北京|3天沉浸式学习,跳出信息茧房。 了解详情
写点什么

Kubernetes 网络概念初探

  • 2021-05-04
  • 本文字数:2906 字

    阅读完需:约 10 分钟

Kubernetes网络概念初探

Kubernetes 网络是 Kubernetes 中一个核心概念。简而言之,Kubernetes 网络模型可以确保集群上所有 Kubernetes pod 都能进行通信。此外,在 Kubernetes 网络模型的基础上,Kubernetes 还有其他核心概念,即 Kubernetes Services 和 Kubernetes Ingress。


本文将使用系统模型的方法探索 Kubernetes 网络。我们将开发一个简单的模型来了解容器与容器间的通信以及 Pod 之间的通信。


如何看待网络

毫无疑问,网络是一个极为广泛且复杂的领域,它需要多年的理论积累以及实践才能精通。在本文中,我们将在概念层面对网络进行梳理,暂时不涉及实现层面的细节。


理想的网络模型


上图将网络描述为 Network Graph,该网络由一组节点以及节点之间的链接组成。如果当且仅当节点之间存在联系时,一个节点才可以与另一个节点交换信息。


消息交换框架


一个节点,即源节点,通过将消息放入目标的输入队列,与另一个节点,即目标交换消息。消息交换由源节点观察到的 Send Event,Send·M 和在目标节点观察到的相应的 Receive Event,Recv·M 表示。


消息交换行为


网络中的节点要么是 Process,要么是 Switch。Process 会产生和消耗消息,Switch 根据其转发信息库(FIB)处理消息。


S1 和 S2 的转发信息库(FIB)


上图描述了 Switch 的转发信息库(FIB)S1 和 S2。在收到消息时,每台 Switch 都会查询其转发信息库,以决定是发送(deliver)、转发(forward)还是丢弃(discard)该消息。


Switch:

  • 将信息的请求头,即源地址、源端口、目标地址和目标端口与其转发信息库相匹配

  • 执行相关操作,默认为弃置(discard)

Kubernetes 网络模型


Kubernetes 网络模型是一个描述性的网络模型,也就是说,任何满足 Kubernetes 网络模型规范的网络都是 Kubernetes 网络。


然而,Kubernetes 并没有规定如何实现网络模型。事实上,现在市面上有许多替代的实现,称为网络插件。


本节将用一组关于消息交换的约束条件来描述 Kubernetes 网络模型。


限制条件:网络可寻址实体


Kubernetes 网络模型定义了 3 个可寻址实体:K8S pod、K8S 节点以及 K8S Service,每个实体都会分配到一个不同的 IP 地址。



∧ (K8s-Pod(E₁) ∨ K8s-Node(E₁) ∨ K8s-Service(E₁))∧ (K8s-Pod(E₂) ∨ K8s-Node(E₂) ∨ K8s-Service(E₂)): addr(E₁, a) ∧ addr(E₂, a)₂ ⟺ E₁ = E₂
复制代码


然而,网络模型不对这些 IP 地址做任何进一步的声明。例如,Kubernetes 网络模型不对从这些 IP 地址中提取的 IP 地址空间做任何进一步的声明。

限制条件:容器间通信

Kubernetes 网络模型要求在 Pod P 上下文中执行的容器 C1 可以通过 localhost 与在 P 上下文中执行的其他容器 C2 进行通信。



K8s-Pod(P) ∧ K8s-Container(C₁, P) ∧ K8s-Container(C₂, P): open(C₂, p) Send(e, C₁, 127.0.0.1, _, 127.0.0.1, p) Recv(e, C₂, 127.0.0.1, _, 127.0.0.1, p)
复制代码

限制条件:Pod 到 Pod

Kubernetes 网络模型要求在 Pod P1 上下文中执行的容器 C1 可以通过 P2 的地址与在 P2 上下文中执行的其他容器 C2 进行通信。



∧ K8s-Pod(P₁) ∧ K8s-Container(C₁, P₁)∧ K8s-Pod(P₂) ∧ K8s-Container(C2, P₂):addr(P₁, sa) ∧ addr(P₁, ta) ∧ open(C₂, tp) Send(e, C₁, sa, sp, ta, tp) Recv(e, C₂, sa, sp, ta, tp)
复制代码

限制条件:Process 到 Pod

Kubernetes 网络模型要求托管在节点 N 上的一个 Process,称为 Daemon D,可以通过 P 的地址与托管在 N 上的 Pod P 上下文中执行的任何容器 C 进行通信。



K8s-Node(N) ∧ K8s-Daemon(D) ∧ K8s-Pod(P) ∧ K8s-Container(C, P):host(N, D) ∧ host(N, P) ∧ addr(P, a) ∧ open(C, p) Send(e, D, _, _, a, p) Recv(e, C, _, _, a, p)
复制代码

Kubernetes 网络作为 Network Graph


本节用 Kubernetes Network Graph 这个理想的模型来描述 Kubernetes 网络模型。


下图描述了本节内容中的用例:Kubernetes 集群 K1 由 2 个节点组成。每个节点托管 2 个 Pod。每个 Pod 执行 2 个容器,一个容器监听 8080 端口,一个容器监听 9090 端口。此外,每个节点托管 1 个 Daemon。



我们可以将 Kubernetes 集群网络建模为一个具有一组节点和一组链接的 Graph。

节点

每个 K8S 容器 C 映射到网络 Process C


K8s-Pod(P) ∧ K8s-Container(C, P):   Process(C)
复制代码


每个 Daemon D 映射到网络 Process C



K8s-Daemon(D): Process(D)
复制代码


每个 K8s Pod P 映射到网络 Switch P, Pod 的 Switch



K8s-Pod(P): Switch(P)
复制代码


每个 K8S 节点 N 映射到网络 Switch N,节点的 Switch:



K8s-Pod(N): Switch(N)
复制代码

链接

每个容器 C 会被链接到其 Pod Switch P



K8s-Pod(P) ∧ K8s-Container(C, P): link(C, P)
复制代码


每个 Daemon D 会被链接到其节点 Switch N



K8s-Node(N) ∧ K8s-Daemon(D): host(N, D) link(D, N)
复制代码


每个 Pod Switch P 会被链接到其节点 Switch N



K8s-Node(N) ∧ K8s-Pod(P): host(N, P) link(P, N)
复制代码


每个节点 Switch N1 会被链接到其他各节点 Switch N2



K8s-Node(N₁) ∧ K8s-Node(N₂): N₁ ≠ N₂ link(N₁, N₂)
复制代码

在 Pod Switch 的转发信息库

P2 的转发信息库



1. Delivery on localhostK8s-Pod(P) ∧ K8s-Container(C, P): open(C, p) [* * 127.0.0.1 p Deliver(C)] in FIB[P]2. Delivery on Pod AddressK8s-Pod(P) ∧ K8s-Container(C, P): addr(P, a) ∧ open(C, p) [* * a p Deliver(C)] in FIB[P]3. Local Forwarding RuleK8s-Node(N) ∧ K8s-Pod(P): host(N, P) [* * * * Forward(N)] in FIB[P]
复制代码

在节点 Switch 的转发信息库

转发信息库 N2



1. Node to Pod Forwarding RuleK8s-Node(N) ∧ K8s-Pod(P): host(N, P) ∧ addr(P, a) [* * a * Forward(P)] in FIB[N]2. Node to Node Forwalding RuleK8s-Node(N₁) ∧ K8s-Node(N₂) ∧ K8s-Pod(P): N₁ ≠ N₂ ∧ host(N₂, P) ∧ addr(P, a) [* * a * Forward(N₂)] in FIB[N₁]
复制代码

示例

本节将通过一些例子,按照 Kubernetes 集群网络 K1 中的消息生命(Life of a Message)来进行讲解。

容器到容器

容器 C1.1 需要与容器 C1.2 进行通信:


  • C1.1 在 P1 的上下文中执行

  • C1.2 在 P1 的上下文中执行


C1.1 通过 127.0.0.1:9090 到 C1.2

节点内 Pod 到 Pod 通信

容器 C 1.1 需要与 C 3.1 进行通信:


  • C 1.1 在 N1 节点上的 P1 上下文中执行

  • C 3.1 在 N1 节点上的 P3 上下文中执行


C 1.1 通过 10.1.1.2:8080 到 C 3.1

节点间 Pod 到 Pod 通信

容器 C 1.1 需要与容器 C 2.1 进行通信:


  • C1.1 是在 N1 节点上托管的 P1 的上下文中执行的

  • C2.1 在节点 N2 上的 P2 上下文中执行


C1.1 通过 10.1.2.1:8080 到 C2.1

Daemon 到 Pod 通信

Daemon D1 需要与容器 C 1.1 通信:


  • D1 托管在节点 N1 上

  • C 1.1 在 Pod P1 的上下文中执行,该 Pod 托管在节点 N1 上


D1 通过 10.1.1.1:8080 到 C 1.1

总结

Kubernetes 网络模型是一个允许性的网络模型,也就是说,任何满足 Kubernetes 网络模型约束的网络都是一个有效的 Kubernetes 网络。


将 Kubernetes 网络模型映射到 Network Graph,使我们能够在概念层面上对网络进行推理,并且跳过了在实现层面上推理所需的一系列细节。


在后续的文章中,我们将使用这个 Network Graph 来讨论 Kubernetes 服务、Kubernetes Ingress 和 Kubernetes 策略。


原文链接:

https://dominik-tornow.medium.com/kubernetes-networking-22ea81af44d0


本文转载自:RancherLabs(ID:RancherLabs)

原文链接:Kubernetes网络概念初探

2021-05-04 07:005556

评论 1 条评论

发布
用户头像
虽然是转载文章,但这样的干货文章才是 infoq 该推崇的内容。期待后续连载内容。
2021-05-06 10:44
回复
没有更多了
发现更多内容

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

汀丶人工智能

人工智能 深度学习 nlp 知识图谱 智能问答

源码解读之FutureTask如何实现最大等待时间

EquatorCoco

源码 前端 前端工具

户外led显示屏常见规格有哪些

Dylan

广告 屏幕亮度 像素 LED显示屏 户外LED显示屏

Git操作不规范,战友提刀来相见!

树上有只程序猿

几天不写React,已经看不懂语法了

伤感汤姆布利柏

科兴未来|第二届T-MAX“科创太仓”国际创新创业--先进材料专场赛

科兴未来News

PoseiSwap 更新第二期空投,持有 Zepoch 节点数量将决定空投回报

BlockChain先知

深入解析Redis的LRU与LFU算法实现

vivo互联网技术

redis LRU LFU

中国大模型的落地DNA,写在这个双螺旋结构里

脑极体

AI

区块链生态架构 | 社区征文

TiAmo

区块链 Baas 年中技术盘点

Kurator v0.4.0版本更新4大内容,满足多云环境的复杂需求

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

基于知识图谱的《红楼梦》人物关系可视化及问答系统(含码源):命名实体识别、关系识别、LTP简单教学

汀丶人工智能

人工智能 深度学习 nlp 知识图谱 智能问答

企业内容管理升级 3.0:构建生态协同,助力合规成长

风来兮

软件 电子档案 OCR 合规 #人工智能

INFINI Labs 产品更新 | Easysearch 新增 kNN 搜索功能、Console 支持 LDAP 认证登录等

极限实验室

console Gateway 产品更新 easysearch 极限科技

谈谈我这两年的前端开发经验

树上有只程序猿

智能电视APP鲜时光,如何应用AB测试打造极致的用户观看体验?

字节跳动数据平台

Pytorch: 数据读取机制Dataloader与Dataset

timerring

人工智能

万字血书React—走近React

不在线第一只蜗牛

React 教程分享

深度剖析之由浅入深揭秘JavaScript类型转换(最全总结篇)

沉浸式趣谈

JavaScript 类型转换 隐式转换 类型 强制类型转换

PoseiSwap 更新第二期空投,持有 Zepoch 节点数量将决定空投回报

股市老人

PoseiSwap 更新第二期空投,持有 Zepoch 节点数量将决定空投回报

鳄鱼视界

手把手教学构建证券知识图谱/知识库(含码源):网页获取信息、设计图谱、Cypher查询、Neo4j关系可视化展示

汀丶人工智能

人工智能 自然语言处理 nlp 知识图谱

PoseiSwap 更新第二期空投,持有 Zepoch 节点数量将决定空投回报

西柚子

Rainbond开源

EquatorCoco

开源 rainbond

代码随想录训练营 Day09 - 字符串(下)

jjn0703

知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等

汀丶人工智能

自然语言处理 知识图谱 信息抽取

5个祖传的Python自动化办公项目,治愈你的抑郁

程序员晚枫

Python 微信 自动化 机器人 办公

王海峰最新发声!

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

如何优化Flutter的性能?

没有用户名丶

Kubernetes网络概念初探_架构_Rancher_InfoQ精选文章