深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22477 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

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

张磊 2018-11-09
你好,我是张磊。今天我和你分享的主题是: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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(23)

  • 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
    41
  • 阿棠
    前几章都很好理解,一到网络这块,就蒙了,没耐心看下去了
    2018-11-21
    8
  • Dale
    我认为是在大规模的集群环境中,网络方案是最复杂的,针对不同的的环境和场景,网络需要灵活配置。k8s集群里只关心最终网络可以连通,而不需要在内部去实现各种复杂的网络模块,使用CNI可以方便灵活地自定义网络插件,网络可以独立。
    2018-11-09
    5
  • 叫我天才好了
    思考题,高内聚,低耦合?
    2019-12-04
    1
  • 单朋荣
    其实本章难点在于实现网络方案对应的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
    1
  • LÉON
    一直在苦苦自学,在容器的存储还有网络一直困扰。一直在拜读不拜听 受益匪浅 继续努力
    2018-12-20
    1
  • 燕岭听涛
    老师,您好,咨询一个问题:flannel经常出现 no ip address available in range,出现后就只能重置节点。这个是什么原因造成的,为什么pod删除后不回收ip地址?或者还有别的解决办法吗?希望能收到您的回复。

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

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

    作者回复: 对

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

    作者回复: 不要急

    2018-11-09
    1
  • 徐海浪
    kubeadm initiative --pod-network-cidr=10.244.0.0/16可以成功创建k8s集群,换一下地址则不行(如10.12.0.0/16),不知道为啥😂
    2019-12-03
  • Geek_54edc1
    因为现实中的容器网络太多样、太复杂,为了解耦、可扩展性,设计了CNI接口,这个接口实现了共同的功能:为infra容器的network namespace配置网络栈
    2019-11-19
  • 拉欧
    为了效率吧,cni网桥完全复用了linux的网络栈,如果自己弄容器网络,肯定又要增加内核调用
    2019-11-17
  • 昀溪
    CNI bridge插件会通过Infra容器的Network Namespace文件,进入网络名称空间,然后创建一对Veth Pair设备。

    那我的环境是使用的docker0网桥,没有使用CNI插件。那这个Veth Pair设备是谁创建的呢?我是不是可以这么理解,如果Infra这个容器是POD的第一个容器,那么docker就会为Infra这个容器分配地址,通过docker的CNM模型的某些机制来完成为Infra这个容器创建虚拟网卡对的工作,使用的IP地址就是从docker0网桥的bip中获得的。而POD的容器共享Infra的网络应该是K8S的一种机制可网络插件没有关系。是这个意思么
    2019-05-10
  • Booty Monster
    service 如果是iptables 做实际转发的确有这个问题,我们遇到过的:1 使用headless svc,2 使用ipvs
    2019-02-28
  • 毛玉明
    k8s里可以不使用cni直接使用docker0的网桥吗,看了下目前公司的集群没有找到cni0的这个设备
    2019-01-11
  • 居然是飞哥
    如果分配的子网是10.244.0.0/16,那么这个集群里node节点最大的数目不是只能到254台?
    2018-11-21
  • freeman
    老师,能介绍下ipvlan吗。
    2018-11-20
  • IOVE.-Minn
    老师,在实际使用过程中,遇到一个问题。k8s版本1.12.2,kube-proxy开启了ipvs后,部署最新的ingress-controller服务(daemenset部署,开启了hostnetwork: true)的时候,会报错监控检查失败。而去掉之后,是没有问题的。排除官方不推荐使用hostnetwork这种方式,是有什么原因引起的呢?测试过增加健康检查的时间和镜像的版本,都不能解决。
    2018-11-15
  • 萧箫萧
    可以谈一下在pod内 请求一个域名的完整流程吗? 比如说我最近遇到一个问题,reslove.conf这些文件内容都是正常的情况下,在某个image内为什么nslookup kuberenetes.default.svc.cluster.local 解析结果正常。
    nslookup kubernetes.default 解析到外网。像这类问题如何从理论角度分析?

    作者回复: 见service部分

    2018-11-11
  • or0or1
    把网络插件使用docker镜像的方式有什么优点和缺点?
    2018-11-10
收起评论
23
返回
顶部