
PodAffinity
所有PodAffinityTerm都必须满足
// Pod affinity is a group of inter pod affinity scheduling rules.type PodAffinity struct {// NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented.// If the affinity requirements specified by this field are not met at// scheduling time, the pod will not be scheduled onto the node.// If the affinity requirements specified by this field cease to be met// at some point during pod execution (e.g. due to a pod label update), the// system will try to eventually evict the pod from its node.// When there are multiple elements, the lists of nodes corresponding to each// podAffinityTerm are intersected, i.e. all terms must be satisfied.// +optional// RequiredDuringSchedulingRequiredDuringExecution []PodAffinityTerm `json:"requiredDuringSchedulingRequiredDuringExecution,omitempty"`// If the affinity requirements specified by this field are not met at// scheduling time, the pod will not be scheduled onto the node.// If the affinity requirements specified by this field cease to be met// at some point during pod execution (e.g. due to a pod label update), the// system may or may not try to eventually evict the pod from its node.// When there are multiple elements, the lists of nodes corresponding to each// podAffinityTerm are intersected, i.e. all terms must be satisfied.// +optionalRequiredDuringSchedulingIgnoredDuringExecution []PodAffinityTerm `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,1,rep,name=requiredDuringSchedulingIgnoredDuringExecution"`// The scheduler will prefer to schedule pods to nodes that satisfy// the affinity expressions specified by this field, but it may choose// a node that violates one or more of the expressions. The node that is// most preferred is the one with the greatest sum of weights, i.e.// for each node that meets all of the scheduling requirements (resource// request, requiredDuringScheduling affinity expressions, etc.),// compute a sum by iterating through the elements of this field and adding// "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the// node(s) with the highest sum are the most preferred.// +optionalPreferredDuringSchedulingIgnoredDuringExecution []WeightedPodAffinityTerm `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,2,rep,name=preferredDuringSchedulingIgnoredDuringExecution"`}
PodAffinityTerm
一个PodAffinity包含多个PodAffinityTerm,多个PodAffinityTerm是AND关系。
一个PodAffinityTerm对应一个LabelSelector
// Defines a set of pods (namely those matching the labelSelector// relative to the given namespace(s)) that this pod should be// co-located (affinity) or not co-located (anti-affinity) with,// where co-located is defined as running on a node whose value of// the label with key <topologyKey> matches that of any node on which// a pod of the set of pods is runningtype PodAffinityTerm struct {// A label query over a set of resources, in this case pods.// +optionalLabelSelector *metav1.LabelSelector `json:"labelSelector,omitempty" protobuf:"bytes,1,opt,name=labelSelector"`// namespaces specifies which namespaces the labelSelector applies to (matches against);// null or empty list means "this pod's namespace"// +optionalNamespaces []string `json:"namespaces,omitempty" protobuf:"bytes,2,rep,name=namespaces"`// This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching// the labelSelector in the specified namespaces, where co-located is defined as running on a node// whose value of the label with key topologyKey matches that of any node on which any of the// selected pods is running.// Empty topologyKey is not allowed.TopologyKey string `json:"topologyKey" protobuf:"bytes,3,opt,name=topologyKey"`}
LabelSelector
matchLabels 是由 {key,value} 对组成的映射。 matchLabels 映射中的单个 {key,value } 等同于 matchExpressions 的元素, 其 key 字段为 “key”,operator 为 “In”,而 values 数组仅包含 “value”。
matchExpressions 是 Pod 选择算符需求的列表。 有效的运算符包括 In、NotIn、Exists 和 DoesNotExist。 在 In 和 NotIn 的情况下,设置的值必须是非空的。 matchExpressions是数组:[]LabelSelectorRequirement,多个LabelSelectorRequirement之间是AND关系
来自 matchLabels 和 matchExpressions 的所有要求都按逻辑与的关系组合到一起 — 它们必须都满足才能匹配。**
// Note:// There are two different styles of label selectors used in versioned types:// an older style which is represented as just a string in versioned types, and a// newer style that is structured. LabelSelector is an internal representation for the// latter style.// A label selector is a label query over a set of resources. The result of matchLabels and// matchExpressions are ANDed. An empty label selector matches all objects. A null// label selector matches no objects.type LabelSelector struct {// matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels// map is equivalent to an element of matchExpressions, whose key field is "key", the// operator is "In", and the values array contains only "value". The requirements are ANDed.// +optionalMatchLabels map[string]string `json:"matchLabels,omitempty" protobuf:"bytes,1,rep,name=matchLabels"`// matchExpressions is a list of label selector requirements. The requirements are ANDed.// +optionalMatchExpressions []LabelSelectorRequirement `json:"matchExpressions,omitempty" protobuf:"bytes,2,rep,name=matchExpressions"`}
NodeAffinity
// Node affinity is a group of node affinity scheduling rules.type NodeAffinity struct {// NOT YET IMPLEMENTED. TODO: Uncomment field once it is implemented.// If the affinity requirements specified by this field are not met at// scheduling time, the pod will not be scheduled onto the node.// If the affinity requirements specified by this field cease to be met// at some point during pod execution (e.g. due to an update), the system// will try to eventually evict the pod from its node.// +optional// RequiredDuringSchedulingRequiredDuringExecution *NodeSelector `json:"requiredDuringSchedulingRequiredDuringExecution,omitempty"`// If the affinity requirements specified by this field are not met at// scheduling time, the pod will not be scheduled onto the node.// If the affinity requirements specified by this field cease to be met// at some point during pod execution (e.g. due to an update), the system// may or may not try to eventually evict the pod from its node.// +optionalRequiredDuringSchedulingIgnoredDuringExecution *NodeSelector `json:"requiredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,1,opt,name=requiredDuringSchedulingIgnoredDuringExecution"`// The scheduler will prefer to schedule pods to nodes that satisfy// the affinity expressions specified by this field, but it may choose// a node that violates one or more of the expressions. The node that is// most preferred is the one with the greatest sum of weights, i.e.// for each node that meets all of the scheduling requirements (resource// request, requiredDuringScheduling affinity expressions, etc.),// compute a sum by iterating through the elements of this field and adding// "weight" to the sum if the node matches the corresponding matchExpressions; the// node(s) with the highest sum are the most preferred.// +optionalPreferredDuringSchedulingIgnoredDuringExecution []PreferredSchedulingTerm `json:"preferredDuringSchedulingIgnoredDuringExecution,omitempty" protobuf:"bytes,2,rep,name=preferredDuringSchedulingIgnoredDuringExecution"`}
NodeSelector
一个NodeAffinity对一个NodeSelector。
一个NodeSelector可以配置多个NodeSelectorTerm,多个NodeSelectorTerm之间是OR关系
// A node selector represents the union of the results of one or more label queries// over a set of nodes; that is, it represents the OR of the selectors represented// by the node selector terms.type NodeSelector struct {//Required. A list of node selector terms. The terms are ORed.NodeSelectorTerms []NodeSelectorTerm `json:"nodeSelectorTerms" protobuf:"bytes,1,rep,name=nodeSelectorTerms"`}
NodeSelectorTerm
每个NodeSelectorTerm有一个属性matchExpressions,matchExpression数组是AND关系
// A null or empty node selector term matches no objects. The requirements of// them are ANDed.// The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.type NodeSelectorTerm struct {// A list of node selector requirements by node's labels.// +optionalMatchExpressions []NodeSelectorRequirement `json:"matchExpressions,omitempty" protobuf:"bytes,1,rep,name=matchExpressions"`// A list of node selector requirements by node's fields.// +optionalMatchFields []NodeSelectorRequirement `json:"matchFields,omitempty" protobuf:"bytes,2,rep,name=matchFields"`}

