深入探索 Kubernetes 网络模型和网络通信

news2024/11/25 21:22:37

Kubernetes 定义了一种简单、一致的网络模型,基于扁平网络结构的设计,无需将主机端口与网络端口进行映射便可以进行高效地通讯,也无需其他组件进行转发。该模型也使应用程序很容易从虚拟机或者主机物理机迁移到 Kubernetes 管理的 pod 中。

这篇文章主要深入探索 Kubernetes 网络模型,并了解容器、pod 间如何进行通讯。对于网络模型的实现将会在后面的文章介绍。

network-iceberg

Kubernetes 网络模型

该模型定义了:

  • 每个 pod 都有自己的 IP 地址,这个 IP 在集群范围内可达
  • Pod 中的所有容器共享 pod IP 地址(包括 MAC 地址),并且容器之前可以相互通信(使用 localhost
  • Pod 可以使用 pod IP 地址与集群中任一节点上的其他 pod 通信,无需 NAT
  • Kubernetes 的组件之间可以相互通信,也可以与 pod 通信
  • 网络隔离可以通过网络策略实现

上面的定义中提到了几个相关的组件:

  • Pod:Kubernetes 中的 pod 有点类似虚拟机有唯一的 IP 地址,同一个节点上的 pod 共享网络和存储。
  • Container:pod 是一组容器的集合,这些容器共享同一个网络命名空间。pod 内的容器就像虚拟机上的进程,进程之间可以使用 localhost 进行通信;容器有自己独立的文件系统、CPU、内存和进程空间。需要通过创建 Pod 来创建容器。
  • Node:pod 运行在节点上,集群中包含一个或多个节点。每个 pod 的网络命名空间都会连接到节点的命名空间上,以打通网络。

讲了这么多次网络命名空间,那它到底是如何运作的呢?

网络命名空间如何工作

在 Kubernetes 的发行版 k3s 创建一个 pod,这个 pod 有两个容器:发送请求的 curl 容器和提供 web 服务的 httpbin 容器。

虽然使用发行版,但是其仍然使用 Kubernetes 网络模型,并不妨碍我们了解网络模型。

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - image: curlimages/curl
    name: curl
    command: ["sleep", "365d"]
  - image: kennethreitz/httpbin
    name: httpbin

登录到节点上,通过 lsns -t net 当前主机上的网络命名空间,但是并没有找到 httpbin 的进程。有个命名空间的命令是 /pause,这个 pause 进程实际上是每个 pod 中 不可见sandbox 容器进程。关于 sanbox 容器的作用,将会在下一篇容器网络和 CNI 中介绍。

lsns -t net
        NS TYPE NPROCS    PID USER     NETNSID NSFS                                                COMMAND
4026531992 net     126      1 root  unassigned                                                     /lib/systemd/systemd --system --deserialize 31
4026532247 net       1  83224 uuidd unassigned                                                     /usr/sbin/uuidd --socket-activation
4026532317 net       4 129820 65535          0 /run/netns/cni-607c5530-b6d8-ba57-420e-a467d7b10c56 /pause

既然每个容器都有独立的进程空间,我们换下命令查看进程类型的空间:

lsns -t pid
        NS TYPE NPROCS    PID USER            COMMAND
4026531836 pid     127      1 root            /lib/systemd/systemd --system --deserialize 31
4026532387 pid       1 129820 65535           /pause
4026532389 pid       1 129855 systemd-network sleep 365d
4026532391 pid       2 129889 root            /usr/bin/python3 /usr/local/bin/gunicorn -b 0.0.0.0:80 httpbin:app -k gevent

通过进程 PID 129889 可以找到其所属的命名空间:

ip netns identify 129889
cni-607c5530-b6d8-ba57-420e-a467d7b10c56

然后可以在该命名空间下使用 exec 执行命令:

ip netns exec cni-607c5530-b6d8-ba57-420e-a467d7b10c56 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether f2:c8:17:b6:5f:e5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.42.1.14/24 brd 10.42.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f0c8:17ff:feb6:5fe5/64 scope link
       valid_lft forever preferred_lft forever

从结果来看 pod 的 IP 地址 10.42.1.14 绑定在接口 eth0 上,而 eth0 被连接到 17 号接口上。

在节点主机上,查看 17 号接口信息。veth7912056b 是主机根命名空间下的虚拟以太接口(vitual ethernet device),是连接 pod 网络和节点网络的 隧道,对端是 pod 命名空间下的接口 eth0

ip link | grep -A1 ^17
17: veth7912056b@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
    link/ether d6:5e:54:7f:df:af brd ff:ff:ff:ff:ff:ff link-netns cni-607c5530-b6d8-ba57-420e-a467d7b10c56

上面的结果看到,该 veth 连到了个网桥(network bridge)cni0 上。

网桥工作在数据链路层(OSI 模型的第 2 层),连接多个网络(可多个网段)。当请求到达网桥,网桥会询问所有连接的接口(这里 pod 通过 veth 以网桥连接)是否拥有原始请求中的 IP 地址。如果有接口响应,网桥会将匹配信息(IP -> veth)记录,并将数据转发过去。

那如果没有接口响应怎么办?具体流程就要看各个网络插件的实现了。我准备在后面的文章中介绍常用的网络插件,比如 Calico、Flannel、Cilium 等。

接下来看下 Kubernetes 中的网络通信如何完成,一共有几种类型:

  • 同 pod 内容器间通信
  • 同节点上的 pod 间通信
  • 不同节点上的 pod 间通信

Kubernetes 网络如何工作

同 pod 内的容器间通信

同 pod 内的容器间通信最简单,这些容器共享网络命名空间,每个命名空间下都有 lo 回环接口,可以通过 localhost 来完成通信。

network-within-pod

同节点上的 pod 间通信

当我们将 curl 容器和 httpbin 分别在两个 pod 中运行,这两个 pod 有可能调度到同一个节点上。curl 发出的请求根据容器内的路由表到达了 pod 内的 eth0 接口。然后通过与 eth0 相连的隧道 veth1 到达节点的根网络空间。

veth1 通过网桥 cni0 与其他 pod 相连虚拟以太接口 vethX 相连,网桥会询问所有相连的接口是否拥有原始请求中的 IP 地址(比如这里的 10.42.1.9)。收到响应后,网桥会记录映射信息(10.42.1.9 => veth0),同时将数据转发过去。最终数据经过 veth0 隧道进入 pod httpbin 中。

network-within-node

不同节点的 pod 间通信

跨节点的 pod 间通信会复杂一些,且 不同网络插件的处理方式不同,这里选择一种容易理解的方式来简单说明下。

前半部分的流程与同节点 pod 间通信类似,当请求到达网桥,网桥询问哪个 pod 拥有该 IP 但是没有得到回应。流程进入主机的路由寻址过程,到更高的集群层面。

在集群层面有一张路由表,里面存储着每个节点的 Pod IP 网段(节点加入到集群时会分配一个 Pod 网段(Pod CIDR),比如在 k3s 中默认的 Pod CIDR 是 10.42.0.0/16,节点获取到的网段是 10.42.0.0/2410.42.1.0/2410.42.2.0/24,依次类推)。通过节点的 Pod IP 网段可以判断出请求 IP 的节点,然后请求被发送到该节点。

cross-node

总结

现在应该对 Kubernetes 的网络通信有初步的了解了吧。

整个通信的过程需要各种组件的配合,比如 Pod 网络命名空间、pod 以太网接口 eth0、虚拟以太网接口 vethX、网桥(network bridge) cni0 等。其中有些组件与 pod 一一对应,与 pod 同生命周期。虽然可以通过手动的方式创建、关联和删除,但对于 pod 这种非永久性的资源会被频繁地创建和销毁,太多人工的工作也是不现实的。

实际上这些工作都是由容器委托给网络插件来完成的,而网络插件所遵循的规范 CNI(Container Network Interface)。

网络插件都做了什么?

  • 创建 pod(容器)的网络命名空间
  • 创建接口
  • 创建 veth 对
  • 设置命名空间网络
  • 设置静态路由
  • 配置以太网桥接器
  • 分配 IP 地址
  • 创建 NAT 规则
  • ...

参考

  • https://www.tigera.io/learn/guides/kubernetes-networking/
  • https://kubernetes.io/docs/concepts/services-networking/
  • https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-networking-guide-beginners.html
  • https://learnk8s.io/kubernetes-network-packets

    关注"云原生指北"微信公众号 (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽&#xff0c;是一种非竞争性&#xff0c;可逆和变构的蛋白酶体 (proteasome) 抑制剂。PR-39 TFA 可逆地结合到蛋白酶体的 α7 亚基上&#xff0c;并通过泛素-蛋白酶体途径阻断 NF-κB 抑制剂 IκBα 的降解。PR-39 TFA 刺激小鼠的血…

Java中的final关键字,你清楚吗?

前言 在学习Java基础阶段应该都认识关键字 final,在声明常量和匿名内部类时都会用到它。我们最熟悉的 String 类就是 final类&#xff0c;如果经常查看API源码&#xff0c;肯定还会遇到其他 final类。本篇就来深入了解一下关键字 final&#xff0c;加深对它的运用。 概览 可用…

java计算机毕业设计ssm线上拍卖系统设计6luor(附源码、数据库)

java计算机毕业设计ssm线上拍卖系统设计6luor&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

CRC 循环冗余检验【计网必考】

CRC 循环冗余检验作为一个重点&#xff0c;也是数据链路层必考的一个考点&#xff0c;所以我把差错检测单独拿出来分析一起看一下。总结不易&#xff0c;一个简单的攒&#xff0c;Thanks♪(&#xff65;ω&#xff65;)&#xff89; 目录 一、介绍及工作原理 二、校验计算过程…

zookeeper四字命令_java培训

zookeeper支持某些特定的四字命令&#xff0c;他们大多是用来查询ZK服务的当前状态及相关信息的&#xff0c; 通过telnet或nc向zookeeper提交相应命令&#xff0c;如&#xff1a;echo ruok | nc 127.0.0.1 2181 运行公式&#xff1a;echo 四字命令 | nc 主机IP zookeeper端口…

一文读懂Linux内存分配策略

转载&#xff1a;一文读懂Linux内存分配策略-今日头条 (toutiao.com) 在 Linux 操作系统中&#xff0c;虚拟地址空间的内部又被分为内核空间和用户空间两部分&#xff0c;不同位数的系统&#xff0c;地址空间的范围也不同。比如最常见的 32 位和 64 位系统&#xff0c;如下所示…

r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现

原文链接&#xff1a;http://tecdat.cn/?p3795Glmnet是一个通过惩罚最大似然关系拟合广义线性模型的软件包。正则化路径是针对正则化参数λ的值网格处的lasso或Elastic Net&#xff08;弹性网络&#xff09;惩罚值计算的&#xff08;点击文末“阅读原文”获取完整代码数据&…

[附源码]JAVA毕业设计社区图书馆借阅管理系统(系统+LW)

[附源码]JAVA毕业设计社区图书馆借阅管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

【微服务】版本确认完成,传统方式安装Nacos

目录安装Nacos1.4.1【微服务】SpringCloud和SpringBoot版本选择 【微服务】传统方式安装Nacos 安装Nacos1.4.1 Github地址&#xff1a;https://github.com/alibaba/nacos/releases Nacos1.4.1版本下载地址&#xff1a;https://github.com/alibaba/nacos/releases/download/1.…

170-本地WIFI测试环境配置IP

前几天的时候 博客被删了好多好多篇 算一下 现在是169 按道理的话应该总数是1169的 但是现在只剩下1157了 所以就是被删除了12篇 算了 问题不大 被删了就被删了吧 最近心情真的很不好 五月份的事情一直到现在还是没有走出来 我估计可能要等到下一次自己赚到钱了之后…

基于轨迹优化的自动驾驶汽车跟随自行车模型动力学控制(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本次使用轨迹优化技术来控制汽车。假设汽车遵循自行车模型的动力学。为了实现稳定和安全的跟踪&#xff0c;我们使用了离散时间…

微信内嵌H5调用相机及支付相关问题

前言 进来项目在做公众号&#xff0c;遇到了一些问题及解决方案&#xff0c;在这里进行记录及分享&#xff0c;希望给大家带来一丝帮助 手机上控制台调试我建议使用vConsole(npm install vconsole) 微信内嵌H5的相机调用 微信内嵌H5我们需要调用扫码功能&#xff0c;则需要用…

如何发布WMS/WMTS离线地图服务

介绍&#xff1a; WMTS&#xff08;OpenGIS Web Map Tile Service&#xff09;当前版本是1.0.0。WMTS标准定义了一些操作&#xff0c;这些操作允许用户访问切片地图。WMTS可能是OGC首个支持RESTful访问的服务标准。 WMTS的原理和操作 如果知道一个请求的边界范围&#x…

浅谈用Redis实现分布式锁的方案及细节

前言 我们都知道&#xff0c;在面对并发问题时&#xff0c;有加锁操作和保证原子操作两种解决方案。当我们采用加锁操作的时候&#xff0c;因为Redis多采用集群的方式部署&#xff0c;因此我们就需要考虑到锁在分布式系统中使用的注意事项。接下来就看看Redis的分布式锁问题。…

【檀越剑指大厂—Spring】Spring高阶篇

一.基础概念 1.模块 2.Spring 框架概述。 Spring 是轻量级的开源的 JavaEE 框架 Spring 可以解决企业应用开发的复杂性 Spring 有两个核心部分: IOC 和 AOP IOC:控制反转&#xff0c;把创建对象过程交给 Spring 进行管理 Aop:面向切面&#xff0c;不修改源代码进行功能增强…

SpringBoot办公管理系统oa人力人事办公(含源码+论文+答辩PPT等)

项目功能简介: 本项目含代码详细讲解视频&#xff0c;手把手带同学们敲代码从0到1完成项目 该项目采用技术SpringBoot、SpringMvc(接入层框架)Spring&#xff08;中间层框架&#xff09;Hibernate(持久层框架)JPAMD5加密、Tomcat服务器、MySQL数据库 项目含有源码、配套开发软件…

R语言多元动态条件相关DCC-MVGARCH、常相关CCC-MVGARCH模型进行多变量波动率预测...

全文下载链接&#xff1a;http://tecdat.cn/?p23287在本文中&#xff0c;当从单变量波动率预测跳到多变量波动率预测时&#xff0c;我们需要明白&#xff0c;现在我们不仅要预测单变量波动率元素&#xff0c;还要预测协方差元素&#xff08;点击文末“阅读原文”获取完整代码数…

web安全之通过sqlmap工具进行靶场练习

目录 基础语法 get类型的注入 post类型的注入 基础语法 -u:用于get提交方式&#xff0c;后面跟注入的url网址 --dbs&#xff1a;获取所有数据库 --tables&#xff1a;获取所有数据表 --columns&#xff1a;获取所有字段 --dump&#xff1a;打印数据 -D&#xff1a;查询选择某…

火到爆的扩散模型(Diffusion Model)帮你具象化幻想世界

Diffusion Model 如果你对人工智能有所了解&#xff0c;想必已经听说过Diffusion Model了。如果还没有&#xff0c;那就一起来了解一下吧—— 扩散&#xff08;Diffusion&#xff09;对于人能智能而言&#xff0c;是一个借用的概念。在热力学中&#xff0c;它指细小颗粒从高密度…

调节盘的三维建模及加工工艺规程设计

目录 1 调节盘分析 - 1 - 1.1 调节盘结构特点 - 1 - 1.2 调节盘的工艺分析 - 2 - 1.3 调节盘的技术要求 - 3 - 2 毛坯的选择 - 4 - 2.1 毛坯的类型 - 4 - 2.2 毛坯余量的确定 - 4 - 2.3 毛坯草图 - 5 - 3 工艺规程设计 - 6 - 3.1 定位基准的选择 - 6 - 3.1.1 粗基准的选择 - 6 …