K8S高级网络实战——CNI能否解决k8s网络模型缺陷

内容来源:2018 年 1 月 10 日,灵雀云k8s首席专家刘梦馨在“云原生技术沙龙-北京站”进行《K8s高级网络实践》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2418 | 7分钟阅读

摘要

CNI 作为 CNCF 的项目提供了构建容器网络的接口和类库,可以方便 kubernetes 扩展使用不同的网络模型,这次会介绍一下 CNI 的工作方式以及如何进行开发。同时会结合灵雀云的实践来介绍现有网络模型在传统环境存在的一些缺陷以及灵雀云如何根据 CNI 的接口实现的 pod 静态 IP 方面的工作。

获取嘉宾演讲视频及PPT,扫一扫下方二维码即可。

Kubernetes的网络模型

Pod IP

Kubernetes的网络模型主要分为三层。第一层是Pod的多个容器之间的互通,这层实现起来比较简单,因为所有的容器都共享一个网卡,所以可以直接通信。第二层是同个宿主机中多个Pod的互通,这方面其实也很好解决,可以通过Docker默认服务创建的Docker 0的网桥进行通信,其他的像Calico、Flannel这样的网络插件也会创建类似的网桥来方便通信。第三层是跨主机的容器互通,关于这层kubernetes只是定义了规范并没有真正的实现,包括IP分配、IP通信,IP是否固定这些kubernetes都不会管,仅仅是规定了所有的部分都需要有一个IP才能互通。

Kubernetes网络模型的缺陷

动态IP or 固定IP

过去Kubernetes网络模型的动态IP模式是我们在与客户交流过程中遇到的最大难题,一般很难有客户能够接受非固定IP的形式,大多是强烈要求采用固定IP。

从传统角度来看,运维是管控所有的计算网络资源的,有精细化的IP管理。因此完全的IP随机分配对他们来说在理念上就是一个有很大的冲击,除此之外很多的传统工作也离不开基于IP的技术,比如基于IP的监控、安全策略。

从实际角度来看,传统的服务部署也有很多是基于IP的实现,如果IP无法固定会带来很多问题。最典型的就是Etcd的部署,传统的模式中这很容易实现,但是在kubernetes中就需要仔细考量下,在理念上会有很大的转变,要理解些新的概念。

从以上分析来看,其实客户想要固定IP的需求并非是因为理念上的固执,而是有一定的合理的依据。

反过来看如果kubernetes有了固定IP,又会有哪些影响。细细想想其实整体来看并不会有太大的影响,原先的kubernetes的服务发现机制依然可用,甚至还多了一种方式,传统的基于IP的监控运维也没什么问题。

目前之所以很少看到固定IP的模式,个人认为主要有三方面的原因。首先Docker最初就是基于单机的设计,没有想过大规模集群的应用,所以不会涉及到对IP的管控。第二可能是理念之争。到底服务应该是有状态还是无状态?现在业界都在追求微服务、无状态,不关心网络、存储只关注计算,但是其实很难做到真正的无状态,即使自身的服务是无状态的也还是会调用第三方的服务留下状态信息。第三是因为实现起来难度很高,固定的IP所带来的是有状态,而有状态的服务往往都很难去做。

固定IP是不是无法实现呢?其实使用CNI就能很好的解决。

CNI简介

CNI是CNCS的子项目,它为容器提供了一套标准的网络接口,具体分为两部分,一部分是CNI标准,包括如何实现CNI以及一些接口和库,另一部分是官方的实现,会提供一些CNI网络插件。

CNI and kubernetes

这里我们看下CNI和kubernetes之间是如何交互的。

通过kubernetes命令行和CNI关联会有两个选项,分别是CNI配置地址和CNI二进制文件目录。一般程序之间的交互,大多是RPC、HTTP之类的通信方式,但是CNI和kubernetes的交互是通过二进制文件的方式。

CNI的配置中比较重要的是type和IPAM,type表示网卡的生成方式,IPAM指定IP分配的方式。创建Pod的时候,CNI会根据这个文件先调用type指定的方式,创建一个网卡,然后调用IPAM指定的方式,获取IP。销毁Pod的时候,反过来调用,先释放IP再删除网卡。

不同的CNI之间也是通过Config来进行通信。具体的结构中首先interface中会有一个MAC地址,这在一般的网络插件中是没有,而这里提供了设置。配置中的IP是列表的形式,多IP的形式方便了传统功能的实现。另外每台Pod的网络路由和DNS都可以自行设置。

固定IP

针对前面提到的固定IP的实现,只需要用到CNI关于IP控制的插件,目前已有的分别是DHCP和host-local,不过他们都不能很好的满足我们的需求。DHCP的随机分配模式在生产环境中很少得到应用,和容器网络也很难结合起来;host-local会限定每台机器的固定网络范围,增减机器的时候重新分配IP很困难。因此我们最后将IP给提取出来作为第一级的资源,进行单独的管控。我们专门实现了衣蛾IPAM的插件,它包含网段添加和删除、网关路由设置、权限控制和配合等功能。

坑和期望

CNI本质上是事件驱动的模型,因此很有可能会遇到丢事件的问题,这里具体表现为执行失败、kubernetes挂了、机器挂了等等,从而导致IP泄露、IP冲突。所以如果要做固定IP就一定要加入垃圾处理回收的机制,通过补偿机制将不同步的状态改为同步。

未来我们可能会做一些更灵活的网络,通过插件在容器的生命周期内改变网络配置,包括固定MAC、动态路由、dns。另外还想要和现有系统解耦以及支持更多的网络模式。

以上为今天的全部分享内容,谢谢大家!

原文发布于微信公众号 - IT大咖说(itdakashuo)

原文发表时间:2018-07-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

Kubernetes救援 - 教你如何从新技术的坑里爬出来(上) | TW洞见

今日洞见 文章作者/配图来自ThoughtWorks:佟达。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网站...

4059
来自专栏北京马哥教育

你所写过的最好的Python脚本是什么?

这是网友在 Quora 上提的同名问答帖,本文摘编了排名前两名的答案。得到最多赞的用户介绍了他写的在Facebook上面感谢好友的脚本。排名第二的答案介绍了他写...

3939
来自专栏大数据挖掘DT机器学习

新闻个性化推荐系统(python)-(附源码 数据集)

最近参加了一个评测,是关于新闻个性化推荐。说白了就是给你一个人的浏览记录,预测他下一次的浏览记录。花了一周时间写了一个集成系统,可以一键推荐新...

6475
来自专栏喔家ArchiSelf

CAP理论与分布式系统设计

S 先生 是一位难得的技术同行,学者气质,一见如故。s 先生 作为本公众号(wireless_com) 的第一位投稿者,老曹深感荣幸。CAP 和 分布式系统的...

1704
来自专栏Android 技术栈

Android DeepLink介绍与使用

前段时间公司让调研一下DeepLink,说以后会用到,之前看了很久,并做了个demo,现整理一下,方便以后查阅,如果有幸帮助到其他人就更好了。

4696
来自专栏Cloud Native - 产品级敏捷

Cloud-Native 微服务架构元素卡; 15 分钟内搞定微服务架构设计

Cloud-Native微服务架构设计不应该是一个讲求标准答案, 简单粗暴的设计过程。而应该是一个考量各方因素下的一个“决策的过程”。

55812
来自专栏大数据挖掘DT机器学习

新闻个性化推荐系统(python)-(附源码 数据集)

最近参加了一个评测,是关于新闻个性化推荐。说白了就是给你一个人的浏览记录,预测他下一次的浏览记录。花了一周时间写了一个集成系统,可以一键推荐新闻,但是准确率比...

5087
来自专栏MessageQueue

2017上海QCon之旅总结(下)

本来这个公众号的交流消息中间件相关的技术的。十月去上海参加了QCon,第一次参加这样的技术会议,感受挺多的,所以整理一下自己的一些想法接公众号和大家交流一下。

1132
来自专栏java工会

使用Github创建自己的小博客

1152
来自专栏圣杰的专栏

性能优化知多少

1. 引言 最近一段时间,系统新版本要发布,在beta客户测试期间,暴露了很多问题,除了一些业务和异常问题外,其他都集中在性能上。有幸接触到这些性能调优的机会,...

2199

扫码关注云+社区

领取腾讯云代金券