阿里云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从懵圈到熟练 – 集群网络详解相关推荐

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

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

  2. k8s ubuntu cni_K8S从懵圈到熟练 – 集群网络详解

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

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

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

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

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

  5. K8s 从懵圈到熟练-集群伸缩原理

    作者 | 声东  阿里云技术专家 <关注公众号,回复 排查 即可下载电子书> <深入浅出 Kubernetes>一书共汇集 12 篇技术文章,帮助你一次搞懂 6 个核心原理,吃 ...

  6. K8s 从懵圈到熟练 – 镜像拉取这件小事

    作者 | 声东 阿里云售后技术专家 导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的.而镜像拉取失败,大多数情况下都和权限有关.所以,在处理相关问题的时候,我们往往会轻松 ...

  7. K8S从懵圈到熟练 - 节点下线姊妹篇

    之前分享过一例集群节点NotReady的问题.在那个问题中,我们的排查路劲,从K8S集群到容器运行时,再到sdbus和systemd,不可谓不复杂.那个问题目前已经在systemd中做了修复,所以基本 ...

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

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

  9. Kubernetes K8S之固定节点nodeName和nodeSelector调度详解

    Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...

最新文章

  1. ORG.SPRINGFRAMEWORK.HTTP.CONVERTER.HTTPMESSAGENOTREADABLEEXCEPTION: COULD NOT READ JSON: UNRECOGNIZE
  2. 浅入浅出Typescript Decorators
  3. 欢乐纪中某A组赛【2019.1.19】
  4. java 绑定微信号开发_Java开发中的更多常见危险信号
  5. PowerShell实战1:Ping_Test
  6. Android基于mAppWidget实现手绘地图(一)--简介
  7. 三大框架SSM基础知识点
  8. 解读中国版新资本协议
  9. 20155313 杨瀚 《网络对抗技术》实验九 Web安全基础
  10. php计算面积,PHP中长方形的面积怎么求
  11. 最系统的网站优化推广大全
  12. 昨日种种死 今日种种生
  13. 海淀区第九届单片机竞赛获奖名单_第九届蓝桥杯国赛电子类单片机设计与开发组获奖名单...
  14. 【部分翻译】NSBezierPath的基础知识
  15. 堪比N6705和Power Monitor AAA10F 的高精度_高采样率_低功耗测试电源mPower1203
  16. 清华小学上册计算机教学案例,案例分析 清华小学 罗远琴
  17. Flutter的基础知识之Dart语法
  18. paddlepaddle 实现AlexNet模型,复现原创论文
  19. [浪风分享]很简单的查看电脑所支持的最大内存的方法--磨刀不误砍柴工
  20. java主从服务器的配置

热门文章

  1. 什么是对抗样本、对抗攻击(详解)
  2. Adversarial Attack (对抗攻击)
  3. 51单片机的中断系统及编程(附案例)
  4. RH124-05管理用户密码-3
  5. Android Studio 简单计算器布局(模仿win10电脑计算器)
  6. 深度学习与高光谱图像分类
  7. oracle 修改nls_nchar_characterset,Oracle的NLS_NCHAR_CHARACTERSET和NLS_CHARACTERSET之间的区别...
  8. Portrait Matting
  9. Redis(主从、哨兵、集群)
  10. mysql中IFIND_IN_SET和like的区别