众所周知,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插件,地址如下:
大家感兴趣的话可以扫描下方二维码加入微信群进行交流。
作者介绍
玄铁,信也科技基础平台架构师,容器云团队成员。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。