服务、负载均衡和网络

Kubernetes 网络背后的概念和资源。

Kubernetes 网络模型

Kubernetes 网络模型由以下几个部分组成:

  • 集群中的每个Pod都有自己独特的集群范围 IP 地址。

    • Pod拥有自己的私有网络命名空间,该命名空间由Pod中的所有容器共享。在同一个Pod中不同容器中运行的进程可以通过`localhost`相互通信。
  • Pod网络(也称为集群网络)处理Pod之间的通信。它确保(排除有意分割网络的情况):

    • 所有 Pod 都可以与其他所有 Pod 通信,无论它们是在同一节点上还是在不同节点上。Pod 可以直接相互通信,无需使用代理或地址转换 (NAT)。

      在 Windows 上,此规则不适用于主机网络 Pod。

    • 节点上的代理(例如系统守护进程或 kubelet)可以与该节点上的所有 Pod 通信。

  • Service API 允许你为由一个或多个后端 Pod 实现的服务提供一个稳定的(长期存在的)IP 地址或主机名,其中组成服务的单个 Pod 可能会随时间而变化。

    • Kubernetes 自动管理 EndpointSlice 对象,以提供当前支持 Service 的 Pod 信息。

    • 服务代理实现监视 Service 和 EndpointSlice 对象的集合,并通过使用操作系统或云提供商 API 来拦截或重写数据包,从而编程数据平面以将服务流量路由到其后端。

  • Gateway API(或其前身Ingress)允许您让集群外部的客户端访问服务。

  • NetworkPolicy是 Kubernetes 内置的 API,允许您控制 Pod 之间或 Pod 与外部世界之间的流量。

在较旧的容器系统中,不同主机上的容器之间没有自动连接,因此通常需要显式地在容器之间创建链接,或者将容器端口映射到主机端口以使其可被其他主机上的容器访问。这在 Kubernetes 中不需要;Kubernetes 的模型是,从端口分配、命名、服务发现、负载均衡、应用程序配置和迁移的角度来看,Pod 可以像虚拟机或物理主机一样处理。

此模型中只有少数部分由 Kubernetes 本身实现。对于其他部分,Kubernetes 定义了 API,但相应的功能由外部组件提供,其中一些是可选的。

  • Pod 网络命名空间设置由实现容器运行时接口的系统级软件处理。

  • Pod 网络本身由Pod 网络实现管理。在 Linux 上,大多数容器运行时使用容器网络接口 (CNI)与 Pod 网络实现进行交互,因此这些实现通常被称为_CNI 插件_。

  • Kubernetes 提供了一个服务代理的默认实现,称为kube-proxy,但一些 Pod 网络实现则使用自己的服务代理,该代理与实现的其他部分更紧密集成。

  • NetworkPolicy 通常也由 Pod 网络实现来实施。(一些更简单的 Pod 网络实现不支持 NetworkPolicy,或者管理员可能会选择在没有 NetworkPolicy 支持的情况下配置 Pod 网络。在这些情况下,API 仍然存在,但不会产生任何效果。)

  • Gateway API有许多实现,其中一些特定于特定的云环境,一些更侧重于“裸机”环境,还有一些更通用。

下一步

通过使用服务连接应用程序教程,您可以通过动手示例了解服务和 Kubernetes 网络。

集群网络解释了如何为您的集群设置网络,并提供了所涉及技术的概述。


服务

将运行在集群中的应用程序暴露在单个对外端点后,即使工作负载分布在多个后端上,也能使其可用。

Ingress

使用协议感知的配置机制使您的 HTTP(或 HTTPS)网络服务可用,该机制理解 URI、主机名、路径等 Web 概念。Ingress 概念允许您根据通过 Kubernetes API 定义的规则将流量映射到不同的后端。

Ingress 控制器

为了让Ingress在您的集群中工作,必须有一个_Ingress 控制器_正在运行。您需要至少选择一个 Ingress 控制器并确保其已在您的集群中设置。此页面列出了您可以部署的常见 Ingress 控制器。

Gateway API

Gateway API 是一系列 API 种类,提供动态基础设施供应和高级流量路由。

EndpointSlice

EndpointSlice API 是 Kubernetes 用来让您的 Service 扩展以处理大量后端,并允许集群高效更新其健康后端列表的机制。

网络策略

如果你想在 IP 地址或端口级别(OSI 第 3 层或第 4 层)控制流量,NetworkPolicy 允许你指定集群内部以及 Pod 与外部世界之间的流量规则。你的集群必须使用支持 NetworkPolicy 强制执行的网络插件。

服务和 Pod 的 DNS

您的工作负载可以使用 DNS 在集群中发现服务;本页解释了其工作原理。

IPv4/IPv6 双栈

Kubernetes 允许您配置单栈 IPv4 网络、单栈 IPv6 网络或同时激活两种网络家族的双栈网络。本页解释了如何操作。

拓扑感知路由

“拓扑感知路由”提供了一种机制,有助于将网络流量保留在其来源区域内。优先选择集群中 Pod 之间的同区域流量有助于提高可靠性、性能(网络延迟和吞吐量)或降低成本。

Windows 上的网络

服务 ClusterIP 分配

服务内部流量策略

如果集群中的两个 Pod 需要通信,并且它们都运行在同一节点上,请使用_服务内部流量策略_将网络流量保留在该节点内。避免通过集群网络进行往返有助于提高可靠性、性能(网络延迟和吞吐量)或降低成本。

最后修改于 2024 年 9 月 18 日太平洋标准时间下午 5:39:清理 services-networking/_index.md (810f856ca9)