Kubernetes网络三部曲之一~Pod网络_pod 有网卡吗-程序员宅基地

技术标签: k8s  Pod网路  K8s网络  Kubernetes网络  Kubernetes  

前言

K8s是一个强大的平台,但它的网络比较复杂,涉及很多概念,例如Pod网络,Service网络,Cluster IPs,NodePort,LoadBalancer和Ingress等等,这么多概念足以让新手望而生畏。但是,只有深入理解K8s网络,才能为理解和用好K8s打下坚实基础。为了帮助大家理解,模仿TCP/IP协议栈,我把K8s的网络分解为四个抽象层,从0到3,除了第0层,每一层都是构建于前一层之上,如下图所示:

k8s network layer

第0层Node节点网络比较好理解,也就是保证K8s节点(物理或虚拟机)之间能够正常IP寻址和互通的网络,这个一般由底层(公有云或数据中心)网络基础设施支持。第0层我们假定已经存在,所以不展开。第1到3层网络,我将分三篇文章,分别进行剖析,本文是第一篇Pod网络。

注意,本文旨在帮助大家建立K8s网络的概念模型,而不是对底层技术的精确描述。实际我们学技术以应用为主,重要的是快速建立起直观易懂的概念模型,能够指导我们正常应用即可,当然理解一定的技术细节也是有帮助的。另外,本文假定读者对基本的网络技术,ip地址空间和容器技术等有一定的了解。

Pod网络概念模型

Pod相当于是K8s云平台中的虚拟机,它是K8s的基本调度单位。所谓Pod网络,就是能够保证K8s集群中的所有Pods(包括同一节点上的,也包括不同节点上的Pods),逻辑上看起来都在同一个平面网络内,能够相互做IP寻址和通信的网络,下图是Pod网络的简化概念模型:

pod network abstraction

Pod网络构建于Node节点网络之上,它又是上层Service网络的基础。为了进一步理解Pod网络,我将对同一节点上的Pod之间的网络,以及不同节点上的Pod之间网络,分别进行剖析。

同一节点上的Pod网络

前面提到,Pod相当于是K8s云平台中的虚拟机,实际一个Pod中可以住一个或者多个(大多数场景住一个)应用容器,这些容器共享Pod的网络栈和其它资源如Volume。那么什么是共享网络栈?同一节点上的Pod之间如何寻址和互通?我以下图样例来解释:

pod networking in node1

上图节点上展示了Pod网络所依赖的3个网络设备,eth0是节点主机上的网卡,这个是支持该节点流量出入的设备,也是支持集群节点间IP寻址和互通的设备。docker0是一个虚拟网桥,可以简单理解为一个虚拟交换机,它是支持该节点上的Pod之间进行IP寻址和互通的设备。veth0则是Pod1的虚拟网卡,是支持该Pod内容器互通和对外访问的虚拟设备。docker0网桥和veth0网卡,都是linux支持和创建的虚拟网络设备。

上图Pod1内部住了3个容器,它们都共享一个虚拟网卡veth0。内部的这些容器可以通过localhost相互访问,但是它们不能在同一端口上同时开启服务,否则会有端口冲突,这就是共享网络栈的意思。Pod1中还有一个比较特殊的叫pause的容器,这个容器运行的唯一目的是为Pod建立共享的veth0网络接口。如果你SSH到K8s集群中一个有Pod运行的节点上去,然后运行docker ps,可以看到通过pause命令运行的容器。

Pod的IP是由docker0网桥分配的,例如上图docker0网桥的IP是172.17.0.1,它给第一个Pod1分配IP为172.17.0.2。如果该节点上再启一个Pod2,那么相应的分配IP为172.17.0.3,如果再启动Pod可依次类推。因为这些Pods都连在同一个网桥上,在同一个网段内,它们可以进行IP寻址和互通,如下图所示:

pod networking in node2

从上图我们可以看到,节点内Pod网络在172.17.0.0/24这个地址空间内,而节点主机在10.100.0.0/24这个地址空间内,也就是说Pod网络和节点网络不在同一个网络内,那么不同节点间的Pod该如何IP寻址和互通呢?下一节我们来分析这个问题。

不同节点间的Pod网络

现在假设我们有两个节点主机,host1(10.100.0.2)和host2(10.100.0.3),它们在10.100.0.0/24这个地址空间内。host1上有一个PodX(172.17.0.2),host2上有一个PodY(172.17.1.3),Pod网络在172.17.0.0/16这个地址空间内。注意,Pod网络的地址,是由K8s统一管理和分配的,保证集群内Pod的IP地址唯一。我们发现节点网络和Pod网络不在同一个网络地址空间内,那么host1上的PodX该如何与host2上的PodY进行互通?

inter-nodes pod networking how to

实际上不同节点间的Pod网络互通,有很多技术实现方案,底层的技术细节也很复杂。为了简化描述,我把这些方案大体分为两类,一类是路由方案,另外一类是覆盖(Overlay)网络方案。

如果底层的网络是你可以控制的,比如说企业内部自建的数据中心,并且你和运维团队的关系比较好,可以采用路由方案,如下图所示:

networking via router

这个方案简单理解,就是通过路由设备为K8s集群的Pod网络单独划分网段,并配置路由器支持Pod网络的转发。例如上图中,对于目标为172.17.1.0/24这个范围内的包,转发到10.100.0.3这个主机上,同样,对于目标为172.17.0.0/24这个范围内的包,转发到10.100.0.2这个主机上。当主机的eth0接口接收到来自Pod网络的包,就会向内部网桥转发,这样不同节点间的Pod就可以相互IP寻址和通信。这种方案依赖于底层的网络设备,但是不引入额外性能开销。

如果底层的网络是你无法控制的,比如说公有云网络,或者企业的运维团队不支持路由方案,可以采用覆盖(Overlay)网络方案,如下图所示:

networking via overlay

所谓覆盖网络,就是在现有网络之上再建立一个虚拟网络,实现技术有很多,例如flannel/weavenet等等,这些方案大都采用隧道封包技术。简单理解,Pod网络的数据包,在出节点之前,会先被封装成节点网络的数据包,当数据包到达目标节点,包内的Pod网络数据包会被解封出来,再转发给节点内部的Pod网络。这种方案对底层网络没有特别依赖,但是封包解包会引入额外性能开销。

CNI简介

考虑到Pod网络实现技术众多,为了简化集成,K8s支持CNI(Container Network Interface)标准,不同的Pod网络技术可以通过CNI插件形式和K8s进行集成。节点上的Kubelet通过CNI标准接口操作Pod网路,例如添加或删除网络接口等,它不需要关心Pod网络的具体实现细节。

cni introduction

总结

  1. K8s的网络可以抽象成四层网络,第0层节点网络,第1层Pod网络,第2层Service网络,第3层外部接入网络。除了第0层,每一层都构建于上一层之上。
  2. 一个节点内的Pod网络依赖于虚拟网桥和虚拟网卡等linux虚拟设备,保证同一节点上的Pod之间可以正常IP寻址和互通。一个Pod内容器共享该Pod的网络栈,这个网络栈由pause容器创建。
  3. 不同节点间的Pod网络,可以采用路由方案实现,也可以采用覆盖网络方案。路由方案依赖于底层网络设备,但没有额外性能开销,覆盖网络方案不依赖于底层网络,但有额外封包解包开销。
  4. CNI是一个Pod网络集成标准,简化K8s和不同Pod网络实现技术的集成。

有了Pod网络,K8s集群内的所有Pods在逻辑上都可以看作在一个平面网络内,可以正常IP寻址和互通。但是Pod仅仅是K8s云平台中的虚拟机抽象,最终,我们需要在K8s集群中运行的是应用或者说服务(Service),而一个Service背后一般由多个Pods组成集群,这时候就引入了服务发现(Service Discovery)和负载均衡(Load Balancing)等问题,这是波波的下一篇《Kubernetes网络三部曲~Service网络》要剖析的内容,敬请期待。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yang75108/article/details/101101384

智能推荐

MATLAB异常处理机制_对于此运算,数组的大小不兼容-程序员宅基地

文章浏览阅读9.8k次,点赞3次,收藏10次。在程序运行时,当出现错误的输入、数据边界值问题或者程序本身有逻辑问题时,当前运行的程序会中断当前运行任务,提前退出运行状态,无法完成既定的任务。在程序中加入错误检查机制,合理处理程序可能出现的异常和错误,确保程序在所有可能条件下都能可靠运行,是现代编程语言的通用处理方式。在MATLAB中,使用try … catch语句,可以捕获异常并在catch块中处理异常,而不用让程序中断运行,确保程序的可靠性和鲁棒性。try … catch的语法结构如下:try statements %try语句块ca_对于此运算,数组的大小不兼容

asp.net中的DES加密解密_.netcore 1.0 des加解密-程序员宅基地

文章浏览阅读2k次。基于asp.net的des加解密方法_.netcore 1.0 des加解密

Android应用的默认Activity配置_andrior 默认activiy-程序员宅基地

文章浏览阅读2.3w次,点赞8次,收藏22次。Android应用的默认Activity对一个Android应用来说,一般都会将某个Activity配置为默认启动的Activity。默认Activity作为应用的入口,会在桌面中显示一个图标和名字。这里稍作说明一下,Android原生系统采用二级桌面设置,应用安装后会显示在应用抽屉中,不会直接显示在外层桌面上,除非应用又在外层桌面创建了快捷方式。而大部分国内ROM都是采用一级桌面,取消了应用..._andrior 默认activiy

7-20 打印九九口诀表 (C语言)_一道题: 4 9 20 34 ()99 a.59 b.69 c.79 d.89-程序员宅基地

文章浏览阅读709次。7-20 打印九九口诀表 (15 分)下面是一个完整的下三角九九口诀表:11=112=2 22=413=3 23=6 33=914=4 24=8 34=12 44=1615=5 25=10 35=15 45=20 55=2516=6 26=12 36=18 46=24 56=30 66=3617=7 27=14 37=21 47=2..._一道题: 4 9 20 34 ()99 a.59 b.69 c.79 d.89

Spring Cloud Gateway的全局异常处理_spring gateway 全局异常-程序员宅基地

文章浏览阅读2.2w次。Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求。网关都是给接口做代理转发的,后端对应的都是REST API,返回数据格式都是JSON。如果不做处理,当发生异常时,Gateway默认给出的错误信息是页面,不方便前端进行异常处理。需要对异常信息进行处理,返回JSO..._spring gateway 全局异常

校园二手闲置交易平台 毕业设计-附源码 85309_二手物品交易平台毕业设计-程序员宅基地

文章浏览阅读502次,点赞9次,收藏15次。电子商务是基于当下网络社会体系而生成的一种商品交易活动,其突破了传统的面对面式的金钱交易,实现了不出门便可以支付、购物的功能,非常符合当今生活、工作节奏加快的社会。现在的电子商务平台已经涉及行业广泛,只要是交易便可以通过网络搭建相关交易平台来实现线上交易模式,极为方便,所以,在此,根据校园二手闲置交易方面的需求,决定将校园二手闲置交易转移到网络上,给校园用户一个优质的、安全的二手交易平台,实现网络发布售卖、购买二手商品的功能,以促进校园信息化发展。_二手物品交易平台毕业设计

随便推点

ubuntu 16.04 vm虚拟机 nat 配置静态ip_ubuntu vmplayer centos nat ip-程序员宅基地

文章浏览阅读775次。前言:这个问题困扰我好长时间,桥接的静态ip我会了,然而用nat 的方式配置集群会更好。(nat 方式客户机之间的通讯不经过路由器),所以想着换成nat方式会更好。要使用nat方式设置静态ip ,需要相当多的计算机网络知识了。第一先查看你的主机的网卡是否把网络共享给虚拟网卡vmnet8 了吗? 打开网络共享中心———>更改适配器设置 看下图 然后右击 你用的那个网卡。我用的无线。所以右击 ..._ubuntu vmplayer centos nat ip

gta5线下联机_RTX3080电影级《GTA5》高清画质,8K下的沉浸感-程序员宅基地

文章浏览阅读1.3k次。众所周知RTX3080显卡已经面世,算是性价比非常高的高端显卡了,可以流畅且高清运行市面上所有的3A大作,当然也会面临性能过剩的情况,但随着游戏的发展与进阶,这点配置在未来是肯定要被淘汰的,所以并不需要过度的吹嘘,如今的GTA5已经不同当年,虽然一台电脑都可以运行这款游戏,想当年还在考虑自己的XP系统是否可以游玩GTA5,现在想起来还觉得回忆满满呢,好在GTA5有很多MOD可以供我们使用,让游戏体..._3080gta5画面设置

SQL空和NULL的区别_sq什么时候返回null和空值-程序员宅基地

文章浏览阅读1.1w次。1.NULL意思为缺失的值(missing value).2.三值逻辑(three-valued-logic: TRUE,FALSE,UNKNOWN). 在SQL中有三个逻辑谓词:TURE,FALSE,UNKNOWN.在大多数的编程语言中只有TRUE和FALSE,而在SQL中独有UNKNOWN,之所有存在与NULL有关.  比如做如下比较: NULL>32;NULL=NULL;X+NULL>Y;NULLNULL.其计算结果均为UNKNOWN.  可能会有些迷惑,于二值逻辑不同(NOT TURE=FALUSE_sq什么时候返回null和空值

《lwip学习8》-- 网际控制报文协议ICMP_lwip_broadcast_ping g工-程序员宅基地

文章浏览阅读957次。网际控制报文协议ICMP_lwip_broadcast_ping g工

dos通过替换部分字符串批量修改文件名_dos命令替换文件名中几个字符-程序员宅基地

文章浏览阅读645次。dos通过替换部分字符串批量修改文件名_dos命令替换文件名中几个字符

CVPR 2023 | 任意模态语义分割来了!-程序员宅基地

文章浏览阅读1k次。点击下方卡片,关注“自动驾驶之心”公众号ADAS巨卷干货,即可获取点击进入→自动驾驶之心【语义分割】技术交流群后台回复【分割综述】获取语义分割、实例分割、全景分割、弱监督分割等超全学习资料!论文思路:多模态融合可以使语义分割更加鲁棒。然而,融合任意(arbitrary)数量的模态仍然有待探索。为了深入研究这个问题,本文创建了DELIVER 任意模态(arbitrary-modal)分割基准,包括深..._delivering arbitrary-modal semantic segmentation