深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116707 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

34 | Kubernetes网络模型与CNI网络插件

调用CNI ipam插件
Hairpin Mode
调用CNI bridge插件
Delegate字段
Network Configuration
CNI环境变量
内置CNI插件
IPAM插件
Main插件
容器网络模型
容器与宿主机通信
容器与容器通信
ADD操作
SetUpPod方法
实现CNI插件
实现容器网络方案
CNI基础可执行文件
CNI网桥
CNI接口
VXLAN
UDP
思考题
Kubernetes中CNI网络的实现原理
CNI插件的工作原理
CNI插件的部署和实现方式
Kubernetes对容器网络的处理方法
容器跨主机网络的两种实现方法
Kubernetes网络模型与CNI网络插件

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:Kubernetes 网络模型与 CNI 网络插件。
在上一篇文章中,我以 Flannel 项目为例,为你详细讲解了容器跨主机网络的两种实现方法:UDP 和 VXLAN。
不难看到,这些例子有一个共性,那就是用户的容器都连接在 docker0 网桥上。而网络插件则在宿主机上创建了一个特殊的设备(UDP 模式创建的是 TUN 设备,VXLAN 模式创建的则是 VTEP 设备),docker0 与这个设备之间,通过 IP 转发(路由表)进行协作。
然后,网络插件真正要做的事情,则是通过某种方法,把不同宿主机上的特殊设备连通,从而达到容器跨主机通信的目的。
实际上,上面这个流程,也正是 Kubernetes 对容器网络的主要处理方法。只不过,Kubernetes 是通过一个叫作 CNI 的接口,维护了一个单独的网桥来代替 docker0。这个网桥的名字就叫作:CNI 网桥,它在宿主机上的设备名称默认是:cni0。
以 Flannel 的 VXLAN 模式为例,在 Kubernetes 环境里,它的工作方式跟我们在上一篇文章中讲解的没有任何不同。只不过,docker0 网桥被替换成了 CNI 网桥而已,如下所示:
在这里,Kubernetes 为 Flannel 分配的子网范围是 10.244.0.0/16。这个参数可以在部署的时候指定,比如:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Kubernetes网络模型与CNI网络插件的实现原理,重点介绍了容器跨主机网络的实现方法以及Kubernetes对容器网络的处理方式。通过详细解释CNI接口维护CNI网桥、Flannel的VXLAN模式工作方式以及CNI插件的部署和实现方式,读者可以快速了解Kubernetes网络模型与CNI网络插件的工作原理和实现细节。文章还强调了Kubernetes网络模型的特点,即所有容器和宿主机之间可以直接使用IP地址通信,无需使用NAT,并且容器之间的网络通信也是直接基于IP地址进行的。此外,文章提出了思考题,引发读者对Kubernetes项目选择使用CNI的思考。整体而言,本文对于正在研究或使用Kubernetes的技术人员具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(48)

  • 最新
  • 精选
  • blackpiglet
    思考题:为什么 Kubernetes 项目不自己实现容器网络,而是要通过 CNI 做一个如此简单的假设呢? 解答:没有亲历 Kubernetes 网络标准化的这个阶段,以下内容都是基于猜测,大家见笑了。 最开始我觉得这就是为了提供更多的便利选择,有了 CNI,那么只要符合规则,什么插件都可以用,用户的自由度更高,这是 Google 和 Kubernetes 开放性的体现。但转念一想,如果 Kubernetes 一开始就有官方的解决方案,恐怕也不会有什么不妥,感觉要理解的更深,得追溯到 Kubernetes 创建之初的外部环境和 Google 的开源策略了。Github 上最早的 Kubernetes 版本是 0.4,其中的网络部分,最开始官方的实现方式就是 GCE 执行 salt 脚本创建 bridge,其他环境的推荐的方案是 Flannel 和 OVS。 所以我猜测: 首先给 Kubernetes 发展的时间是不多的(Docker 已经大红大紫了,再不赶紧就一统天下了),给开发团队的时间只够专心实现编排这种最核心的功能,网络功能恰好盟友 CoreOS 的 Flannel 可以拿过来用,所以也可以认为 Flannel 就是最初 Kubernetes 的官方网络插件。Kubernetes 发展起来之后,Flannel 在有些情况下就不够用了,15 年左右社区里 Calico 和 Weave 冒了出来,基本解决了网络问题,Kubernetes 就更不需要自己花精力来做这件事了,所以推出了 CNI,来做网络插件的标准化。我觉得假如社区里网络一直没有好的解决方案的话,Kubernetes 肯定还是会亲自上阵的。 其次,Google 开源项目毕竟也不是做慈善,什么都做的面面俱到,那要消耗更多的成本,当然是越多的外部资源为我所用越好了。感觉推出核心功能,吸引开发者过来做贡献的搞法,也算是巨头们开源的一种套路吧。

    作者回复: 分析的很不错

    2018-11-11
    7
    203
  • DJH
    "实际上,对于 Weave、Calico 这样的网络方案来说,它们的 DaemonSet 只需要挂载宿主机的 /opt/cni/bin/,就可以实现插件可执行文件的安装了。"这个是用hostpath类型的卷实现吗?

    作者回复: 对

    2018-11-09
    6
  • 燕岭听涛
    老师,您好,咨询一个问题:flannel经常出现 no ip address available in range,出现后就只能重置节点。这个是什么原因造成的,为什么pod删除后不回收ip地址?或者还有别的解决办法吗?希望能收到您的回复。

    作者回复: 给个大点的range啊,还有看看ipam用的是啥配置?

    2018-11-23
    3
    3
  • Tim Zhang
    上一章节不是说介绍flannel的hostgw模式吗?

    作者回复: 不要急

    2018-11-09
    1
  • 萧箫萧
    可以谈一下在pod内 请求一个域名的完整流程吗? 比如说我最近遇到一个问题,reslove.conf这些文件内容都是正常的情况下,在某个image内为什么nslookup kuberenetes.default.svc.cluster.local 解析结果正常。 nslookup kubernetes.default 解析到外网。像这类问题如何从理论角度分析?

    作者回复: 见service部分

    2018-11-11
  • 慕世勋
    请教下目前有相对成熟的k8s商业网络解决方案吗,用于大规模集群使用,主要避免雪崩造成大规模故障,你也知道,网络是个很敏感的课题

    作者回复: 容器网络其实很简单,开源主流方案成熟度已经可以。而且更多情况下,其实都是复用下层宿主机网络。

    2018-11-10
  • Dale
    老师啥时候讲解一下calico,对比flannel网络优缺点哈

    作者回复: 肯定有

    2018-11-09
  • 单朋荣
    其实本章难点在于实现网络方案对应的CNI插件,即配置Infra容器的网络栈,并连到网桥上。整体流程是:kubelet创建Pod->创建Infra容器->调用SetUpPod()方法,该方法需要为CNI准备参数,然后调用CNI插件(flannel)为Infra配置网络;其中参数来源于1、dockershim设置的一组CNI环境变量;2、dockershim从CNI配置文件里(有flanneld启动后生成,类型为configmap)加载到的、默认插件的配置信息(network configuration),这里对CNI插件的调用,实际是network configuration进行补充。参数准备好后,调用Flannel CNI->调用CNI bridge(所需参数即为上面:设置的CNI环境变量和补充的network configuation)来执行具体的操作流程。
    2019-06-14
    3
    47
  • 阿棠
    前几章都很好理解,一到网络这块,就蒙了,没耐心看下去了
    2018-11-21
    11
    43
  • 单朋荣
    把握几个核心,然后串起来,其它需要的东西再去拿就可以了。 问题牵引: 网络方案是谁?它和“CNI标准”的关系(实现)是?kubernetes网络配置由谁来完成?(或者说我要怎么做才能实现它??) 核心支撑点: 1、flannel网络方案本身 2、CNI插件,这里是内置的Flannel插件 3、dockershim(DRI) 两个背景知识: 1、CNI 的设计思想:Kubernetes 在启动 Infra 容器之后,就可以直接调用 CNI 网络插件,为这个 Infra 容器的 Network Namespace,配置符合预期的网络栈。 2、建立网络的“三类”基础组件/可执行文件。 串线(着重描述三个核心点之间的串联关系): kubelet 创建 Pod ->创建 Infra 容器。主要是由(CRI)**dockershim **调用 Docker API 创建并启动 Infra 容器-> SetUpPod方法。方法的作用是:1.为 CNI 插件准备参数,2.然后调用 CNI 插件为 Infra 容器配置网络。 1.所需参数->实现ADD/DEL方法->CNI插件(*flannel插件*)实现。: 1.1参数一:由 dockershim 设置的一组 CNI 环境变量,ADD/DEL方法参数。 1.2参数二:是 dockershim 从 CNI “配置文件”里加载到的、默认插件的配置信息;由*flannel网络方案本身*安装时生成。 2.调用 CNI 插件: 引:"dockershim 对 *Flannel CNI 插件*的调用,其实就是走了个过场。Flannel CNI 插件唯一需要做的,就是对 dockershim 传来的 Network Configuration (CNI配置文件)进行补充。" 接下来,Flannel CNI 插件->调用 CNI bridge 插件(参数一:“CNI环境变量/ADD", 参数二:”Network Confiuration/Delegate"),-->“代表”Flannel,将容器加入CNI网络(cni0网桥)。
    2021-01-14
    28
收起评论
显示
设置
留言
48
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部