Kubernetes 网络:了解网络模型的完整指南

已发表: 2020-02-18

容器管理是网络的一个重要方面。 随着当今不断变化的流量需求,Kubernetes 的重要性增加了十倍。 如果你有兴趣学习网络,你必须先熟悉 Kubernetes。 了解 Kubernetes 将帮助您有效地处理容器管理。 Kubernetes 也是 2020 年市场上顶级的 DevOps 工具之一。

但请不要担心,因为在本详细指南中,我们将讨论相同的内容。 Kubernetes 是一个容器管理工具,在本文中,您将了解使用它的原因、它的网络组件是什么以及它们如何路由流量。

从世界顶级大学在线学习软件工程获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

让我们潜入水中。

目录

什么是 Kubernetes?

在我们开始讨论 Kubernetes 中的网络之前,我们必须考虑这个工具的基本概念。 这样,您就不会在本文后面遇到困惑,并对此处提到的所有内容有基本的了解。

Kubernetes 是一个开源的容器编排工具。 它可以帮助您管理容器,这已成为当今网络最关键的方面。 Kubernetes 有很多功能,包括容器的扩容、容器的部署、容器的去扩容等。

Docker 帮助专业人员创建容器,而 Kubernetes 帮助他们管理容器。 这就是为什么它们都如此重要。 Kubernetes 在集群上运行分布式系统。 了解它的结构和网络可以让您避免错误并无错误地管理容器。

为什么要使用 Kubernetes?

在过去的几年里,公司的容器需求大幅增加。 除非它们太小,否则它们不能依赖一两个容器。 他们需要有大量的容器来进行负载平衡。 维持高可用性和平衡流量的要求可能有数百个。

当流量增加时,他们需要更多的容器来处理请求。 同样,当流量减少时,他们将需要缩小容器。 根据需求管理容器可能具有挑战性,尤其是如果您手动进行。

手动编排容器可能会花费大量时间和资源,而这些时间和资源很容易花在其他地方。 自动化此任务使事情变得简单得多。 这样您就不必担心容器的缩放和除垢。 这就是 Kubernetes 所做的。 在我们面向初学者的顶级 DevOps 项目文章中阅读如何在 Kubernetes 的帮助下为初学者创建 DevOps 项目。

它使容器的编排和管理自动化。 它因其功能而广受欢迎。 它是 Google 的产品,其性能极大地帮助组织自动扩展容器。

Kubernetes 的组件

既然您知道 Kubernetes 是什么以及它的功能是什么,我们就可以开始讨论它的多个组件了。 只有在熟悉了它的不同部分之后,您才能理解这个工具中的网络。 然而,没有什么可担心的。 那是因为我们是来帮忙的。 以下是对其各个组成部分的简要说明。 虽然描述很简洁,但应该足以让您大致了解一下。

豆荚

还记得化学中的原子,最小的独立物体吗? 好吧,Pod 是 Kubernetes 的原子。 一个 Pod 是集群中的工作负载。 它可以包含一个或多个带有存储的容器。 每个 Pod 都有一个唯一的 IP 地址,当它与 Kubernetes 的其他组件交互时,它充当它的身份。 一个 pod 的所有容器都被调度并位于同一台机器中。

控制器

控制器构建 Kubernetes。 控制器监视 API 服务器的状态,以确保其当前状态与您指定的状态相匹配。 如果 API 服务器的状态由于某种原因发生变化,它会做出相应的反应。 控制器使用循环来检查集群的状态并将它们与所需的状态进行比较。 它还可以执行将当前状态更改为必要状态的任务。

节点

如果说 Pod 是原子,那么 Node 就是 Kubernetes 的齿轮。 他们运行集群。 虚拟机是 Kubernetes 集群中的可访问节点。 许多人倾向于使用“主机”这个词而不是“节点”。 我们尝试在本文中始终如一地使用术语节点。

API 服务器

API 服务器是 Kubernetes 中数据存储的网关。 它允许您为集群指定所需的状态。 如果要更改 Kubernetes 集群的状态并描述所需的状态,则必须进行 API 调用。

由于您熟悉 Kubernetes 网络的组件,我们可以从它的网络模型及其工作原理开始。

Kubernetes 网络解释

Kubernetes 网络遵循具有以下约束的特定模型:

  • Pod 无需网络地址转换即可与所有其他 Pod 通信
  • Nods 无需网络地址转换即可与 Pods 通信
  • 其他 Pod 看到的 Pod 的 IP 与它看到的自己的 IP 相同

由于这些限制,Kubernetes 只有几个网络部分。 他们是:

  • 集装箱到集装箱转运
  • Pod 到 Pod 传输
  • Pod 到服务传输
  • 互联网到服务传输

容器到容器

您可能认为在网络中,虚拟机直接与以太网设备交互,但它的作用远不止于此。

如果您使用的是 Linux,网络命名空间将为您提供一个网络堆栈,其中包含其网络设备、路由和防火墙规则。 Linux 中每个正在运行的进程都将与这个网络命名空间进行通信。

Pod 在网络命名空间中拥有一组容器。 这些容器具有相同的端口空间和 IP 地址,通过网络命名空间分配给它们。 这些容器通过 localhost 找到彼此,因为它们位于同一个命名空间中。 如果您的应用程序位于 pod 中,它们也可以访问共享卷。

Pod 到 Pod

Pod 通过其 IP 地址相互通信。 每个 Pod 在 Kubernetes 中都有一个真实且不同的 IP 地址。 您已经知道 Pod 是什么,因此我们无需触及该主题。 我们知道 Kubernetes 使用 IP 来促进 pod 之间的通信; 让我们讨论一下它是如何做到的。

Pod 通过它们的节点进行通信。 这就是为什么要了解 Pod 到 pod 的通信,并且您需要了解节点之间的交互。

  • 节点间通信
  • 节点内通信

我们将详细讨论它们中的每一个:

节点间通信

当节点位于不同的 pod 中时,它们将通过这种方法进行通信。 我们可以通过一个简单的例子来理解这种通信方式。 假设有四个不同的 Pod 网络,分别是 Pod 1、Pod 2、Pod 3,等等。 Pod 1 和 2 位于 Node 1 根网络中,Pod 3 和 4 位于 2nd 网络中。

您需要将数据包从 pod 1 传输到 pod 4。

数据包首先必须离开 pod 1 网络并通过 veth0 进入根网络。 它通过 Linux 网桥,这有助于它找到目的地。 由于节点在其 Pod 中没有目标,因此将其发送回接口 eth0。 现在它为路由表留下第一个节点。 路由表将数据包路由到所需的节点,该节点位于 pod4 中。 数据包首先到达节点 2,然后到达网桥,网桥将其引导至目的地。

节点内通信

当节点位于同一个 Pod 中时,会发生节点内通信。 我们可以像解释节点间通信一样解释节点内通信。 在这些情况下,数据包从位于 eth0 的第一个 Pod 传输。 它通过veth0进入根网络。 然后它必须通过网桥,然后它会转到指定的 IP。

这就是 Kubernetes 中 Pod 相互通信的方式。 让我们进入下一部分。

Pod 到服务

您已经在上一节中看到了流量是如何在 Pod 的 IP 地址之间路由的。 但是,IP 地址存在问题。 Pod 的 IP 可以根据容器的缩放比例消失和重新出现。 所以,如果容器被缩放,Pod IP 的数量会增加,反之亦然。

这些服务有助于管理这种情况。 这里简单解释一下 Kubernetes 里面有哪些服务,大家不要有什么疑惑。

Kubernetes 中的服务是什么?

Kubernetes 中的服务配置必须将请求传输到一组 pod 的代理。 这些 pod 获得流量,选择器处理此任务。 创建服务后,它会收到一个处理其请求的 IP 地址。 服务有多种类型,我们必须在进入 Pod 进行服务通信之前讨论它们。

Kubernetes 中一共有 4 种服务。 他们是:

  • 集群IP
  • 节点端口
  • 负载均衡器
  • 外部名称

ClusterIP 是默认服务类型。 在这种类型中,服务只能在集群中访问。 在 NodePort 中,服务暴露给每个节点的 IP。 当系统预先创建它时,NodePort 路由到 ClusterIP 服务。 与 ClusterIP 不同,您可以在集群外联系此服务。

LoadBalancer 使用云的负载均衡器将服务公开给外部网络。 NodePort 和 ClusterIP 是因为它而自动创建的,并且 ExternalName 服务将其传输为它反映了 CNAME 记录。

现在您知道什么是服务以及有多少种服务类型,让我们讨论一下 Pod 与服务之间的通信是如何发生的。

这个怎么运作?

在这种情况下,数据包通过 eth0 离开 Pod。 它通过以太网设备到达网桥,从那里传输到默认路由 eth0。 但是,它必须通过 iptables 才能被 eth0 接受。 iptables 使用它拥有的指定规则确定数据包的目的地,并将数据包发送到所需的 Pod。 完成此操作后,数据包将转到 pod 的真实 IP,而不是服务的虚拟 IP。

外部服务

前三种流量路由方法只涉及 Kubernetes。 但在实际情况下,您可能必须将 Kubernetes 网络连接到第三方网络以路由流量。 而这部分也差不多。

当与外部网络连接时,Kubernetes 可以执行两个功能:

  • 将流量从互联网路由到其网络
  • 将流量从其网络路由到互联网

前者需要一个 Ingress 网络,后者需要一个 Egress 网络。 让我们来看看它们。

入口

将您的流量从公共网络路由到您的 Kubernetes 系统是非常棘手的。 它需要 LoadBalancer 和 Controller 来处理数据包。 这是它如何工作的示例。

首先,您将部署一项服务,您的云提供商将创建一个新的负载均衡器。 负载均衡器将使用服务的指定端口在集群内的虚拟机之间分配流量。 在这里,iptables 将他们从负载均衡器获得的流量传输到所需的 Pod。 Pod 将以其 IP 响应客户端,conntrack 帮助以正确的方式重写 IP。

网络中的第 7 层负载均衡器能够根据 URL 和路径对传入流量进行分段。 当您使用 Ingress 网络时,这非常有用。

出口

当您将流量从 Kubernetes 网络的节点路由到 Internet 时,很大程度上取决于您的网络配置,以了解一切如何工作。 我们将在这里讨论一个一般性的例子来触及这个话题。

数据包从 Pod 的命名空间开始,通过 veth 到达根命名空间。 然后它会从它前往默认服务的网桥转到默认服务,因为它需要去的 IP 与网桥无关。 它在进入根命名空间时通过 iptables。

阅读: DevOps 的先决条件:这不是你想的那样

现在 Internet 网关只接受与虚拟机连接的 IP 地址。 而且我们口袋的源 pod 没有与 VM 连接。 所以 iptables 做一个源 NAT 并改变数据包的源。 现在它到达 Internet 网关,在那里它通过另一个 NAT,然后进入公共 Internet(其目的地)。

就是这样。 现在您了解了 Kubernetes 网络及其各种组件。

结论

如果您对网络感兴趣,Kubernetes 无疑是您应该学习的基本工具之一。 不熟悉这个领域的人不会知道它的重要性。 根据这些流量要求管理容器和路由流量可以为您提供很大帮助。 我们已尽力使本指南尽可能清晰,以帮助您了解所有内容。

如果您想学习和掌握 Kubernetes、DevOps 等,请查看 IIIT-B 和 upGrad 的软件开发执行 PG 计划 - 全栈开发专业化。

为未来的职业做准备

申请计算机科学理学硕士