diff --git a/content/zh/docs/concepts/services-networking/service-topology.md b/content/zh/docs/concepts/services-networking/service-topology.md index 1791e45f7e..4ab71cee41 100644 --- a/content/zh/docs/concepts/services-networking/service-topology.md +++ b/content/zh/docs/concepts/services-networking/service-topology.md @@ -1,10 +1,5 @@ --- -title: 服务拓扑(Service Topology) -feature: - title: 服务拓扑(Service Topology) - description: > - 基于集群拓扑的服务流量路由。 - +title: 使用拓扑键实现拓扑感知的流量路由 content_type: concept weight: 10 --- @@ -12,19 +7,27 @@ weight: 10 reviewers: - johnbelamaric - imroc -title: Service Topology -feature: - title: Service Topology - description: > - Routing of service traffic based upon cluster topology. - +title: Topology-aware traffic routing with topology keys content_type: concept weight: 10 --> -{{< feature-state for_k8s_version="v1.17" state="alpha" >}} +{{< feature-state for_k8s_version="v1.21" state="deprecated" >}} + +{{< note >}} + +此功能特性,尤其是 Alpha 阶段的 `topologyKeys` API,在 Kubernetes v1.21 +版本中已被废弃。Kubernetes v1.21 版本中引入的 +[拓扑感知的提示](/zh/docs/concepts/services-networking/topology-aware-hints/), +提供类似的功能。 +{{}} -## 介绍 {#introduction} +## 拓扑感知的流量路由 -默认情况下,发往 `ClusterIP` 或者 `NodePort` 服务的流量可能会被路由到任意一个服务后端的地址上。 -从 Kubernetes 1.7 开始,可以将“外部”流量路由到节点上运行的 Pod 上,但不支持 `ClusterIP` 服务, -更复杂的拓扑 — 比如分区路由 — 也还不支持。 -通过允许 `Service` 创建者根据源 `Node` 和目的 `Node` 的标签来定义流量路由策略, -服务拓扑特性实现了服务流量的路由。 +默认情况下,发往 `ClusterIP` 或者 `NodePort` 服务的流量可能会被路由到 +服务的任一后端的地址。Kubernetes 1.7 允许将“外部”流量路由到接收到流量的 +节点上的 Pod。对于 `ClusterIP` 服务,无法完成同节点优先的路由,你也无法 +配置集群优选路由到同一可用区中的端点。 +通过在 Service 上配置 `topologyKeys`,你可以基于来源节点和目标节点的 +标签来定义流量路由策略。 -通过对源 `Node` 和目的 `Node` 标签的匹配,运营者可以使用任何符合运营者要求的度量值 -来指定彼此“较近”和“较远”的节点组。 -例如,对于在公有云上的运营者来说,更偏向于把流量控制在同一区域内, -因为区域间的流量是有费用成本的,而区域内的流量没有。 -其它常用需求还包括把流量路由到由 `DaemonSet` 管理的本地 Pod 上,或者 -把保持流量在连接同一机架交换机的 `Node` 上,以获得低延时。 + +通过对源和目的之间的标签匹配,作为集群操作者的你可以根据节点间彼此“较近”和“较远” +来定义节点集合。你可以基于符合自身需求的任何度量值来定义标签。 +例如,在公有云上,你可能更偏向于把流量控制在同一区内,因为区间流量是有费用成本的, +而区内流量则没有。 +其它常见需求还包括把流量路由到由 `DaemonSet` 管理的本地 Pod 上,或者 +把将流量转发到连接在同一机架交换机的节点上,以获得低延时。 - ## 约束条件 {#constraints} * 服务拓扑和 `externalTrafficPolicy=Local` 是不兼容的,所以 `Service` 不能同时使用这两种特性。 - 但是在同一个集群的不同 `Service` 上是可以分别使用这两种特性的,只要不在同一个 `Service` 上就可以。 + 但是在同一个集群的不同 `Service` 上是可以分别使用这两种特性的,只要不在同一个 + `Service` 上就可以。 * 有效的拓扑键目前只有:`kubernetes.io/hostname`、`topology.kubernetes.io/zone` 和 `topology.kubernetes.io/region`,但是未来会推广到其它的 `Node` 标签。 @@ -171,23 +180,21 @@ traffic as follows. ## 示例 - 以下是使用服务拓扑功能的常见示例。 ### 仅节点本地端点 - -仅路由到节点本地端点的一种服务。 如果节点上不存在端点,流量则被丢弃: +仅路由到节点本地端点的一种服务。如果节点上不存在端点,流量则被丢弃: ```yaml apiVersion: v1 @@ -207,12 +214,11 @@ spec: ### 首选节点本地端点 - 首选节点本地端点,如果节点本地端点不存在,则回退到集群范围端点的一种服务: ```yaml @@ -234,13 +240,13 @@ spec: -### 仅地域或区域端点 - -首选地域端点而不是区域端点的一种服务。 如果以上两种范围内均不存在端点,流量则被丢弃。 +### 仅地域或区域端点 +首选地域端点而不是区域端点的一种服务。 如果以上两种范围内均不存在端点, +流量则被丢弃。 ```yaml apiVersion: v1 @@ -261,13 +267,13 @@ spec: -### 优先选择节点本地端点,地域端点,然后是区域端点 - -优先选择节点本地端点,地域端点,然后是区域端点,然后才是集群范围端点的一种服务。 +### 优先选择节点本地端点、地域端点,然后是区域端点 + +优先选择节点本地端点,地域端点,然后是区域端点,最后才是集群范围端点的 +一种服务。 ```yaml apiVersion: v1 @@ -296,3 +302,4 @@ spec: --> * 阅读关于[启用服务拓扑](/zh/docs/tasks/administer-cluster/enabling-service-topology/) * 阅读[用服务连接应用程序](/zh/docs/concepts/services-networking/connect-applications-service/) + diff --git a/content/zh/docs/concepts/services-networking/service.md b/content/zh/docs/concepts/services-networking/service.md index 3497dd817d..78b16d6e13 100644 --- a/content/zh/docs/concepts/services-networking/service.md +++ b/content/zh/docs/concepts/services-networking/service.md @@ -312,12 +312,26 @@ selectors and uses DNS names instead. For more information, see the ExternalName Service 是 Service 的特例,它没有选择算符,但是使用 DNS 名称。 有关更多信息,请参阅本文档后面的[ExternalName](#externalname)。 + +### 超出容量的 Endpoints {#over-capacity-endpoints} + +如果某个 Endpoints 资源中包含的端点个数超过 1000,则 Kubernetes v1.21 版本 +(及更新版本)的集群会将为该 Endpoints 添加注解 +`endpoints.kubernetes.io/over-capacity: warning`。 +这一注解表明所影响到的 Endpoints 对象已经超出容量。 + ### EndpointSlice -{{< feature-state for_k8s_version="v1.17" state="beta" >}} +{{< feature-state for_k8s_version="v1.21" state="stable" >}} -### 应用程序协议 {#application-protocol} +### 应用协议 {#application-protocol} {{< feature-state for_k8s_version="v1.20" state="stable" >}} + `appProtocol` 字段提供了一种为每个 Service 端口指定应用协议的方式。 此字段的取值会被映射到对应的 Endpoints 和 EndpointSlices 对象。 @@ -1077,11 +1092,15 @@ The set of protocols that can be used for LoadBalancer type of Services is still {{< note >}} 可用于 LoadBalancer 类型服务的协议集仍然由云提供商决定。 {{< /note >}} + +### 禁用负载均衡器节点端口分配 {#load-balancer-nodeport-allocation} {{< feature-state for_k8s_version="v1.20" state="alpha" >}} + -### 禁用负载均衡器节点端口分配 {#load-balancer-nodeport-allocation} - -{{< feature-state for_k8s_version="v1.20" state="alpha" >}} - 从 v1.20 版本开始, 你可以通过设置 `spec.allocateLoadBalancerNodePorts` 为 `false` 对类型为 LoadBalancer 的服务禁用节点端口分配。 这仅适用于直接将流量路由到 Pod 而不是使用节点端口的负载均衡器实现。 默认情况下,`spec.allocateLoadBalancerNodePorts` 为 `true`, LoadBalancer 类型的服务继续分配节点端口。 -如果现有服务已被分配节点端口,将参数 `spec.allocateLoadBalancerNodePorts` 设置为 `false` 时, -这些服务上已分配置的节点端口不会被自动释放。 +如果现有服务已被分配节点端口,将参数 `spec.allocateLoadBalancerNodePorts` +设置为 `false` 时,这些服务上已分配置的节点端口不会被自动释放。 你必须显式地在每个服务端口中删除 `nodePorts` 项以释放对应端口。 你必须启用 `ServiceLBNodePortControl` 特性门控才能使用该字段。 + + +#### 设置负载均衡器实现的类别 {#load-balancer-class} + +{{< feature-state for_k8s_version="v1.21" state="alpha" >}} + + +从 v1.21 开始,你可以有选择地为 `LoadBalancer` 类型的服务设置字段 +`.spec.loadBalancerClass`,以指定其负载均衡器实现的类别。 +默认情况下,`.spec.loadBalancerClass` 的取值是 `nil`,`LoadBalancer` 类型 +服务会使用云提供商的默认负载均衡器实现。 +如果设置了 `.spec.loadBalancerClass`,则假定存在某个与所指定的类相匹配的 +负载均衡器实现在监视服务变化。 +所有默认的负载均衡器实现(例如,由云提供商所提供的)都会忽略设置了此字段 +的服务。`.spec.loadBalancerClass` 只能设置到类型为 `LoadBalancer` 的 Service +之上,而且一旦设置之后不可变更。 + + +`.spec.loadBalancerClass` 的值必须是一个标签风格的标识符, +可以有选择地带有类似 "`internal-vip`" 或 "`example.com/internal-vip`" 这类 +前缀。没有前缀的名字是保留给最终用户的。 +你必须启用 `ServiceLoadBalancerClass` 特性门控才能使用此字段。 +