|
| 1 | +schema TopologySpreadConstraint: |
| 2 | + """ TopologySpreadConstraint describes how a group of pods ought to spread across topology domains. |
| 3 | + Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed. |
| 4 | +
|
| 5 | + Attributes |
| 6 | + ---------- |
| 7 | + maxSkew: int, default is Undefined, required. |
| 8 | + MaxSkew describes the degree to which pods may be unevenly distributed. When whenUnsatisfiable=DoNotSchedule,it is the |
| 9 | + maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global |
| 10 | + minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than |
| 11 | + MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In |
| 12 | + this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be |
| 13 | + scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). |
| 14 | + - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When whenUnsatisfiable=ScheduleAnyway, it is used to give higher |
| 15 | + precedence to topologies that satisfy it. It's a required field. Default value is 1 and 0 is not allowed. |
| 16 | + topologyKey: str, default is Undefined, required. |
| 17 | + TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same |
| 18 | + topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain |
| 19 | + as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy |
| 20 | + and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is |
| 21 | + "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field. |
| 22 | + whenUnsatisfiable: str, default is Undefined, required. |
| 23 | + WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. - DoNotSchedule (default) tells the |
| 24 | + scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence |
| 25 | + to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every |
| 26 | + possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, |
| 27 | + and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, |
| 28 | + incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, |
| 29 | + the cluster can still be imbalanced, but scheduler won't make it more imbalanced. It's a required field. |
| 30 | + Possible enum values: |
| 31 | + - `"DoNotSchedule"` instructs the scheduler not to schedule the pod when constraints are not satisfied. |
| 32 | + - `"ScheduleAnyway"` instructs the scheduler to schedule the pod even if constraints are not satisfied. |
| 33 | + labelSelector: LabelSelector, default is Undefined, optional. |
| 34 | + LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of |
| 35 | + pods in their corresponding topology domain. |
| 36 | + matchLabelKeys: [str], default is Undefined, optional. |
| 37 | + MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used |
| 38 | + to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group |
| 39 | + of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod |
| 40 | + labels will be ignored. A null or empty list means only match against labelSelector. |
| 41 | + minDomains: int, default is Undefined, optional. |
| 42 | + MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is |
| 43 | + less than minDomains, Pod Topology Spread treats "global minimum" as 0, and then the calculation of Skew is performed. And when |
| 44 | + the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. |
| 45 | + As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those |
| 46 | + domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value |
| 47 | + is not nil, WhenUnsatisfiable must be DoNotSchedule. |
| 48 | + For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as |
| 49 | + 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | The number of domains is less than 5(MinDomains), so "global minimum" is treated |
| 50 | + as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is |
| 51 | + scheduled to any of the three zones, it will violate MaxSkew. |
| 52 | + This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default). |
| 53 | + nodeAffinityPolicy: str, default is Undefined, optional. |
| 54 | + NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: |
| 55 | + - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. |
| 56 | + All nodes are included in the calculations. |
| 57 | + If this value is nil, the behavior is equivalent to the Honor policy. This is a beta-level feature default enabled by the |
| 58 | + NodeInclusionPolicyInPodTopologySpread feature flag. |
| 59 | + nodeTaintsPolicy: str, default is Undefined, optional. |
| 60 | + NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without |
| 61 | + taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes |
| 62 | + are included. |
| 63 | + If this value is nil, the behavior is equivalent to the Ignore policy. This is a beta-level feature default enabled by the |
| 64 | + NodeInclusionPolicyInPodTopologySpread feature flag. |
| 65 | +
|
| 66 | + Examples |
| 67 | + -------- |
| 68 | + import catalog.workload.topologyspreadconstraint as tp |
| 69 | +
|
| 70 | + topologyspreadconstraint = tp.TopologySpreadConstraint { |
| 71 | + maxSkew: 1 |
| 72 | + topologyKey: "kubernetes.io/hostname" |
| 73 | + whenUnsatisfiable: "DoNotSchedule" |
| 74 | + } |
| 75 | + """ |
| 76 | + |
| 77 | + # MaxSkew describes the degree to which pods may be unevenly distributed. |
| 78 | + # Must be greater than 0. |
| 79 | + maxSkew: int |
| 80 | + |
| 81 | + # TopologyKey is the key of node labels. |
| 82 | + topologyKey: str |
| 83 | + |
| 84 | + # WhenUnsatisfiable indicates how to deal with a pod if it doesn't satisfy the spread constraint. |
| 85 | + whenUnsatisfiable: str |
| 86 | + |
| 87 | + # LabelSelector is used to find matching pods. |
| 88 | + labelSelector?: LabelSelector |
| 89 | + |
| 90 | + # MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. |
| 91 | + matchLabelKeys?: [str] |
| 92 | + |
| 93 | + # MinDomains indicates a minimum number of eligible domains. |
| 94 | + minDomains?: int |
| 95 | + |
| 96 | + # NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. |
| 97 | + nodeAffinityPolicy?: str |
| 98 | + |
| 99 | + # NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. |
| 100 | + nodeTaintsPolicy?: str |
| 101 | + |
| 102 | + check: |
| 103 | + maxSkew > 0, "maxSkew must be greater than 0" |
| 104 | + whenUnsatisfiable in ["DoNotSchedule", "ScheduleAnyway"], "whenUnsatisfiable value is invalid" |
| 105 | + labelSelector if matchLabelKeys, "matchLabelKeys can't be set when labelSelector isn't set" |
| 106 | + minDomains > 0 if minDomains != Undefined, "minDomains must be greater than 0" |
| 107 | + nodeAffinityPolicy in ["Ignore", "Honor"] if nodeAffinityPolicy, "nodeAffinityPolicy value is invalid" |
| 108 | + nodeTaintsPolicy in ["Ignore", "Honor"] if nodeTaintsPolicy, "nodeTaintsPolicy value is invalid" |
| 109 | + |
0 commit comments