Merge pull request #32558 from tengqm/zh-resync-topology

[zh] Resync pod topology spread constraints page
This commit is contained in:
Kubernetes Prow Robot
2022-03-27 23:01:22 -07:00
committed by GitHub
@@ -75,7 +75,7 @@ node4 Ready <none> 2m43s v1.16.0 node=node4,zone=zoneB
<!-- <!--
Then the cluster is logically viewed as below: Then the cluster is logically viewed as below:
--> -->
然后从逻辑上看集群如下: 那么,从逻辑上看集群如下:
{{<mermaid>}} {{<mermaid>}}
graph TB graph TB
@@ -96,11 +96,9 @@ graph TB
{{< /mermaid >}} {{< /mermaid >}}
<!-- <!--
Instead of manually applying labels, you can also reuse the [well-known labels](/docs/reference/labels-annotations-taints/) that are created and populated automatically on most clusters. Instead of manually applying labels, you can also reuse the [well-known labels](/docs/reference/labels-annotations-taints/) that are created and populated automatically on most clusters.
--> -->
你可以复用在大多数集群上自动创建和填充的 你可以复用在大多数集群上自动创建和填充的[常用标签](/zh/docs/reference/labels-annotations-taints/)
[常用标签](/zh/docs/reference/labels-annotations-taints/)
而不是手动添加标签。 而不是手动添加标签。
<!-- <!--
@@ -169,6 +167,12 @@ You can define one or multiple `topologySpreadConstraint` to instruct the kube-s
拓扑域中 Pod 的数量。 拓扑域中 Pod 的数量。
有关详细信息,请参考[标签选择算符](/zh/docs/concepts/overview/working-with-objects/labels/#label-selectors)。 有关详细信息,请参考[标签选择算符](/zh/docs/concepts/overview/working-with-objects/labels/#label-selectors)。
<!--
When a Pod defines more than one `topologySpreadConstraint`, those constraints are ANDed: The kube-scheduler looks for a node for the incoming Pod that satisfies all the constraints.
-->
当 Pod 定义了不止一个 `topologySpreadConstraint`,这些约束之间是逻辑与的关系。
kube-scheduler 会为新的 Pod 寻找一个能够满足所有约束的节点。
<!-- <!--
You can read more about this field by running `kubectl explain Pod.spec.topologySpreadConstraints`. You can read more about this field by running `kubectl explain Pod.spec.topologySpreadConstraints`.
--> -->
@@ -353,7 +357,6 @@ graph BT
class zoneA,zoneB cluster; class zoneA,zoneB cluster;
{{< /mermaid >}} {{< /mermaid >}}
<!-- <!--
If you apply "two-constraints.yaml" to this cluster, you will notice "mypod" stays in `Pending` state. This is because: to satisfy the first constraint, "mypod" can only be put to "zoneB"; while in terms of the second constraint, "mypod" can only put to "node2". Then a joint result of "zoneB" and "node2" returns nothing. If you apply "two-constraints.yaml" to this cluster, you will notice "mypod" stays in `Pending` state. This is because: to satisfy the first constraint, "mypod" can only be put to "zoneB"; while in terms of the second constraint, "mypod" can only put to "node2". Then a joint result of "zoneB" and "node2" returns nothing.
--> -->
@@ -374,15 +377,16 @@ The scheduler will skip the non-matching nodes from the skew calculations if the
--> -->
### 节点亲和性与节点选择器的相互作用 {#interaction-with-node-affinity-and-node-selectors} ### 节点亲和性与节点选择器的相互作用 {#interaction-with-node-affinity-and-node-selectors}
如果 Pod 定义了 `spec.nodeSelector``spec.affinity.nodeAffinity`调度器将从倾斜计算中跳过不匹配的节点。 如果 Pod 定义了 `spec.nodeSelector``spec.affinity.nodeAffinity`
调度器将在偏差计算中跳过不匹配的节点。
<!-- <!--
### Example: TopologySpreadConstraints with NodeAffinity
Suppose you have a 5-node cluster ranging from zoneA to zoneC: Suppose you have a 5-node cluster ranging from zoneA to zoneC:
and you know that "zoneC" must be excluded. In this case, you can compose the yaml as below, so that "mypod" will be placed onto "zoneB" instead of "zoneC". Similarly `spec.nodeSelector` is also respected.
{{< codenew file="pods/topology-spread-constraints/one-constraint-with-nodeaffinity.yaml" >}}
--> -->
### 示例:TopologySpreadConstraints 与 NodeAffinity
假设你有一个跨越 zoneA 到 zoneC 的 5 节点集群: 假设你有一个跨越 zoneA 到 zoneC 的 5 节点集群:
{{<mermaid>}} {{<mermaid>}}
@@ -417,7 +421,11 @@ The scheduler will skip the non-matching nodes from the skew calculations if the
class zoneC cluster; class zoneC cluster;
{{< /mermaid >}} {{< /mermaid >}}
而且你知道 "zoneC" 必须被排除在外。在这种情况下,可以按如下方式编写 yaml,
<!--
and you know that "zoneC" must be excluded. In this case, you can compose the yaml as below, so that "mypod" will be placed onto "zoneB" instead of "zoneC". Similarly `spec.nodeSelector` is also respected.
-->
而且你知道 "zoneC" 必须被排除在外。在这种情况下,可以按如下方式编写 YAML,
以便将 "mypod" 放置在 "zoneB" 上,而不是 "zoneC" 上。同样,`spec.nodeSelector` 以便将 "mypod" 放置在 "zoneB" 上,而不是 "zoneC" 上。同样,`spec.nodeSelector`
也要一样处理。 也要一样处理。
@@ -503,7 +511,7 @@ An example configuration might look like follows:
配置的示例可能看起来像下面这个样子: 配置的示例可能看起来像下面这个样子:
```yaml ```yaml
apiVersion: kubescheduler.config.k8s.io/v1beta1 apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration kind: KubeSchedulerConfiguration
profiles: profiles:
@@ -565,20 +573,24 @@ is disabled.
--> -->
此外,原来用于提供等同行为的 `SelectorSpread` 插件也会被禁用。 此外,原来用于提供等同行为的 `SelectorSpread` 插件也会被禁用。
{{< note >}}
<!--
The `PodTopologySpread` plugin does not score the nodes that don't have
the topology keys specified in the spreading constraints. This might result
in a different default behavior compared to the legacy `SelectorSpread` plugin when
using the default topology constraints.
-->
对于分布约束中所指定的拓扑键而言,`PodTopologySpread` 插件不会为不包含这些主键的节点评分。
这可能导致在使用默认拓扑约束时,其行为与原来的 `SelectorSpread` 插件的默认行为不同,
<!-- <!--
If your nodes are not expected to have **both** `kubernetes.io/hostname` and If your nodes are not expected to have **both** `kubernetes.io/hostname` and
`topology.kubernetes.io/zone` labels set, define your own constraints `topology.kubernetes.io/zone` labels set, define your own constraints
instead of using the Kubernetes defaults. instead of using the Kubernetes defaults.
The `PodTopologySpread` plugin does not score the nodes that don't have
the topology keys specified in the spreading constraints.
--> -->
{{< note >}}
如果你的节点不会 **同时** 设置 `kubernetes.io/hostname` 如果你的节点不会 **同时** 设置 `kubernetes.io/hostname`
`topology.kubernetes.io/zone` 标签,你应该定义自己的约束而不是使用 `topology.kubernetes.io/zone` 标签,你应该定义自己的约束而不是使用
Kubernetes 的默认约束。 Kubernetes 的默认约束。
插件 `PodTopologySpread` 不会为未设置分布约束中所给拓扑键的节点评分。
{{< /note >}} {{< /note >}}
<!-- <!--
@@ -586,11 +598,11 @@ If you don't want to use the default Pod spreading constraints for your cluster,
you can disable those defaults by setting `defaultingType` to `List` and leaving you can disable those defaults by setting `defaultingType` to `List` and leaving
empty `defaultConstraints` in the `PodTopologySpread` plugin configuration: empty `defaultConstraints` in the `PodTopologySpread` plugin configuration:
--> -->
如果你不想为集群使用默认的 Pod 分布约束,你可以通过设置 `defaultingType` 参数为 `List` 如果你不想为集群使用默认的 Pod 分布约束,你可以通过设置 `defaultingType` 参数为 `List`
`PodTopologySpread` 插件配置中的 `defaultConstraints` 参数置空来禁用默认 Pod 分布约束。 `PodTopologySpread` 插件配置中的 `defaultConstraints` 参数置空来禁用默认 Pod 分布约束。
```yaml ```yaml
apiVersion: kubescheduler.config.k8s.io/v1beta1 apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration kind: KubeSchedulerConfiguration
profiles: profiles:
@@ -627,12 +639,6 @@ cost-saving. This can also help on rolling update workloads and scaling out
replicas smoothly. See replicas smoothly. See
[Motivation](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/895-pod-topology-spread#motivation) [Motivation](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/895-pod-topology-spread#motivation)
for more details. for more details.
The "EvenPodsSpread" feature provides flexible options to distribute Pods evenly across different
topology domains - to achieve high availability or cost-saving. This can also help on rolling update
workloads and scaling out replicas smoothly.
See [Motivation](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190221-pod-topology-spread.md#motivation) for more details.
--> -->
要实现更细粒度的控制,你可以设置拓扑分布约束来将 Pod 分布到不同的拓扑域下, 要实现更细粒度的控制,你可以设置拓扑分布约束来将 Pod 分布到不同的拓扑域下,
从而实现高可用性或节省成本。这也有助于工作负载的滚动更新和平稳地扩展副本规模。 从而实现高可用性或节省成本。这也有助于工作负载的滚动更新和平稳地扩展副本规模。
@@ -642,13 +648,19 @@ See [Motivation](https://github.com/kubernetes/enhancements/blob/master/keps/sig
<!-- <!--
## Known Limitations ## Known Limitations
- Scaling down a Deployment may result in imbalanced Pods distribution. - There's no guarantee that the constraints remain satisfied when Pods are removed. For example, scaling down a Deployment may result in imbalanced Pods distribution.
You can use [Descheduler](https://github.com/kubernetes-sigs/descheduler) to rebalance the Pods distribution.
- Pods matched on tainted nodes are respected. See [Issue 80921](https://github.com/kubernetes/kubernetes/issues/80921) - Pods matched on tainted nodes are respected. See [Issue 80921](https://github.com/kubernetes/kubernetes/issues/80921)
--> -->
## 已知局限性 ## 已知局限性
- Deployment 缩容操作可能导致 Pod 分布不平衡。 - 当 Pod 被移除时,无法保证约束仍被满足。例如,缩减某 Deployment 的规模时,
- 具有污点的节点上的 Pods 也会被统计 Pod 的分布可能不再均衡
你可以使用 [Descheduler](https://github.com/kubernetes-sigs/descheduler)
来重新实现 Pod 分布的均衡。
- 具有污点的节点上匹配的 Pods 也会被统计。
参考 [Issue 80921](https://github.com/kubernetes/kubernetes/issues/80921)。 参考 [Issue 80921](https://github.com/kubernetes/kubernetes/issues/80921)。
## {{% heading "whatsnext" %}} ## {{% heading "whatsnext" %}}