家喻户晓,K8S的POD是不须要固定IP的,因为固定IP 会带来一些扩展性的问题,然而动态IP在平安ACL,业务管制方面有不少独到的长处,本文就是在揭示新也云如何在K8S上实现动态IP这个能力的。全方面满足业务须要。

一、Kubernetes 网络接口CNI插件的工作原理

首先从Kubernetes网络接口(CNI) 说起,containernetworking/cni: Container Network Interface - networking for Linux containers (github.com)
CNI(Container Network Interface)是 CNCF 旗下的一个我的项目,由一组用于配置 Linux 容器的网络接口的标准和库组成,同时还蕴含了一些插件。CNI 仅关怀容器创立时的网络调配,和当容器被删除时开释网络资源。

CNI 插件就是一个执行程序,容器启动时,它被调用,而后返回一个规范的JSON,通知容器该怎么设置本人的网络。 同样被销毁的时候,它也被调用一次,返回一个JSON,通知容器如何销毁本人的网络。这就是CNI 插件的工作形式。
所以咱们须要做的就是理解CNI插件的工作。

二、CNI插件接口办法

CNI插件的接口办法个别包含: ADD CHECK DEL VERSION 理论应用中,将一个容器增加进一个网络,调用的是ADD接口办法。将一个容器从网络中删除,则是调用DEL接口办法

在 plugins/plugins/main/macvlan at master · containernetworking/plugins (github.com) 我的项目 咱们能找到很多CNI 插件的源码,咱们只须要简略的批改一下就能够了。

三、原理透析

默认装置插件后,简略关上CNI的配置 /etc/cni/net.d 咱们能大略看到这样的配置文件。

这里调配了 这台物理机上能够应用的IP段,IP分配模式等等信息。这些配置管制了Macvlan插件的工作。工作的时候,这个配置会作为参数被传入插件,从这里咱们会发现,咱们将应用host-local 模式调配IP。

通过浏览代码,咱们能够大略理解到默认的工作模式是这样

一台物理机上能够调配的IP 被寄存在本地文件里的,每次启动容器的时候,咱们就从文件里选一个,这样大家并不会抵触。然而这有个前提 那就是每台物理机上的IP都是互相隔离的,这样才不会抵触。如果要做动态IP, 这意味着随着调度算法的调配,一个IP可能呈现在不同的物理机上?这样的话,咱们怎么解决抵触呢?

咱们解决的方法是把IP 调配中心化,将IP的调配放到 公布零碎里,这样的话,咱们就能够让任何一个容器都能有咱们想让它领有的IP。大略的流程 是这样,

从流程上看,咱们把IP调配这个局部的性能从各个节点,自主调配的模式,收口到了 公布零碎上,这样能做到对立治理,非常灵活。

在代码上看就很简略了,Macvlan 的插件是Go 语言所写,咱们只须要简略加一个利用Http Client 代码,用它去获取容器的标签就能够了。咱们曾经把这部分开源啦。请间接去 https://github.com/ppdaicorp/... 看看吧。

四、结语

很快乐为大家带来这次分享,置信通过上面对CNI的工作原理,动态IP分配机制有了肯定的理解。在这里打个小广告,信也容器云技术揭秘系列继续更新中,想理解更多容器云技术的小伙伴能够翻看一下历史文章,祝大家收货满满。

五、回馈社区

目前咱们已在github上开源了容器云平台的外围组件Stargate、Dockeryard、Pauth、Atlas以及Macvlan插件,地址如下:

https://github.com/ppdaicorp

大家感兴趣的话能够扫描下方二维码退出微信群进行交换。


作者介绍

玄铁,信也科技根底平台架构师,容器云团队成员。