Contrail CNI
在容器技术中,veth (虚拟以太网)对的功能非常类似于可用于在网络命名空间之间创建隧道的虚拟电缆。其中一端插入容器,另一端位于主机或 docker 桥接命名空间中。
Contrail CNI 插件负责将网络接口(veth 对的一端)插入容器网络命名空间中,并且还会在主机上进行所有必要的更改,如将 veth 的另一端连接到网桥、分配 IP、配置路由等。
目前有许多此类 CNI 插件实施。Contrail 是其中之一,而是我们的收藏。有关完整列表,请检查https://github.com/containernetworking/cni。

另一个 CNI 插件 multus-CNI,允许您将多个网络接口连接到盒。Multus-cni 的多网络支持通过 Multus 调用多个其他 CNI 插件来实现。因为每个插件都将创建自己的网络,所以多个插件允许盒具有多个网络。与 mutus 网络 cni 以及行业中所有其他当前实施相比,Contrail 提供的主要优势之一是 Contrail 能够将多个网络接口自身附加到 Kubernetes 箱,而无需在任何其他插件中调用。这为真正多宿主箱带来了支持。
网络附件定义 CRD
Contrail CNI 遵循 Kubernetes CRD (自定义资源定义)网络附件定义,以提供一种为其他网络接口指定配置的标准化方法。标准 Kubernetes 上游 Api 没有变化,从而使实施具有最具兼容性。
在 Contrail 中,网络附件定义 CRD 由 Contrail-kube-管理器(KM)创建。在启动时,公里会验证是否在 Kubernetes API 服务器中找到了网络 CRD network-attachment-definitions.k8s.cni.cncf.io,如果’没有,则创建一个。
以下是 CRD 对象 YAML 文件:
在 Contrail Kubernetes 设置中,CRD 已创建并可验证:
$ kubectl get crd NAME CREATED AT network-attachment-definitions.k8s.cni.cncf.io 2019-06-07T03:43:52Z
通过使用上述 CRD 创建的这种新型网络附件定义,我们现在可以在 Contrail Kubernetes 环境中创建虚拟网络。
要从 Kubernetes 创建虚拟网络,请使用类似下面的 YAML 模板:
与许多其他标准 Kubernetes 对象一样,您可以指定虚拟网络名称、元数据下的命名空间以及用于携带有关网络的附加信息的注释。在 Contrail 中,NetworkAttachmentDefinition CRD 中使用以下注释来启用虚拟网络的某些属性:
opencontrail.org/cidr: 此 CIDR 定义虚拟网络的子网。
opencontrail.org/ip_fabric_forwarding: 此标志用于启用/禁用 ip 结构转发功能。
opencontrail.org/ip_fabric_snat: 这是启用/禁用 ip 结构 snat 功能的标志。
在 Contrail 中,ip 结构转发功能支持基于 IP 阵列的不带隧道的转发虚拟网络。当两个 ip_fabric_forwrding 的虚拟网络相互通信时,将使用底层直接转发叠加流量。
由于 Contrail ip 结构-snat 功能,在不使用浮动 IPs 或逻辑路由器的情况下,叠加的盒中的 pod 可以到达互联网。Ip 结构-snat 功能使用计算节点 IP 来创建源 NAT 以到达所需的服务。
请注意,这本书不涉及 ip 交换矩阵转发和 ip 结构 snat 功能。
或者,您也可以通过引用现有虚拟网络来定义新的虚拟网络:
在这本书中,我们使用第一个模板在所有示例中定义虚拟网络。