Kubernetes 网络是一个系统,能够使不同集群内外的组件相互通信。这个系统会处理许多情况,其中重要的情况包括 Pod 之间的通信、Service 的通信以及集群如何处理来自外部的流量。
由于 Kubernetes 是分布式系统,因此它的网络平面跨越了集群的所有物理节点。Kubernetes 使用一个虚拟重叠网络,为集群资源提供平面的连接结构。这个虚拟重叠网络使得集群内部的资源能够相互连接,不需要考虑它们所处的物理节点。
以下是一个 Kubernetes 网络示意图:
Kubernetes 网络会自动分配 IP 地址、设置 DNS 名称和连接端口到开发者的 Pod 和 Service。通常情况下,在使用 Kubernetes 时,开发人员无需在网络或节点主机上手动处理这些任务。
Kubernetes 网络模型会为每个 Pod 分配一个在集群内唯一的 IP 地址。这样,Pod 可以使用它们的 IP 地址相互通信,不用进行额外的设置,例如网络地址转换(NAT)。
这个基本设置通过 Kubernetes 的 Service 模型得到了改进。Service 模型允许将流量导向一组 Pod 中的任意一个,并且还包括网络控制方式,例如网络策略。网络策略可以防止 Pod 之间的不必要的通信,从而提高网络的安全性和可靠性。
Kubernetes 网络使用了已知的网络概念,并将其应用到 Kubernetes 集群环境中。与传统的物理设备和虚拟机(VM)网络模型相比,Kubernetes 网络更简单、更均匀、自动化程度更高。
在过去,开发人员需要手动设置新端点,包括配置 IP 地址、在防火墙中打开端口以及设置 DNS 路由。但是,在使用 Kubernetes 时,开发者不再需要执行这些操作,Kubernetes 会自动为开发者的集群任务执行所有这些操作。
开发人员和运营人员不需要了解网络设置的细节,即可部署资源并使其对他人可用。这使得设置、维护和保持安全要求的最新状态变得更加容易,因为所有管理都可以在 Kubernetes 本身中执行。
由于已解释了虚拟机网络和 Kubernetes 网络之间的区别,这里需要提到 Docker 网络。
Kubernetes 的网络设计非常简单、平面,很适合分布式系统。在这个设计中,每个 Pod 都可以与其他任何 Pod 通信,即使它们位于不同的物理机器(节点)上。
Docker 主要用于在单个机器上运行容器,因此对网络的处理方式有所不同。默认情况下,Docker 将所有容器连接到一个称为桥接的网络中,该网络将它们连接到开发者的计算机。但是,开发者也可以为自己的容器设置各种类型的网络。这些网络包括一个桥接网络(连接相同计算机上的容器)、一个主机网络(允许容器直接使用您计算机的网络)以及一个重叠网络(创建多台机器上的网络,这对于 Docker Swarm,用于管理多个容器的工具,是必需的)。
Docker 容器在同一个网络中时,它们可以相互通信。每个容器都有自己的 IP 地址和 DNS 名称,仅在网络内部使用。这样其他网络中的容器就可以连接到它们。但是,Docker 不会自动设置从开发者的计算机到容器的连接(端口映射),开发者需要在启动容器时手动设置这些连接。
Docker 和 Kubernetes 在网络方面都有一些相似之处,但它们各自有自己的使用场景和网络设计。Docker 主要用于在单台机器上运行容器,因此它的网络设计更简单,使用桥接模式来连接容器。而 Kubernetes 则是为分布式系统设计的,因此它需要一个更复杂的网络设计来连接系统的不同部分,即使它们不在同一台机器上,也能够相互通信。因此,Kubernetes 使用了重叠网络来实现这一点。
Docker 和 Kubernetes 在容器隔离方面有所不同。在 Docker 中,可以通过将容器放在不同的网络中来阻止它们相互通信。而在 Kubernetes 中,所有 Pod 都会自动加入到同一个重叠网络中。因此,为了控制哪些 Pod 可以相互通信,Kubernetes 使用网络策略来管理网络中的流量。这种方式可以更细致地控制 Pod 之间的通信,提高了网络的安全性和可控性。
Kubernetes 网络构建于一个简单、平面的结构之上,其主要特点如下:
这些原则使 Kubernetes 网络具有可预测和一致的特性,无论是对使用集群的用户还是对管理员都是如此。Kubernetes 设置的系统确保所有 Pod 都可以可靠连接到网络,无需手动设置。
Kubernetes 使用一种称为无类域间路由(CIDR)的方法为 Pod 分配 IP 地址。这个系统决定了 pod 可以使用的 IP 地址范围。每个 pod 都会从该范围内获得一个唯一的 IP 地址,这个 IP 地址是特定于开发者的集群的。当设置新的集群网络时,开发者需要选择一个可用的 IP 地址范围(CIDR 范围)。
此外,许多向 Kubernetes 添加网络功能的工具(网络插件)可以让开发人员更细致地管理 IP 地址。使用这些工具,可以选择特定的 IP 地址、IP 地址的一部分或它们的组。这在处理更复杂的网络设置时非常有用。
Kubernetes 集群包括内置的 DNS 支持。CoreDNS 是最受欢迎的 Kubernetes DNS 提供商之一,并且在许多 Kubernetes 分发版中默认启用。
Kubernetes 会为 Pod 和 Service 自动分配 DNS 名称,格式如下:
运行在 Pod 中的应用程序通常应该使用它们的 DNS 名称配置与 Service 通信。名称是可预测的,而 Service 的 IP 地址会随着 Service 被删除和替换而改变。
在 Kubernetes 中,默认情况下所有的 Pod 都可以相互通信。这在某些情况下可能会带来安全风险,尤其是在用于多个分离应用程序、环境、团队或客户的集群中。需要采取适当的措施来控制 Pod 之间的网络通信以保护集群的安全性,。
为了管理这一点,Kubernetes 有个称为网络策略的东西。这些是开发人员可以设置的规则,用于控制 Pod 如何发送和接收流量(入口和出口)。例如,可以创建一个策略,该策略会停止所有流量到标记为?app-component:database?的 Pod,除非流量来自标记为?app-component:api?的 Pod。这是控制哪些 Pod 可以相互通信的方式,以提高安全性。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app-component: database
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app-component: api
在 Kubernetes 中,最好为所有 Pod 创建网络策略。这些策略有助于保护集群,防止可能受损的 Pod 向其他附近的 Pod 发送有害流量。这为开发人员的 Kubernetes 环境增加了一层额外的安全性。