34 | 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
《深入剖析 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-117203 - DJH"实际上,对于 Weave、Calico 这样的网络方案来说,它们的 DaemonSet 只需要挂载宿主机的 /opt/cni/bin/,就可以实现插件可执行文件的安装了。"这个是用hostpath类型的卷实现吗?
作者回复: 对
2018-11-096 - 燕岭听涛老师,您好,咨询一个问题:flannel经常出现 no ip address available in range,出现后就只能重置节点。这个是什么原因造成的,为什么pod删除后不回收ip地址?或者还有别的解决办法吗?希望能收到您的回复。
作者回复: 给个大点的range啊,还有看看ipam用的是啥配置?
2018-11-2333 - Tim Zhang上一章节不是说介绍flannel的hostgw模式吗?
作者回复: 不要急
2018-11-091 - 萧箫萧可以谈一下在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-14347
- 阿棠前几章都很好理解,一到网络这块,就蒙了,没耐心看下去了2018-11-211143
- 单朋荣把握几个核心,然后串起来,其它需要的东西再去拿就可以了。 问题牵引: 网络方案是谁?它和“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-1428
收起评论