由于CNI插件在容器级别工作,因此kubernetes pod如何获得IP而不是容器而不是容器

时间:2019-02-24 17:15:29

标签: docker kubernetes flannel project-calico flanneld

当CNI插件在容器级别工作时,kubernetes pod如何获得IP而不是容器而不是容器?

同一Pod的所有容器如何共享同一网络堆栈?

4 个答案:

答案 0 :(得分:1)

容器使用来自内核的名为 虚拟网络接口 的功能,创建了虚拟网络接口(命名为 veth0 ),然后分配给名称空间,则在创建容器时还将其分配给名称空间,当在同一个名称空间中创建多个容器时,将仅创建单个网络接口veth0。

POD只是用于指定一组资源和功能的术语,其中之一是名称空间和在其中运行的容器。

当您说POD获得IP时,实际上获得ip的是veth0接口,容器应用程序看到veth0的方式与容器外部应用程序看到服务器上的单个物理网卡的方式相同。

CNI只是技术规范,说明了如何在不更改平台的情况下使多个网络插件正常工作。所有网络插件的上述过程均应相同。

this blog post

中有一个很好的解释

答案 1 :(得分:0)

具有使一切正常的kubeproxy。一个Pod具有一个代理,该代理通过一个IP转换所有端口的其余容器。仅在特定情况下,才说您要在同一吊舱中拥有多个容器。它不是首选,但有可能。这就是为什么他们称其为“紧密”耦合。请参阅:https://kubernetes.io/docs/concepts/cluster-administration/proxies/

答案 2 :(得分:0)

首先,让我们更深入地研究CNI方面。在生产系统中,工作负载/容器(工作负载可以看作是用于实现特定功能的一个或多个容器化应用程序)网络隔离是头等安全要求。此外,根据基础结构的设置方式,路由平面可能还需要成为工作负载(kubectl代理)或主机级代理(kube代理)或中央路由平面(apiserver代理)的属性。主机级代理公开其网关。

对于服务发现和实际从工作负载/容器发送请求,您都不希望各个应用程序开发人员与apiserver代理进行对话,因为这可能会产生开销。相反,您希望它们通过kubectl或kube代理与其他应用程序通信,这些层负责了解何时以及如何与apiserver平面通信。

因此,在分配新的工作负载时,可以传递--network-plugin=cni和kubelet的路径,并告诉该kubelet如何为该工作负载/ pod设置虚拟网络接口的配置。

例如,如果您不希望pod中的应用程序容器能够直接与主机级kube代理通信,则由于要进行特定于基础架构的监视,则CNI和工作负载配置应为:

  • 监视最外面的容器
  • 最外面的容器为容器中的每个其他容器创建虚拟网络接口
  • 最外面的容器位于网桥接口(也是专用虚拟网络接口)上,可以与主机上的kube代理进行通话

Pod获得的IP是允许其他工作负载通过其网桥接口将字节发送到此Pod,因为从根本上讲,其他人应该与Pod通信,而不是Pod内部的单个工作单元。

答案 3 :(得分:0)

有一个名为“暂停容器”的特殊容器,用于存放Pod的网络名称空间。它什么也没做,它的容器处理只是进入睡眠状态。

Kubernetes为每个Pod创建一个暂停容器,以获取各自Pod的IP地址,并为属于特定Pod的所有其他容器设置网络名称空间。 Pod中的所有容器都可以使用localhost相互访问。

这意味着您的“应用程序”容器可能会消失,并恢复运行,并且所有网络设置仍将保持不变。