如今,许多Web应用程序由多个容器组成,利用来自不同位置的不同服务。 Kubernetes有效地简化了实现多容器应用程序的过程,使用Kubernetes,可以在容器编排工具上配置单个应用程序中组合不同容器的功能,今天主要分享Kubernetes中的网络模型。
一、Kubernetes的网络条件
Kubernetes为Pods的网络通信设定了一些条件和要求:
1、Pod都能够彼此通信,而无需使用网络地址转换(NAT)。
2、节点是运行Kubernetes集群的机器。 这些可以是虚拟机或物理机,也可以是能够运行Kubernetes的任何其他机器。 这些节点还能够与所有Pod通信,而无需NAT。
3、每个Pod都会看到自己拥有与其他Pod认为具有的IP相同的IP。
二、Kubernetes的网络模型
为了利用Kubernetes,我们需要解决三个网络挑战:1)容器到容器的网络;2)Pod-to-Pod网络;3)Pod-to-Service网络。
1、容器到容器网络
我们通常认为虚拟机的网络通信由直接与之交互的单个以太网设备组成。 然而,情况的现实比这更微妙。
在Linux中,每个正在运行的进程都在网络命名空间内相互通信, 此命名空间为命名空间内包含的所有进程提供新的网络堆栈。 Linux的默认行为是将每个进程分配给根网络命名空间,并在此过程中提供对外部世界的访问。
Pod被建模为一组独立的Docker容器,所有这些容器共享一个网络命名空间。 给服务中的所有容器将具有相同的IP地址和端口空间,该空间由Pod分配的网络命名空间分配。 由于容器都位于同一名称空间内,因此它们可以通过local host相互通信。
2、Pod-to-Pod网络
Kubernetes中的每个Pod都有一个分配的IP地址,这个IP地址是其他Pod将看到的IP地址。 在了解Pod如何通过真实IP地址相互通信时,首先考虑两个位于同一物理机器上的Pod,从而共享一个节点。
就每个Pod而言,它存在于自己的以太网命名空间中。 然后,此命名空间需要与位于同一节点上的其他网络命名空间进行通信。 Linux提供了一种使用虚拟以太网设备(VED或“ veth pair ”)连接命名空间的机制。 VED包括一对虚拟接口,为了连接两个Pod名称空间,VED的一侧被分配给根网络名称空间, 然后将veth pair 的另一个成员分配给Pod的网络名称空间。
然后,VED就像一条虚拟电缆,将根网络命名空间连接到Pod的网络命名空间,并允许它们交换数据。
3、Pod-to-Service网络
Kubernetes中的Pod IP地址并不是固定的,每当应用程序按比例放大或缩小,或遇到错误并需要重新启动时,其IP地址将消失并需要重新分配。 IP地址的此更改在没有警告的情况下发生,为此,Kubernetes利用Service。
在Kubernetes中,Service管理一组Pod的当前状态,这为用户提供了跟踪IP地址和随时间变化的其他属性的方法。Service充当Pod之上的抽象层,为指定的Pod组分配单个虚拟IP地址。一旦这些Pod与该虚拟IP地址相关联,则寻址到该虚拟IP的任何流量将被发送到相应的Pod集合。可以随时更改链接到服务的Pod集,但Service的IP地址将保持不变。
因此,Kubernetes让管理多容器应用程序变得前所未有的简单。另外,基于Kubernetes的容器云平台产品——梯度智能云已发布,想要获取产品试用,欢迎联系。