From e02160c63c5d1f7e2881b39d15b825313a30ceaf Mon Sep 17 00:00:00 2001 From: Aldo Culquicondor Date: Fri, 12 Jun 2020 15:46:29 -0400 Subject: [PATCH 1/2] Docs for new default PodTopologySpread functionality and gate Signed-off-by: Aldo Culquicondor --- .../pods/pod-topology-spread-constraints.md | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md b/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md index 3210af95f6..b301a621c9 100644 --- a/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md +++ b/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md @@ -186,7 +186,7 @@ There are some implicit conventions worth noting here: ### Cluster-level default constraints -{{< feature-state for_k8s_version="v1.18" state="alpha" >}} +{{< feature-state for_k8s_version="v1.19" state="beta" >}} It is possible to set default topology spread constraints for a cluster. Default topology spread constraints are applied to a Pod if, and only if: @@ -203,7 +203,7 @@ replication controllers, replica sets or stateful sets that the Pod belongs to. An example configuration might look like follows: ```yaml -apiVersion: kubescheduler.config.k8s.io/v1alpha2 +apiVersion: kubescheduler.config.k8s.io/v1beta1 kind: KubeSchedulerConfiguration profiles: @@ -212,18 +212,48 @@ profiles: args: defaultConstraints: - maxSkew: 1 - topologyKey: failure-domain.beta.kubernetes.io/zone + topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway ``` {{< note >}} The score produced by default scheduling constraints might conflict with the score produced by the -[`DefaultPodTopologySpread` plugin](/docs/reference/scheduling/config/#scheduling-plugins). +[`SelectorSpread` plugin](/docs/reference/scheduling/config/#scheduling-plugins). It is recommended that you disable this plugin in the scheduling profile when using default constraints for `PodTopologySpread`. {{< /note >}} +#### Internal default constraints + +{{< feature-state for_k8s_version="v1.19" state="alpha" >}} + +When the feature gate `DefaultPodTopologySpread` is enabled, +kube-scheduler uses the following default topology constraints for the +`PodTopologySpread` plugin configuration: + +```yaml +defaultConstraints: + - maxSkew: 3 + topologyKey: "kubernetes.io/hostname" + whenUnsatisfiable: ScheduleAnyway + - maxSkew: 5 + topologyKey: "topology.kubernetes.io/zone" + whenUnsatisfiable: ScheduleAnyway +``` + +Also, the legacy `SelectorSpread` plugin, which provides an equivalent behavior, +is disabled. + +{{< note >}} +If your nodes are not expected to have **both** `kubernetes.io/hostname` and +`topology.kubernetes.io/zone` labels set, you should define your own constraints +instead of using the Kubernetes default. + +The `PodTopologySpread` plugin ignores from scoring the nodes that don't have +both topologies. +{{< /note >}} + ## Comparison with PodAffinity/PodAntiAffinity In Kubernetes, directives related to "Affinity" control how Pods are @@ -240,8 +270,6 @@ workloads and scaling out replicas smoothly. See [Motivation](https://github.com ## Known Limitations -As of 1.18, at which this feature is Beta, there are some known limitations: - - Scaling down a Deployment may result in imbalanced Pods distribution. - Pods matched on tainted nodes are respected. See [Issue 80921](https://github.com/kubernetes/kubernetes/issues/80921) From 91b83cf9067e633acd4522c11915fbf1e279b663 Mon Sep 17 00:00:00 2001 From: Aldo Culquicondor Date: Mon, 13 Jul 2020 14:30:00 -0400 Subject: [PATCH 2/2] Docs revision Signed-off-by: Aldo Culquicondor --- .../workloads/pods/pod-topology-spread-constraints.md | 11 ++++++----- .../command-line-tools-reference/feature-gates.md | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md b/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md index b301a621c9..d538775c53 100644 --- a/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md +++ b/content/en/docs/concepts/workloads/pods/pod-topology-spread-constraints.md @@ -228,7 +228,8 @@ using default constraints for `PodTopologySpread`. {{< feature-state for_k8s_version="v1.19" state="alpha" >}} -When the feature gate `DefaultPodTopologySpread` is enabled, +When you enable the `DefaultPodTopologySpread` feature gate, the +legacy `SelectorSpread` plugin is disabled. kube-scheduler uses the following default topology constraints for the `PodTopologySpread` plugin configuration: @@ -247,11 +248,11 @@ is disabled. {{< note >}} If your nodes are not expected to have **both** `kubernetes.io/hostname` and -`topology.kubernetes.io/zone` labels set, you should define your own constraints -instead of using the Kubernetes default. +`topology.kubernetes.io/zone` labels set, define your own constraints +instead of using the Kubernetes defaults. -The `PodTopologySpread` plugin ignores from scoring the nodes that don't have -both topologies. +The `PodTopologySpread` plugin does not score the nodes that don't have +the topology keys specified in the spreading constraints. {{< /note >}} ## Comparison with PodAffinity/PodAntiAffinity diff --git a/content/en/docs/reference/command-line-tools-reference/feature-gates.md b/content/en/docs/reference/command-line-tools-reference/feature-gates.md index 5422fb9202..cdd51478a1 100644 --- a/content/en/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/en/docs/reference/command-line-tools-reference/feature-gates.md @@ -80,6 +80,7 @@ different Kubernetes components. | `CustomCPUCFSQuotaPeriod` | `false` | Alpha | 1.12 | | | `CustomResourceDefaulting` | `false` | Alpha| 1.15 | 1.15 | | `CustomResourceDefaulting` | `true` | Beta | 1.16 | | +| `DefaultPodTopologySpread` | `false` | Alpha | 1.19 | | | `DevicePlugins` | `false` | Alpha | 1.8 | 1.9 | | `DevicePlugins` | `true` | Beta | 1.10 | | | `DryRun` | `false` | Alpha | 1.12 | 1.12 | @@ -404,6 +405,8 @@ Each feature gate is designed for enabling/disabling a specific feature: troubleshoot a running Pod. - `DevicePlugins`: Enable the [device-plugins](/docs/concepts/cluster-administration/device-plugins/) based resource provisioning on nodes. +- `DefaultPodTopologySpread`: Enables the use of `PodTopologySpread` scheduling plugin to do + [default spreading](/docs/concepts/workloads/pods/pod/pod-topology-spread-constraints/#internal-default-constraints). - `DryRun`: Enable server-side [dry run](/docs/reference/using-api/api-concepts/#dry-run) requests so that validation, merging, and mutation can be tested without committing. - `DynamicAuditing`: Enable [dynamic auditing](/docs/tasks/debug-application-cluster/audit/#dynamic-backend)