Kubernetes必备知识: CNI-阿里云开发者社区

开发者社区> 阿里云术语库> 正文
登录阅读全文

Kubernetes必备知识: CNI

简介: CNI的全称是 Container Network Interface,即容器网络的 API 接口。 它是 K8s 中标准的一个调用网络实现的接口。Kubelet 通过这个标准的 API 来调用不同的网络插件以实现不同的网络配置方式。实现了这个接口的就是 CNI 插件,它实现了一系列的 CNI API 接口。常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。

所属技术领域:

K8s

|名词定义|

CNI的全称是 Container Network Interface,即容器网络的 API 接口。
它是 K8s 中标准的一个调用网络实现的接口。Kubelet 通过这个标准的 API 来调用不同的网络插件以实现不同的网络配置方式。实现了这个接口的就是 CNI 插件,它实现了一系列的 CNI API 接口。常见的 CNI 插件包括 Calico、flannel、Terway、Weave Net 以及 Contiv。

|技术特点|

 CNI基本的使用方法为:

  1. 首先在每个结点上配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一个网络配置文件的名称;
  2. 安装 CNI 配置文件中所对应的二进制插件;
  3. 在这个节点上创建 Pod 之后,Kubelet 就会根据 CNI 配置文件执行前两步所安装的 CNI 插件;
  4. 上步执行完之后,Pod 的网络就配置完成了。
    具体的流程如下图所示:

图片.png

在集群里面创建一个 Pod 的时候,首先会通过 apiserver 将 Pod 的配置写入。apiserver 的一些管控组件(比如 Scheduler)会调度到某个具体的节点上去。Kubelet 监听到这个 Pod 的创建之后,会在本地进行一些创建的操作。当执行到创建网络这一步骤时,首先它会读取刚才我们所说的配置目录中的配置文件,配置文件里面会声明所使用的是哪一个插件,然后去执行具体的 CNI 插件的二进制文件,再由 CNI 插件进入 Pod 的网络空间去配置 Pod 的网络。配置完成之后,Kuberlet 也就完成了整个 Pod 的创建过程,这个 Pod 就在线了。
大家可能会觉得上述流程有很多步(比如要对 CNI 配置文件进行配置、安装二进制插件等等),看起来比较复杂。
但如果我们只是作为一个用户去使用 CNI 插件的话就比较简单,因为很多 CNI 插件都已提供了一键安装的能力。以我们常用的 Flannel 为例,如下图所示:只需要我们使用 kubectl apply Flannel 的一个 Deploying 模板,它就能自动地将配置、二进制文件安装到每一个节点上去。
图片.png

安装完之后,整个集群的 CNI 插件就安装完成了。
因此,如果我们只是去使用 CNI 插件的话,那么其实很多 CNI 插件已经提供了一键安装的脚本,无需大家关心 Kubernetes 内部是如何配置的以及如何调用 API 的。
 Kubelet对CNI的实现
kubelet对CNI的实现的主要代码在:pkg/kubelet/network/cni/cni.go SetUpPod/TearDownPod(创建Pod和销毁Pod)
图片.png

CNI插件是可执行文件,会被kubelet调用。启动kubelet时,指定--network-plugin=cni,同时--cni-conf-dir 指定networkconfig配置,默认路径是:/etc/cni/net.d,并且,--cni-bin-dir 指定plugin可执行文件路径,默认路径是:/opt/cni/bin;
kubeDeps对象的数据结构NetworkPlugins是调用方法ProbeNetworkPlugins收集所有Network Plugin;图片.png

network.InitNetworkPlugin(pkg/kubelet/network/plugins.go)
InitNetworkPlugin时,会根据NetworkPluginName来选择需要的Network Plugin,然后调用plugin的Init进行初始化
图片.png

networkPlugin初始化好后,会传递到containerRuntime,在Pod的生命周期中负责管理网络。

|资料来源|

名词定义:https://www.jianshu.com/p/1919fb8a48ea

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: