前言

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

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

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

Pod网络概念模型

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

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

同一节点上的Pod网络

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

上图节点上展示了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网络在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进行互通?

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

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

这个方案简单理解,就是通过路由设备为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)网络方案,如下图所示:

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

CNI简介

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

总结

  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网络》要剖析的内容,敬请期待。

Kubernetes网络三部曲之一~Pod网络相关推荐

  1. Kubernetes网络三部曲之三 ~ NodePort vs LoadBalancer vs Ingress

    前言 在上一篇<Kubernetes网络三部曲-Service网络>中,波波讲解了K8s的4层网络栈中的第2层Service网路.有了Service网络,K8s集群内的应用可以通过服务名/ ...

  2. Kubernetes Pod 网络精髓:pause 容器详解

    福利 文末留言送 5 本由浙大SEL实验室硕士杜军大佬撰写的<Kubernetes 网络权威指南:基础.原理与实践>,希望大家点击文末的留言小程序积极留言,每个人都有机会. 前言 当检查你 ...

  3. 查看pod网络范围_K8S Pod 内抓包快速定位网络问题

    前言 在使用 Kubernetes 时,可能会遇到一些网络问题.当通过检查配置与日志无法排查错误时,这时就需要抓取网络数据包,但是Pod内一般不会安装tcpdump命令,那有没有方法可以直接通过宿主机 ...

  4. 如何调试Kubernetes集群中的网络延迟问题

    本文深入研究和解决了 Kubernetes 平台上的服务零星延迟问题,就在不久前我也遇到了类似的问题,看似是玄学事件,刚开始归结于网络链路抖动,一段时间后依然存在,虽然影响都是 P99.99 以后的数 ...

  5. 调试Kubernetes集群中的网络停顿问题

    调试Kubernetes集群中的网络停顿问题 在过去几年,Kubernetes在GitHub已经成为标准的部署模式.目前在GitHub,我们在Kubernetes上运行着海量的面向内部团队以及面向C端 ...

  6. 安装pod网络插件flannel

    官网地址 https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml 感觉网络这块有点复杂,抠脑壳 ...

  7. 【好文收藏】基于OpenStack和Kubernetes构建组合云平台——网络集成方案综述

    转自: http://geek.csdn.net/news/detail/104150 一谈到云计算,大家都会自然想到三种云服务的模型:基础设施即服务(IaaS),平台即服务(PaaS)和软件即服务( ...

  8. 基于OpenStack和Kubernetes构建组合云平台——网络集成方案综述

    一谈到云计算,大家都会自然想到三种云服务的模型:基础设施即服务(IaaS),平台即服务(PaaS)和软件即服务(SaaS).OpenStack已经成为私有云IaaS的标准,而PaaS层虽然有很多可选技 ...

  9. Kubernetes 最强云原生网络组件 Cilium 常用故障排查中文指南

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 我是 LEE,老李,一个在 IT 行业摸爬滚打 16 年的技术老兵. 事件背景 最近不少 k8s 底层网络模块都从 ...

  10. 混沌工程之ChaosMesh使用之模拟POD网络延迟

    文章目录 前言 模拟 POD 网络延迟 目标 配置文件 执行 验证 恢复 留个思考题给你 前言 在这一篇中我们来看一下如何模拟 POD 网络故障. 模拟 POD 网络延迟 目标 指定 pod 产生 1 ...

最新文章

  1. 无言的鞭策:日本20年19人获自然科学诺奖
  2. C语言引用不同路径下的头文件的方法
  3. GitHub因“纳粹”评论遭解雇的犹太员工被复职,CEO公开致歉,开除他的HR走人...
  4. 强化学习(五)用时序差分法(TD)求解
  5. shell基础09 gawk程序(上)
  6. 一个DataGridView辅助类
  7. 教育|关于本科生科研的一些想法和建议
  8. springboot(五) 加载配置文件优先级顺序
  9. 【每日一网】Day4:OverFeat流程简单理解
  10. astah java版本_astah community
  11. 2018-2019年计算机类会议截稿日期汇总(更新至20180914)
  12. balenaEtcher for mac(U盘启动盘制作工具)
  13. MindManager带你走进三顾茅庐
  14. 机器学习笔记:特征处理——相关性分析GINI impurity
  15. Latex ulem包设置下划线删除线强调文本等效果
  16. 2018年上海人工智能大会(SHAI2018)即将在上海举行
  17. 用.bat文件多开微信及打开固定浏览器浏览固定页面 开机自启
  18. 敏捷开发-Scrum过程模型
  19. 【无敌浪子】python爬取足球赛事数据
  20. 如何理解类型geometry和geography以及4326、3857坐标系

热门文章

  1. Three.js中导入gltf格式的模型并给gltf模型添加贴图
  2. 滚动楼层导航html,vue css 滚动楼层导航定位
  3. 海尔发布智慧家庭系统,占领物联网高地
  4. 【ABAP】GUI状态描述修改
  5. 全自动过滤器:全自动反冲洗过滤器的特点
  6. 云喵圈子v2.0版本正式上线,社交+电商+私域流量
  7. springboot在开发文件下载过程中出现的文件损坏问题
  8. scare机器人如何手眼标定_Epson机器人的一些实操经验记录
  9. 苹果手机怎么备份所有数据?iPhone15数据备份常用的3种方法!
  10. 计算机绘图自考知识点,天津2012年自考“计算机绘图(电子CAD)”课程考试大纲