阿里云K8S集群网络目前有两种方案,一种是flannel方案,另外一种是基于calico和弹性网卡eni的terway方案。Terway和flannel类似,不同的地方在于,terway支持Pod弹性网卡,以及NetworkPolicy功能。

今天这篇文章,我们以flannel为例,深入分析阿里云K8S集群网络的实现方法。我会从两个角度去分析,一个是网络的搭建过程,另外一个是基于网络的通信。我们的讨论基于当前的1.12.6版本。

鸟瞰

总体上来说,阿里云K8S集群网络配置完成之后,如下图,包括集群CIDR,VPC路由表,节点网络,节点的podCIDR,节点上的虚拟网桥cni0,连接Pod和网桥的veth等部分。

类似的图,大家可能在很多文章中都看过,但是因为其中相关配置过于复杂,比较难理解。这里我们可以把这些配置,分三种情况来理解:集群配置,节点配置以及Pod配置。与这三种情况对应的,其实是对集群网络IP段的三次划分:首先是集群CIDR,接着为每个节点分配podCIDR(即集群CIDR的子网段),最后在podCIDR里为每个Pod分配自己的IP。

集群网络搭建

初始阶段

集群的创建,基于云资源VPC和ECS,在创建完VPC和ECS之后,我们基本上可以得到如下图的资源配置。我们得到一个VPC,这个VPC的网段是192.168.0.0/16,我们得到若干ECS,他们从VPC网段里分配到IP地址。

集群阶段

在以上出初始资源的基础上,我们利用集群创建控制台得到集群CIDR。这个值会以参数的形式传给集群节点provision脚本,并被脚本传给集群节点配置工具kubeadm。kubeadm最后把这个参数写入集群控制器静态Pod的yaml文件kube-controller-manager.yaml。

集群控制器有了这个参数,在节点kubelet注册节点到集群的时候,集群控制器会为每个注册节点,划分一个子网出来,即为每个节点分配podCIDR。如上图,Node B的子网是172.16.8.1/25,而Node A的子网是172.16.0.128/25。这个配置会记录到集群node的podCIDR数据项里。

节点阶段

经过以上集群阶段,K8S有了集群CIDR,以及为每个节点划分的podCIDR。在此基础上,集群会下发flanneld到每个阶段上,进一步搭建节点上,可以给Pod使用的网络框架。这里主要有两个操作,第一个是集群通过Cloud Controller Manager给VPC配置路由表项。路由表项对每个节点有一条。每一条的意思是,如果VPC路由收到目的地址是某一个节点podCIDR的IP地址,那么路由会把这个网络包转发到对应的ECS上。第二个是创建虚拟网桥cni0,以及与cni0相关的路由。这些配置的作用是,从阶段外部进来的网络包,如果目的IP是podCIDR,则会被节点转发到cni0虚拟局域网里。

注意:实际实现上,cni0的创建,是在第一个使用Pod网络的Pod被调度到节点上的时候,由下一节中flannal cni创建的,但是从逻辑上来说,cni0属于节点网络,不属于Pod网络,所以在此描述。

Pod阶段

在前边的三个阶段,集群实际上已经为Pod之间搭建了网络通信的干道。这个时候,如果集群把一个Pod调度到节点上,kubelet会通过flannel cni为这个Pod本身创建网络命名空间和veth设备,然后,把其中一个veth设备加入到cni0虚拟网桥里,并为Pod内的veth设备配置ip地址。这样Pod就和网络通信的干道连接在了一起。这里需要强调的是,前一节的flanneld和这一节的flannel cni完全是两个组件。flanneld是一个daemonset下发到每个节点的pod,它的作用是搭建网络(干道),而flannel cni是节点创建的时候,通过kubernetes-cni这个rpm包安装的cni插件,其被kubelet调用,用来为具体的pod创建网络(分枝)。

理解这两者的区别,有助于我们理解flanneld和flannel cni相关的配置文件的用途。比如/run/flannel/subnet.env,是flanneld创建的,为flannel cni提供输入的一个环境变量文件;又比如/etc/cni/net.d/10-flannel.conf,也是flanneld pod(准确的说,是pod里的脚本install-cni)从pod里拷贝到节点目录,给flannel cni使用的子网配置文件。

通信

以上完成Pod网络环境搭建。基于以上的网络环境,Pod可以完成四种通信:本地通信,同节点Pod通信,跨节点Pod通信,以及Pod和Pod网络之外的实体通信。

其中本地通信,说的是Pod内部,不同容器之前通信。因为Pod内网容器之间共享一个网络协议栈,所以他们之间的通信,可以通过loopback设备完成。

同节点Pod之间的通信,是cni0虚拟网桥内部的通信,这相当于一个二层局域网内部设备通信。

跨节点Pod通信略微复杂一点,但也很直观,发送端数据包,通过cni0网桥的网关,流转到节点上,然后经过节点eth0发送给VPC路由。这里不会经过任何封包操作。当VPC路由收到数据包时,它通过查询路由表,确认数据包目的地,并把数据包发送给对应的ECS节点。而进去节点之后,因为flanneld在节点上创建了真的cni0的路由,所以数据包会被发送到目的地的cni0局域网,再到目的地Pod。

最后一种情况,Pod与非Pod网络的实体通信,需要经过节点上iptables规则做snat,而此规则就是flanneld依据命令行--ip-masq选项做的配置。

总结

以上是阿里云K8S集群网络的搭建和通信原理。我们主要通过网络搭建和通信两个角度去分析K8S集群网络。其中网络搭建包括初始阶段,集群阶段,节点阶段以及Pod阶段,这么分类有助于我们理解这些复杂的配置。而理解了各个配置,集群通信原理就比较容易理解了。

k8s ubuntu cni_K8S从懵圈到熟练 – 集群网络详解相关推荐

  1. K8s 从懵圈到熟练 – 集群网络详解

    作者 | 声东 阿里云售后技术专家 导读:阿里云 K8S 集群网络目前有两种方案:一种是 flannel 方案:另外一种是基于 calico 和弹性网卡 eni 的 terway 方案.Terway ...

  2. K8S从懵圈到熟练 – 集群网络详解

    阿里云K8S集群网络目前有两种方案,一种是flannel方案,另外一种是基于calico和弹性网卡eni的terway方案.Terway和flannel类似,不同的地方在于,terway支持Pod弹性 ...

  3. 如何拉取k8s镜像_K8s 从懵圈到熟练 – 镜像拉取这件小事

    导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的.而镜像拉取失败,大多数情况下都和权限有关.所以,在处理相关问题的时候,我们往往会轻松的说:这问题很简单,肯定是权限问题. ...

  4. android手机怎么拆机,韩雪拆安卓手机:十分钟熟练拆机/详解每个部件

    原标题:韩雪拆安卓手机:十分钟熟练拆机/详解每个部件 韩雪再拆安卓手机,近日,曾给iPhone换屏幕的科技达人韩雪,再次成功拆解安卓手机,并与知名游戏主播一同竞技.直播时,韩雪娴熟地拆下手机的所有部件 ...

  5. K8S从懵圈到熟练 - 我们为什么会删除不了集群的命名空间?

    阿里云售后技术团队的同学,每天都在处理各式各样千奇百怪的线上问题.常见的有,网络连接失败,服务器宕机,性能不达标,请求响应慢等.但如果要评选,什么问题看起来微不足道事实上却足以让人绞尽脑汁,我相信答案 ...

  6. 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard

    笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...

  7. Linux、ubuntu系统下查看显卡型号、显卡信息详解

    本文将介绍Linux系统下查看显卡硬件信息内容如下: 如何在ubuntu系统中查看显卡型号.(其他文章大多只介绍了命令而未介绍如何对应显卡型号) 在ubuntu系统中显卡详细信息,以及所代表的含义. ...

  8. Ubuntu进入root权限命令——sudo和su命令详解

    ubuntu用户管理 sudo意思就是super-user do,让当前用户暂时以管理员的身份root来执行这条命令. su是用来改变当前用户的,su root,就是将当前用户切换为root,用了su ...

  9. K8S 从懵圈到熟练--大数据平台技术栈18

    回顾:大数据平台技术栈 (ps:可点击查看),今天就来说说其中的K8S! 来自:阿里技术公众号 阿里妹导读:排查完全陌生的问题.不熟悉的系统组件,对许多工程师来说是无与伦比的工作乐趣,当然也是一大挑战 ...

最新文章

  1. 苹果开年第一购!买下仅24名员工的AI音乐公司,可根据环境动态生成音乐
  2. php文件里直接写上?xml version=1.0 encoding=utf-8?出错?
  3. 4.4 Triplet 损失-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. mysql 杀存储过程进程_SQL SERVER 杀死锁进程存储过程
  5. AI公开课:18.05.16 周明博士(MSRA副院长)—北大AI第十一讲之《语言智能的进展》课堂笔记——你了解语言智能
  6. BSEG和BSIS、BSAS、BSID、BSAD、BSIK、BSAK六个表的关系
  7. 《Head First设计模式》第三章笔记 装饰者模式
  8. 18、Linux下编程风格
  9. python写剧情文字游戏_文字游戏引擎试用心得之一:Ren'py 和 Fungus
  10. 平面圆域分割(欧拉公式)+例题
  11. 102个快递编码的对照表
  12. matlab中符号函数教程,MATLAB程序设计教程(9)——MATLAB符号计算
  13. 无人机“风袭”黄冈|战疫日记
  14. 【问题解决】Linux服务器免密信任 远程执行
  15. win10 删除无用的bios引导
  16. 关于Dell r720重装系统时遇到的识别不到磁盘的问题
  17. STM32的中断优先级说明(抢占式与响应式优先级)
  18. 洛谷CF499B Lecture + 映射map
  19. Excel 2010 VBA 入门 138 添加选项卡和内置控件
  20. Mac OS -- ORSSerialPort打开serialPort时提示错误Operation not permitted

热门文章

  1. 新榜微信编辑器怎么导出长图
  2. 产品经理所需要知道的专业术语
  3. TARS-PHP,TarsPHP/TARS-PHP使用实践.md at master · TarsPHP/TarsPHP · GitHub
  4. 我的记事本 第一讲:文件的打开与关闭
  5. 如何通过JS唤醒APP页面!
  6. ib网卡命令_一种IB网卡连通配置方法、装置、终端及存储介质与流程
  7. 微信公众号接口调用频次限制说明
  8. 渝粤题库 陕西师范大学 《小学教师专业发展》作业
  9. 专业知识感觉什么都会,面试官一问却回答不上来怎么办?
  10. python中inf这个玩意