From 6bd6b2a14b96e41cb5f703aaa2085565de69b090 Mon Sep 17 00:00:00 2001 From: windsonsea Date: Fri, 20 Sep 2024 11:10:01 +0800 Subject: [PATCH] [zh] Add services-networking/_index.md --- .../concepts/services-networking/_index.md | 232 +++++++++++------- 1 file changed, 149 insertions(+), 83 deletions(-) diff --git a/content/zh-cn/docs/concepts/services-networking/_index.md b/content/zh-cn/docs/concepts/services-networking/_index.md index 3f1e1172d8..c3a724a69c 100644 --- a/content/zh-cn/docs/concepts/services-networking/_index.md +++ b/content/zh-cn/docs/concepts/services-networking/_index.md @@ -1,117 +1,183 @@ --- title: "服务、负载均衡和联网" weight: 60 -description: Kubernetes 网络背后的概念和资源。 +description: > + Kubernetes 网络背后的概念和资源。 --- + ## Kubernetes 网络模型 {#the-kubernetes-network-model} -集群中每一个 [`Pod`](/zh-cn/docs/concepts/workloads/pods/) 都会获得自己的、 -独一无二的 IP 地址(每个 IP 地址族一个地址), -这就意味着你不需要显式地在 `Pod` 之间创建链接,你几乎不需要处理容器端口到主机端口之间的映射。 -这将形成一个干净的、向后兼容的模型;在这个模型里,从端口分配、命名、服务发现、 -[负载均衡](/zh-cn/docs/concepts/services-networking/ingress/#load-balancing)、 -应用配置和迁移的角度来看,`Pod` 可以被视作虚拟机或者物理主机。 +Kubernetes 网络模型由几个部分构成: + +* 集群中的每个 [Pod](/zh-cn/docs/concepts/workloads/pods/) + 都会获得自己的、独一无二的集群范围 IP 地址。 + + * Pod 有自己的私有网络命名空间,Pod 内的所有容器共享这个命名空间。 + 运行在同一个 Pod 中的不同容器的进程彼此之间可以通过 `localhost` 进行通信。 -Kubernetes 强制要求所有网络设施都满足以下基本要求(从而排除了有意隔离网络的策略): +* **Pod 网络**(也称为集群网络)处理 Pod 之间的通信。它确保(除非故意进行网络分段): + + * 所有 Pod 可以与所有其他 Pod 进行通信, + 无论它们是在同一个[节点](/zh-cn/docs/concepts/architecture/nodes/)还是在不同的节点上。 + Pod 可以直接相互通信,而无需使用代理或地址转换(NAT)。 + + 在 Windows 上,这条规则不适用于主机网络 Pod。 + + * 节点上的代理(例如系统守护进程或 kubelet)可以与该节点上的所有 Pod 进行通信。 -* Pod 能够与所有其他[节点](/zh-cn/docs/concepts/architecture/nodes/)上的 Pod 通信, - 且不需要网络地址转译(NAT) -* 节点上的代理(比如:系统守护进程、kubelet)可以和节点上的所有 Pod 通信 +* [Service](/zh-cn/docs/concepts/services-networking/service/) API + 允许你为由一个或多个后端 Pod 实现的服务提供一个稳定(长效)的 IP 地址或主机名, + 其中组成服务的各个 Pod 可以随时变化。 + + * Kubernetes 会自动管理 + [EndpointSlice](/zh-cn/docs/concepts/services-networking/endpoint-slices/) + 对象,以提供有关当前用来提供 Service 的 Pod 的信息。 + + * 服务代理实现通过使用操作系统或云平台 API 来拦截或重写数据包, + 监视 Service 和 EndpointSlice 对象集,并在数据平面编程将服务流量路由到其后端。 -对于支持在主机网络中运行 `Pod` 的平台(比如:Linux), -当 Pod 挂接到节点的宿主网络上时,它们仍可以不通过 NAT 和所有节点上的 Pod 通信。 +* [Gateway](/zh-cn/docs/concepts/services-networking/gateway/) API + (或其前身 [Ingress](/zh-cn/docs/concepts/services-networking/ingress/) + 使得集群外部的客户端能够访问 Service。 + + * 当使用受支持的 {{< glossary_tooltip term_id="cloud-provider">}} 时,通过 Service API 的 + [`type: LoadBalancer`](/zh-cn/docs/concepts/services-networking/service/#loadbalancer) + 可以使用一种更简单但可配置性较低的集群 Ingress 机制。 + +* [NetworkPolicy](/zh-cn/docs/concepts/services-networking/network-policies) + 是一个内置的 Kubernetes API,允许你控制 Pod 之间的流量或 Pod 与外部世界之间的流量。 -这个模型不仅不复杂,而且还和 Kubernetes 的实现从虚拟机向容器平滑迁移的初衷相符, -如果你的任务开始是在虚拟机中运行的,你的虚拟机有一个 IP, -可以和项目中其他虚拟机通信。这里的模型是基本相同的。 - -Kubernetes 的 IP 地址存在于 `Pod` 范围内 —— 容器共享它们的网络命名空间 —— -包括它们的 IP 地址和 MAC 地址。 -这就意味着 `Pod` 内的容器都可以通过 `localhost` 到达对方端口。 -这也意味着 `Pod` 内的容器需要相互协调端口的使用,但是这和虚拟机中的进程似乎没有什么不同, -这也被称为“一个 Pod 一个 IP”模型。 +在早期的容器系统中,不同主机上的容器之间没有自动连通, +因此通常需要显式创建容器之间的链路,或将容器端口映射到主机端口,以便其他主机上的容器能够访问。 +在 Kubernetes 中并不需要如此操作;在 Kubernetes 的网络模型中, +从端口分配、命名、服务发现、负载均衡、应用配置和迁移的角度来看,Pod 可以被视作虚拟机或物理主机。 -如何实现以上需求是所使用的特定容器运行时的细节。 +这个模型只有少部分是由 Kubernetes 自身实现的。 +对于其他部分,Kubernetes 定义 API,但相应的功能由外部组件提供,其中一些是可选的: -也可以在 `Node` 本身请求端口,并用这类端口转发到你的 `Pod`(称之为主机端口), -但这是一个很特殊的操作。转发方式如何实现也是容器运行时的细节。 -`Pod` 自己并不知道这些主机端口的存在。 +* Pod 网络命名空间的设置由实现[容器运行时接口(CRI)](/zh-cn/docs/concepts/architecture/cri.md)的系统层面软件处理。 -Kubernetes 网络解决四方面的问题: +* The pod network itself is managed by a + [pod network implementation](/docs/concepts/cluster-administration/addons/#networking-and-network-policy). + On Linux, most container runtimes use the + {{< glossary_tooltip text="Container Networking Interface (CNI)" term_id="cni" >}} + to interact with the pod network implementation, so these + implementations are often called _CNI plugins_. -- 一个 Pod 中的容器之间[通过本地回路(loopback)通信](/zh-cn/docs/concepts/services-networking/dns-pod-service/)。 -- 集群网络在不同 Pod 之间提供通信。 -- [Service](/zh-cn/docs/concepts/services-networking/service/) API - 允许你[向外暴露 Pod 中运行的应用](/zh-cn/docs/tutorials/services/connect-applications-service/), - 以支持来自于集群外部的访问。 - - [Ingress](/zh-cn/docs/concepts/services-networking/ingress/) - 提供专门用于暴露 HTTP 应用程序、网站和 API 的额外功能。 - - [Gateway API](/zh-cn/docs/concepts/services-networking/gateway/) - 是一个{{}}, - 为服务网络建模提供富有表现力、可扩展和面向角色的 API 系列类别。 -- 你也可以使用 Service - 来[发布仅供集群内部使用的服务](/zh-cn/docs/concepts/services-networking/service-traffic-policy/)。 +* Kubernetes provides a default implementation of service proxying, + called {{< glossary_tooltip term_id="kube-proxy">}}, but some pod + network implementations instead use their own service proxy that + is more tightly integrated with the rest of the implementation. +--> +* Pod 网络本身由 + [Pod 网络实现](/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy)管理。 + 在 Linux 上,大多数容器运行时使用{{< glossary_tooltip text="容器网络接口 (CNI)" term_id="cni" >}} + 与 Pod 网络实现进行交互,因此这些实现通常被称为 **CNI 插件**。 + +* Kubernetes 提供了一个默认的服务代理实现,称为 {{< glossary_tooltip term_id="kube-proxy">}}, + 但某些 Pod 网络实现使用其自己的服务代理,以便与实现的其余组件集成得更紧密。 + + +* NetworkPolicy 通常也由 Pod 网络实现提供支持。 + (某些更简单的 Pod 网络实现不支持 NetworkPolicy,或者管理员可能会选择在不支持 NetworkPolicy + 的情况下配置 Pod 网络。在这些情况下,API 仍然存在,但将没有效果。) + +* [Gateway API 的实现](https://gateway-api.sigs.k8s.io/implementations/)有很多, + 其中一些特定于某些云环境,还有一些更专注于“裸金属”环境,而其他一些则更加通用。 + +## {{% heading "whatsnext" %}}