From 4c94ddf5d71f4f940a9e670ec765a6ecd58868fe Mon Sep 17 00:00:00 2001
From: Leon
Date: Tue, 16 Apr 2024 16:04:43 +0800
Subject: [PATCH] feat: support to specify k8s scheduling policy in cluster API
---
.github/utils/typos.toml | 1 +
apis/apps/v1alpha1/cluster_types.go | 50 +
apis/apps/v1alpha1/component_types.go | 7 +-
apis/apps/v1alpha1/zz_generated.deepcopy.go | 56 +
.../bases/apps.kubeblocks.io_clusters.yaml | 5327 ++++++++++++++---
.../bases/apps.kubeblocks.io_components.yaml | 1119 +++-
controllers/apps/operations/datascript.go | 6 +-
controllers/apps/systemaccount_util.go | 5 +-
.../crds/apps.kubeblocks.io_clusters.yaml | 5327 ++++++++++++++---
.../crds/apps.kubeblocks.io_components.yaml | 1119 +++-
docs/developer_docs/api-reference/cluster.md | 176 +-
pkg/controller/builder/builder_component.go | 19 +-
pkg/controller/component/component.go | 13 +-
.../component/synthesize_component.go | 33 +-
pkg/controller/plan/restore.go | 22 +-
.../scheduling_utils.go} | 141 +-
.../scheduling_utils_test.go} | 25 +-
pkg/controller/scheduling/suite_test.go | 151 +
18 files changed, 11744 insertions(+), 1853 deletions(-)
rename pkg/controller/{component/affinity_utils.go => scheduling/scheduling_utils.go} (63%)
rename pkg/controller/{component/affinity_utils_test.go => scheduling/scheduling_utils_test.go} (86%)
create mode 100644 pkg/controller/scheduling/suite_test.go
diff --git a/.github/utils/typos.toml b/.github/utils/typos.toml
index 9b841c16df2..7c7d114924c 100644
--- a/.github/utils/typos.toml
+++ b/.github/utils/typos.toml
@@ -7,3 +7,4 @@ AKS = "AKS"
ons = "ons"
HashiCorp = "HashiCorp"
Hashi = "Hashi"
+Ded = "Ded"
diff --git a/apis/apps/v1alpha1/cluster_types.go b/apis/apps/v1alpha1/cluster_types.go
index 89bc00b9a75..657737ccdae 100644
--- a/apis/apps/v1alpha1/cluster_types.go
+++ b/apis/apps/v1alpha1/cluster_types.go
@@ -107,6 +107,11 @@ type ClusterSpec struct {
// +optional
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
+ // Specifies the scheduling policy for the cluster.
+ //
+ // +optional
+ SchedulingPolicy *SchedulingPolicy `json:"schedulingPolicy,omitempty"`
+
// Cluster backup configuration.
//
// +optional
@@ -542,6 +547,11 @@ type ClusterComponentSpec struct {
// +optional
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
+ // Specifies the scheduling policy for the component.
+ //
+ // +optional
+ SchedulingPolicy *SchedulingPolicy `json:"schedulingPolicy,omitempty"`
+
// Specifies the resources requests and limits of the workload.
//
// +kubebuilder:pruning:PreserveUnknownFields
@@ -761,6 +771,46 @@ type Affinity struct {
Tenancy TenancyType `json:"tenancy,omitempty"`
}
+type SchedulingPolicy struct {
+ // If specified, the pod will be dispatched by specified scheduler.
+ // If not specified, the pod will be dispatched by default scheduler.
+ //
+ // +optional
+ SchedulerName string `json:"schedulerName,omitempty"`
+
+ // NodeSelector is a selector which must be true for the pod to fit on a node.
+ // Selector which must match a node's labels for the pod to be scheduled on that node.
+ // More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
+ //
+ // +optional
+ // +mapType=atomic
+ NodeSelector map[string]string `json:"nodeSelector,omitempty"`
+
+ // NodeName is a request to schedule this pod onto a specific node. If it is non-empty,
+ // the scheduler simply schedules this pod onto that node, assuming that it fits resource
+ // requirements.
+ //
+ // +optional
+ NodeName string `json:"nodeName,omitempty"`
+
+ // If specified, the cluster's scheduling constraints.
+ //
+ // +optional
+ Affinity *corev1.Affinity `json:"affinity,omitempty"`
+
+ // Attached to tolerate any taint that matches the triple `key,value,effect` using the matching operator `operator`.
+ //
+ // +optional
+ Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
+
+ // TopologySpreadConstraints describes how a group of pods ought to spread across topology
+ // domains. Scheduler will schedule pods in a way which abides by the constraints.
+ // All topologySpreadConstraints are ANDed.
+ //
+ // +optional
+ TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
+}
+
type TLSConfig struct {
// +kubebuilder:default=false
// +optional
diff --git a/apis/apps/v1alpha1/component_types.go b/apis/apps/v1alpha1/component_types.go
index 53182f77a08..570004c31cb 100644
--- a/apis/apps/v1alpha1/component_types.go
+++ b/apis/apps/v1alpha1/component_types.go
@@ -95,7 +95,7 @@ type ComponentSpec struct {
// +optional
ServiceAccountName string `json:"serviceAccountName,omitempty"`
- // Specifies the scheduling constraints for the component's workload.
+ // Specifies the scheduling constraints for the component.
// If specified, it will override the cluster-wide affinity.
//
// +optional
@@ -107,6 +107,11 @@ type ComponentSpec struct {
// +optional
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
+ // Specifies the scheduling policy for the component.
+ //
+ // +optional
+ SchedulingPolicy *SchedulingPolicy `json:"schedulingPolicy,omitempty"`
+
// Specifies the TLS configuration for the component.
//
// +optional
diff --git a/apis/apps/v1alpha1/zz_generated.deepcopy.go b/apis/apps/v1alpha1/zz_generated.deepcopy.go
index 3c4369a22b0..487e2393daf 100644
--- a/apis/apps/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/apps/v1alpha1/zz_generated.deepcopy.go
@@ -555,6 +555,11 @@ func (in *ClusterComponentSpec) DeepCopyInto(out *ClusterComponentSpec) {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
+ if in.SchedulingPolicy != nil {
+ in, out := &in.SchedulingPolicy, &out.SchedulingPolicy
+ *out = new(SchedulingPolicy)
+ (*in).DeepCopyInto(*out)
+ }
in.Resources.DeepCopyInto(&out.Resources)
if in.VolumeClaimTemplates != nil {
in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
@@ -1047,6 +1052,11 @@ func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec) {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
+ if in.SchedulingPolicy != nil {
+ in, out := &in.SchedulingPolicy, &out.SchedulingPolicy
+ *out = new(SchedulingPolicy)
+ (*in).DeepCopyInto(*out)
+ }
if in.Backup != nil {
in, out := &in.Backup, &out.Backup
*out = new(ClusterBackup)
@@ -1940,6 +1950,11 @@ func (in *ComponentSpec) DeepCopyInto(out *ComponentSpec) {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
+ if in.SchedulingPolicy != nil {
+ in, out := &in.SchedulingPolicy, &out.SchedulingPolicy
+ *out = new(SchedulingPolicy)
+ (*in).DeepCopyInto(*out)
+ }
if in.TLSConfig != nil {
in, out := &in.TLSConfig, &out.TLSConfig
*out = new(TLSConfig)
@@ -4968,6 +4983,47 @@ func (in *SchedulePolicy) DeepCopy() *SchedulePolicy {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *SchedulingPolicy) DeepCopyInto(out *SchedulingPolicy) {
+ *out = *in
+ if in.NodeSelector != nil {
+ in, out := &in.NodeSelector, &out.NodeSelector
+ *out = make(map[string]string, len(*in))
+ for key, val := range *in {
+ (*out)[key] = val
+ }
+ }
+ if in.Affinity != nil {
+ in, out := &in.Affinity, &out.Affinity
+ *out = new(v1.Affinity)
+ (*in).DeepCopyInto(*out)
+ }
+ if in.Tolerations != nil {
+ in, out := &in.Tolerations, &out.Tolerations
+ *out = make([]v1.Toleration, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.TopologySpreadConstraints != nil {
+ in, out := &in.TopologySpreadConstraints, &out.TopologySpreadConstraints
+ *out = make([]v1.TopologySpreadConstraint, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulingPolicy.
+func (in *SchedulingPolicy) DeepCopy() *SchedulingPolicy {
+ if in == nil {
+ return nil
+ }
+ out := new(SchedulingPolicy)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ScriptFrom) DeepCopyInto(out *ScriptFrom) {
*out = *in
diff --git a/config/crd/bases/apps.kubeblocks.io_clusters.yaml b/config/crd/bases/apps.kubeblocks.io_clusters.yaml
index 3c4800cc3f9..626242b28d5 100644
--- a/config/crd/bases/apps.kubeblocks.io_clusters.yaml
+++ b/config/crd/bases/apps.kubeblocks.io_clusters.yaml
@@ -2928,6 +2928,1197 @@ spec:
type: object
type: object
x-kubernetes-preserve-unknown-fields: true
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the component.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules
+ for the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling term
+ matches all objects with implicit weight 0 (i.e.
+ it's a no-op). A null preferred scheduling term
+ matches no objects (i.e. is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated
+ with the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching
+ the corresponding nodeSelectorTerm, in the
+ range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector
+ terms. The terms are ORed.
+ items:
+ description: 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.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules
+ (e.g. co-locate this pod in the same node, zone, etc.
+ as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added per-node
+ to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term,
+ associated with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in the
+ range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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
+ matches that of any node on which
+ a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of
+ namespaces that the term applies to. The
+ term is applied to the union of the namespaces
+ selected by this field and the ones listed
+ in the namespaces field. null selector and
+ null or empty namespaces list means "this
+ pod's namespace". An empty selector ({})
+ matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term applies
+ to. The term is applied to the union of
+ the namespaces listed in this field and
+ the ones selected by namespaceSelector.
+ null or empty namespaces list and null namespaceSelector
+ means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling
+ rules (e.g. avoid putting this pod in the same node,
+ zone, etc. as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule
+ pods to nodes that satisfy the anti-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 anti-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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added per-node
+ to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term,
+ associated with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in the
+ range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified
+ by this field are not met at scheduling time,
+ the pod will not be scheduled onto the node. If
+ the anti-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.
+ items:
+ description: 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
+ matches that of any node on which
+ a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of
+ namespaces that the term applies to. The
+ term is applied to the union of the namespaces
+ selected by this field and the ones listed
+ in the namespaces field. null selector and
+ null or empty namespaces list means "this
+ pod's namespace". An empty selector ({})
+ matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term applies
+ to. The term is applied to the union of
+ the namespaces listed in this field and
+ the ones selected by namespaceSelector.
+ null or empty namespaces list and null namespaceSelector
+ means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this pod
+ onto a specific node. If it is non-empty, the scheduler
+ simply schedules this pod onto that node, assuming that
+ it fits resource requirements.
+ type: string
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must be true
+ for the pod to fit on a node. Selector which must match
+ a node''s labels for the pod to be scheduled on that node.
+ More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
+ type: object
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched by
+ specified scheduler. If not specified, the pod will be
+ dispatched by default scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches
+ the triple `key,value,effect` using the matching operator
+ `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple
+ using the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to
+ match. Empty means match all taint effects. When
+ specified, allowed values are NoSchedule, PreferNoSchedule
+ and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration
+ applies to. Empty means match all taint keys. If
+ the key is empty, operator must be Exists; this
+ combination means to match all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship
+ to the value. Valid operators are Exists and Equal.
+ Defaults to Equal. Exists is equivalent to wildcard
+ for value, so that a pod can tolerate all taints
+ of a particular category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period
+ of time the toleration (which must be of effect
+ NoExecute, otherwise this field is ignored) tolerates
+ the taint. By default, it is not set, which means
+ tolerate the taint forever (do not evict). Zero
+ and negative values will be treated as 0 (evict
+ immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration
+ matches to. If the operator is Exists, the value
+ should be empty, otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how a group
+ of pods ought to spread across topology domains. Scheduler
+ will schedule pods in a way which abides by the constraints.
+ All topologySpreadConstraints are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how to
+ spread matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching
+ pods. Pods that match this label selector are counted
+ to determine the number of pods in their corresponding
+ topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement is
+ a selector that contains values, a key, and
+ an operator that relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the
+ selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty. If
+ the operator is Exists or DoesNotExist,
+ the values array must be empty. This array
+ is replaced during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label
+ keys to select the pods over which spreading will
+ be calculated. The keys are used to lookup values
+ from the incoming pod labels, those key-value labels
+ are ANDed with labelSelector to select the group
+ of existing pods over which spreading will be calculated
+ for the incoming pod. The same key is forbidden
+ to exist in both MatchLabelKeys and LabelSelector.
+ MatchLabelKeys cannot be set when LabelSelector
+ isn't set. Keys that don't exist in the incoming
+ pod labels will be ignored. A null or empty list
+ means only match against labelSelector. \n This
+ is a beta field and requires the MatchLabelKeysInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to which
+ pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`,
+ it is the maximum permitted difference between the
+ number of matching pods in the target topology and
+ the global minimum. The global minimum is the minimum
+ number of matching pods in an eligible domain or
+ zero if the number of eligible domains is less than
+ 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 this case, the global minimum
+ is 1. | zone1 | zone2 | zone3 | | P P | P P | P |
+ - if MaxSkew is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming pod can
+ be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies
+ that satisfy it. It''s a required field. Default
+ value is 1 and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number
+ of eligible domains. When the number of eligible
+ domains with matching topology keys is less than
+ minDomains, Pod Topology Spread treats \"global
+ minimum\" as 0, and then the calculation of Skew
+ is performed. And when the number of eligible domains
+ with matching topology keys equals or greater than
+ minDomains, this value has no effect on scheduling.
+ As a result, when the number of eligible domains
+ is less than minDomains, scheduler won't schedule
+ more than maxSkew Pods to those domains. If value
+ is nil, the constraint behaves as if MinDomains
+ is equal to 1. Valid values are integers greater
+ than 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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
+ 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 scheduled to any of the
+ three zones, it will violate MaxSkew. \n This is
+ a beta field and requires the MinDomainsInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how we
+ will treat Pod's nodeAffinity/nodeSelector when
+ calculating pod topology spread skew. Options are:
+ - Honor: only nodes matching nodeAffinity/nodeSelector
+ are included in the calculations. - Ignore: nodeAffinity/nodeSelector
+ are ignored. All nodes are included in the calculations.
+ \n If this value is nil, the behavior is equivalent
+ to the Honor policy. This is a beta-level feature
+ default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we will
+ treat node taints when calculating pod topology
+ spread skew. Options are: - Honor: nodes without
+ taints, along with tainted nodes for which the incoming
+ pod has a toleration, are included. - Ignore: node
+ taints are ignored. All nodes are included. \n If
+ this value is nil, the behavior is equivalent to
+ the Ignore policy. This is a beta-level feature
+ default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology.
+ We consider each as a "bucket", and
+ try to put balanced number of pods into each bucket.
+ We define a domain as a particular instance of a
+ topology. Also, we define an eligible domain as
+ a domain whose nodes meet the requirements of nodeAffinityPolicy
+ and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And, if
+ TopologyKey is "topology.kubernetes.io/zone", each
+ zone is a domain of that topology. It's a required
+ field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how to deal
+ with a pod if it doesn''t satisfy the spread constraint.
+ - DoNotSchedule (default) tells the scheduler not
+ to schedule it. - ScheduleAnyway tells the scheduler
+ to schedule the pod in any location, but giving
+ higher precedence to topologies that would help
+ reduce the skew. A constraint is considered "Unsatisfiable"
+ for an incoming pod if and only if every possible
+ node assignment for that pod would violate "MaxSkew"
+ on some topology. For example, in a 3-zone cluster,
+ MaxSkew is set to 1, 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, 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,
+ the cluster can still be imbalanced, but scheduler
+ won''t make it *more* imbalanced. It''s a required
+ field.'
+ type: string
+ required:
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
+ type: object
+ type: array
+ type: object
serviceAccountName:
description: Specifies the name of the ServiceAccount that the
running component depends on.
@@ -2952,603 +4143,1718 @@ spec:
same Cluster or ServiceDescriptor."
items:
properties:
- cluster:
- description: "The name of the KubeBlocks cluster being
- referenced when a service provided by another KubeBlocks
- cluster is being referenced. \n By default, the clusterDefinition.spec.connectionCredential
- secret corresponding to the referenced Cluster will
- be used to bind to the current component. The connection
- credential secret should include and correspond to the
- following fields: endpoint, port, username, and password
- when a KubeBlocks cluster is being referenced. \n Under
- this referencing approach, the ServiceKind and ServiceVersion
- of service reference declaration defined in the ClusterDefinition
- will not be validated. If both Cluster and ServiceDescriptor
- are specified, the Cluster takes precedence."
+ cluster:
+ description: "The name of the KubeBlocks cluster being
+ referenced when a service provided by another KubeBlocks
+ cluster is being referenced. \n By default, the clusterDefinition.spec.connectionCredential
+ secret corresponding to the referenced Cluster will
+ be used to bind to the current component. The connection
+ credential secret should include and correspond to the
+ following fields: endpoint, port, username, and password
+ when a KubeBlocks cluster is being referenced. \n Under
+ this referencing approach, the ServiceKind and ServiceVersion
+ of service reference declaration defined in the ClusterDefinition
+ will not be validated. If both Cluster and ServiceDescriptor
+ are specified, the Cluster takes precedence."
+ type: string
+ clusterRef:
+ description: Specifies the cluster to reference.
+ properties:
+ cluster:
+ description: The name of the cluster to reference.
+ type: string
+ credential:
+ description: The credential (SystemAccount) to reference
+ from the cluster.
+ properties:
+ component:
+ description: The name of the component where the
+ credential resides in.
+ type: string
+ name:
+ description: The name of the credential (SystemAccount)
+ to reference.
+ type: string
+ required:
+ - component
+ - name
+ type: object
+ service:
+ description: The service to reference from the cluster.
+ properties:
+ component:
+ description: "The name of the component where
+ the service resides in. \n It is required when
+ referencing a component service."
+ type: string
+ port:
+ description: "The port name of the service to
+ reference. \n If there is a non-zero node-port
+ exist for the matched service port, the node-port
+ will be selected first. If the referenced service
+ is a pod-service, there will be multiple service
+ objects matched, and the resolved value will
+ be presented in the following format: service1.name:port1,service2.name:port2..."
+ type: string
+ service:
+ description: "The name of the service to reference.
+ \n Leave it empty to reference the default service.
+ Set it to \"headless\" to reference the default
+ headless service. If the referenced service
+ is a pod-service, there will be multiple service
+ objects matched, and the resolved value will
+ be presented in the following format: service1.name,service2.name..."
+ type: string
+ required:
+ - service
+ type: object
+ required:
+ - cluster
+ type: object
+ name:
+ description: Specifies the identifier of the service reference
+ declaration. It corresponds to the serviceRefDeclaration
+ name defined in the clusterDefinition.componentDefs[*].serviceRefDeclarations[*].name.
+ type: string
+ namespace:
+ description: Specifies the namespace of the referenced
+ Cluster or ServiceDescriptor object. If not specified,
+ the namespace of the current cluster will be used.
+ type: string
+ serviceDescriptor:
+ description: "The service descriptor of the service provided
+ by external sources. \n When referencing a service provided
+ by external sources, a ServiceDescriptor object is required
+ to establish the service binding. The `serviceDescriptor.spec.serviceKind`
+ and `serviceDescriptor.spec.serviceVersion` should match
+ the serviceKind and serviceVersion declared in the definition.
+ \n If both Cluster and ServiceDescriptor are specified,
+ the Cluster takes precedence."
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ serviceVersion:
+ description: ServiceVersion specifies the version of the service
+ provisioned by the component. The version should follow the
+ syntax and semantics of the "Semantic Versioning" specification
+ (http://semver.org/). If not explicitly specified, the version
+ defined in the referenced topology will be used. If no version
+ is specified in the topology, the latest available version
+ will be used.
+ maxLength: 32
+ type: string
+ services:
+ description: Services overrides services defined in referenced
+ ComponentDefinition.
+ items:
+ properties:
+ annotations:
+ additionalProperties:
+ type: string
+ description: 'If ServiceType is LoadBalancer, cloud provider
+ related parameters can be put here. More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.'
+ type: object
+ name:
+ description: References the component service name defined
+ in the ComponentDefinition.Spec.Services[x].Name.
+ maxLength: 25
+ type: string
+ podService:
+ description: Indicates whether to generate individual
+ services for each pod. If set to true, a separate service
+ will be created for each pod in the cluster.
+ type: boolean
+ serviceType:
+ default: ClusterIP
+ description: "Determines how the Service is exposed. Valid
+ options are ClusterIP, NodePort, and LoadBalancer. \n
+ - `ClusterIP` allocates a cluster-internal IP address
+ for load-balancing to endpoints. Endpoints are determined
+ by the selector or if that is not specified, they are
+ determined by manual construction of an Endpoints object
+ or EndpointSlice objects. If clusterIP is \"None\",
+ no virtual IP is allocated and the endpoints are published
+ as a set of endpoints rather than a virtual IP. - `NodePort`
+ builds on ClusterIP and allocates a port on every node
+ which routes to the same endpoints as the clusterIP.
+ - `LoadBalancer` builds on NodePort and creates an external
+ load-balancer (if supported in the current cloud) which
+ routes to the same endpoints as the clusterIP. \n More
+ info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types."
+ enum:
+ - ClusterIP
+ - NodePort
+ - LoadBalancer
+ type: string
+ x-kubernetes-preserve-unknown-fields: true
+ required:
+ - name
+ type: object
+ type: array
+ switchPolicy:
+ description: Defines the strategy for switchover and failover
+ when workloadType is Replication.
+ properties:
+ type:
+ default: Noop
+ description: Type specifies the type of switch policy to
+ be applied.
+ enum:
+ - Noop
+ type: string
+ type: object
+ tls:
+ description: Enables or disables TLS certs.
+ type: boolean
+ tolerations:
+ description: Attached to tolerate any taint that matches the
+ triple `key,value,effect` using the matching operator `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple using
+ the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to match.
+ Empty means match all taint effects. When specified,
+ allowed values are NoSchedule, PreferNoSchedule and
+ NoExecute.
type: string
- clusterRef:
- description: Specifies the cluster to reference.
+ key:
+ description: Key is the taint key that the toleration
+ applies to. Empty means match all taint keys. If the
+ key is empty, operator must be Exists; this combination
+ means to match all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship
+ to the value. Valid operators are Exists and Equal.
+ Defaults to Equal. Exists is equivalent to wildcard
+ for value, so that a pod can tolerate all taints of
+ a particular category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period of
+ time the toleration (which must be of effect NoExecute,
+ otherwise this field is ignored) tolerates the taint.
+ By default, it is not set, which means tolerate the
+ taint forever (do not evict). Zero and negative values
+ will be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration matches
+ to. If the operator is Exists, the value should be empty,
+ otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ x-kubernetes-preserve-unknown-fields: true
+ updateStrategy:
+ description: Defines the update strategy for the component.
+ Not supported.
+ enum:
+ - Serial
+ - BestEffortParallel
+ - Parallel
+ type: string
+ userResourceRefs:
+ description: Defines the user-defined volumes.
+ properties:
+ configMapRefs:
+ description: ConfigMapRefs defines the user-defined config
+ maps.
+ items:
+ description: ConfigMapRef defines a reference to a ConfigMap.
properties:
- cluster:
- description: The name of the cluster to reference.
- type: string
- credential:
- description: The credential (SystemAccount) to reference
- from the cluster.
+ asVolumeFrom:
+ description: AsVolumeFrom lists the names of containers
+ in which the volume should be mounted.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ configMap:
+ description: ConfigMap specifies the ConfigMap to
+ be mounted as a volume.
properties:
- component:
- description: The name of the component where the
- credential resides in.
- type: string
+ defaultMode:
+ description: 'defaultMode is optional: mode bits
+ used to set permissions on created files by
+ default. Must be an octal value between 0000
+ and 0777 or a decimal value between 0 and 511.
+ YAML accepts both octal and decimal values,
+ JSON requires decimal values for mode bits.
+ Defaults to 0644. Directories within the path
+ are not affected by this setting. This might
+ be in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ items:
+ description: items if unspecified, each key-value
+ pair in the Data field of the referenced ConfigMap
+ will be projected into the volume as a file
+ whose name is the key and content is the value.
+ If specified, the listed keys will be projected
+ into the specified paths, and unlisted keys
+ will not be present. If a key is specified which
+ is not present in the ConfigMap, the volume
+ setup will error unless it is marked optional.
+ Paths must be relative and may not contain the
+ '..' path or start with '..'.
+ items:
+ description: Maps a string key to a path within
+ a volume.
+ properties:
+ key:
+ description: key is the key to project.
+ type: string
+ mode:
+ description: 'mode is Optional: mode bits
+ used to set permissions on this file.
+ Must be an octal value between 0000 and
+ 0777 or a decimal value between 0 and
+ 511. YAML accepts both octal and decimal
+ values, JSON requires decimal values for
+ mode bits. If not specified, the volume
+ defaultMode will be used. This might be
+ in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ path:
+ description: path is the relative path of
+ the file to map the key to. May not be
+ an absolute path. May not contain the
+ path element '..'. May not start with
+ the string '..'.
+ type: string
+ required:
+ - key
+ - path
+ type: object
+ type: array
name:
- description: The name of the credential (SystemAccount)
- to reference.
+ description: 'Name of the referent. More info:
+ https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+ TODO: Add other useful fields. apiVersion, kind,
+ uid?'
type: string
- required:
- - component
- - name
+ optional:
+ description: optional specify whether the ConfigMap
+ or its keys must be defined
+ type: boolean
type: object
- service:
- description: The service to reference from the cluster.
+ x-kubernetes-map-type: atomic
+ mountPoint:
+ description: MountPoint is the filesystem path where
+ the volume will be mounted.
+ maxLength: 256
+ pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referenced ConfigMap
+ or Secret object. It must conform to DNS label standards.
+ maxLength: 63
+ pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
+ type: string
+ subPath:
+ description: SubPath specifies a path within the volume
+ from which to mount.
+ type: string
+ required:
+ - configMap
+ - mountPoint
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ secretRefs:
+ description: SecretRefs defines the user-defined secrets.
+ items:
+ description: SecretRef defines a reference to a Secret.
+ properties:
+ asVolumeFrom:
+ description: AsVolumeFrom lists the names of containers
+ in which the volume should be mounted.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ mountPoint:
+ description: MountPoint is the filesystem path where
+ the volume will be mounted.
+ maxLength: 256
+ pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referenced ConfigMap
+ or Secret object. It must conform to DNS label standards.
+ maxLength: 63
+ pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
+ type: string
+ secret:
+ description: Secret specifies the secret to be mounted
+ as a volume.
properties:
- component:
- description: "The name of the component where
- the service resides in. \n It is required when
- referencing a component service."
- type: string
- port:
- description: "The port name of the service to
- reference. \n If there is a non-zero node-port
- exist for the matched service port, the node-port
- will be selected first. If the referenced service
- is a pod-service, there will be multiple service
- objects matched, and the resolved value will
- be presented in the following format: service1.name:port1,service2.name:port2..."
- type: string
- service:
- description: "The name of the service to reference.
- \n Leave it empty to reference the default service.
- Set it to \"headless\" to reference the default
- headless service. If the referenced service
- is a pod-service, there will be multiple service
- objects matched, and the resolved value will
- be presented in the following format: service1.name,service2.name..."
+ defaultMode:
+ description: 'defaultMode is Optional: mode bits
+ used to set permissions on created files by
+ default. Must be an octal value between 0000
+ and 0777 or a decimal value between 0 and 511.
+ YAML accepts both octal and decimal values,
+ JSON requires decimal values for mode bits.
+ Defaults to 0644. Directories within the path
+ are not affected by this setting. This might
+ be in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ items:
+ description: items If unspecified, each key-value
+ pair in the Data field of the referenced Secret
+ will be projected into the volume as a file
+ whose name is the key and content is the value.
+ If specified, the listed keys will be projected
+ into the specified paths, and unlisted keys
+ will not be present. If a key is specified which
+ is not present in the Secret, the volume setup
+ will error unless it is marked optional. Paths
+ must be relative and may not contain the '..'
+ path or start with '..'.
+ items:
+ description: Maps a string key to a path within
+ a volume.
+ properties:
+ key:
+ description: key is the key to project.
+ type: string
+ mode:
+ description: 'mode is Optional: mode bits
+ used to set permissions on this file.
+ Must be an octal value between 0000 and
+ 0777 or a decimal value between 0 and
+ 511. YAML accepts both octal and decimal
+ values, JSON requires decimal values for
+ mode bits. If not specified, the volume
+ defaultMode will be used. This might be
+ in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ path:
+ description: path is the relative path of
+ the file to map the key to. May not be
+ an absolute path. May not contain the
+ path element '..'. May not start with
+ the string '..'.
+ type: string
+ required:
+ - key
+ - path
+ type: object
+ type: array
+ optional:
+ description: optional field specify whether the
+ Secret or its keys must be defined
+ type: boolean
+ secretName:
+ description: 'secretName is the name of the secret
+ in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
type: string
- required:
- - service
type: object
+ subPath:
+ description: SubPath specifies a path within the volume
+ from which to mount.
+ type: string
required:
- - cluster
- type: object
- name:
- description: Specifies the identifier of the service reference
- declaration. It corresponds to the serviceRefDeclaration
- name defined in the clusterDefinition.componentDefs[*].serviceRefDeclarations[*].name.
- type: string
- namespace:
- description: Specifies the namespace of the referenced
- Cluster or ServiceDescriptor object. If not specified,
- the namespace of the current cluster will be used.
- type: string
- serviceDescriptor:
- description: "The service descriptor of the service provided
- by external sources. \n When referencing a service provided
- by external sources, a ServiceDescriptor object is required
- to establish the service binding. The `serviceDescriptor.spec.serviceKind`
- and `serviceDescriptor.spec.serviceVersion` should match
- the serviceKind and serviceVersion declared in the definition.
- \n If both Cluster and ServiceDescriptor are specified,
- the Cluster takes precedence."
- type: string
- required:
- - name
- type: object
- type: array
- serviceVersion:
- description: ServiceVersion specifies the version of the service
- provisioned by the component. The version should follow the
- syntax and semantics of the "Semantic Versioning" specification
- (http://semver.org/). If not explicitly specified, the version
- defined in the referenced topology will be used. If no version
- is specified in the topology, the latest available version
- will be used.
- maxLength: 32
- type: string
- services:
- description: Services overrides services defined in referenced
- ComponentDefinition.
- items:
- properties:
- annotations:
- additionalProperties:
- type: string
- description: 'If ServiceType is LoadBalancer, cloud provider
- related parameters can be put here. More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.'
+ - mountPoint
+ - name
+ - secret
type: object
- name:
- description: References the component service name defined
- in the ComponentDefinition.Spec.Services[x].Name.
- maxLength: 25
- type: string
- podService:
- description: Indicates whether to generate individual
- services for each pod. If set to true, a separate service
- will be created for each pod in the cluster.
- type: boolean
- serviceType:
- default: ClusterIP
- description: "Determines how the Service is exposed. Valid
- options are ClusterIP, NodePort, and LoadBalancer. \n
- - `ClusterIP` allocates a cluster-internal IP address
- for load-balancing to endpoints. Endpoints are determined
- by the selector or if that is not specified, they are
- determined by manual construction of an Endpoints object
- or EndpointSlice objects. If clusterIP is \"None\",
- no virtual IP is allocated and the endpoints are published
- as a set of endpoints rather than a virtual IP. - `NodePort`
- builds on ClusterIP and allocates a port on every node
- which routes to the same endpoints as the clusterIP.
- - `LoadBalancer` builds on NodePort and creates an external
- load-balancer (if supported in the current cloud) which
- routes to the same endpoints as the clusterIP. \n More
- info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types."
- enum:
- - ClusterIP
- - NodePort
- - LoadBalancer
- type: string
- x-kubernetes-preserve-unknown-fields: true
- required:
- - name
- type: object
- type: array
- switchPolicy:
- description: Defines the strategy for switchover and failover
- when workloadType is Replication.
- properties:
- type:
- default: Noop
- description: Type specifies the type of switch policy to
- be applied.
- enum:
- - Noop
- type: string
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
- tls:
- description: Enables or disables TLS certs.
- type: boolean
- tolerations:
- description: Attached to tolerate any taint that matches the
- triple `key,value,effect` using the matching operator `operator`.
+ volumeClaimTemplates:
+ description: Provides information for statefulset.spec.volumeClaimTemplates.
items:
- description: The pod this Toleration is attached to tolerates
- any taint that matches the triple using
- the matching operator .
properties:
- effect:
- description: Effect indicates the taint effect to match.
- Empty means match all taint effects. When specified,
- allowed values are NoSchedule, PreferNoSchedule and
- NoExecute.
- type: string
- key:
- description: Key is the taint key that the toleration
- applies to. Empty means match all taint keys. If the
- key is empty, operator must be Exists; this combination
- means to match all values and all keys.
- type: string
- operator:
- description: Operator represents a key's relationship
- to the value. Valid operators are Exists and Equal.
- Defaults to Equal. Exists is equivalent to wildcard
- for value, so that a pod can tolerate all taints of
- a particular category.
- type: string
- tolerationSeconds:
- description: TolerationSeconds represents the period of
- time the toleration (which must be of effect NoExecute,
- otherwise this field is ignored) tolerates the taint.
- By default, it is not set, which means tolerate the
- taint forever (do not evict). Zero and negative values
- will be treated as 0 (evict immediately) by the system.
- format: int64
- type: integer
- value:
- description: Value is the taint value the toleration matches
- to. If the operator is Exists, the value should be empty,
- otherwise just a regular string.
+ name:
+ description: Refers to `clusterDefinition.spec.componentDefs.containers.volumeMounts.name`.
type: string
+ spec:
+ description: Defines the desired characteristics of a
+ volume requested by a pod author.
+ properties:
+ accessModes:
+ description: 'Contains the desired access modes the
+ volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.'
+ items:
+ type: string
+ type: array
+ x-kubernetes-preserve-unknown-fields: true
+ resources:
+ description: 'Represents the minimum resources the
+ volume should have. If the RecoverVolumeExpansionFailure
+ feature is enabled, users are allowed to specify
+ resource requirements that are lower than the previous
+ value but must still be higher than the capacity
+ recorded in the status field of the claim. More
+ info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.'
+ properties:
+ claims:
+ description: "Claims lists the names of resources,
+ defined in spec.resourceClaims, that are used
+ by this container. \n This is an alpha field
+ and requires enabling the DynamicResourceAllocation
+ feature gate. \n This field is immutable. It
+ can only be set for containers."
+ items:
+ description: ResourceClaim references one entry
+ in PodSpec.ResourceClaims.
+ properties:
+ name:
+ description: Name must match the name of
+ one entry in pod.spec.resourceClaims of
+ the Pod where this field is used. It makes
+ that resource available inside a container.
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Limits describes the maximum amount
+ of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Requests describes the minimum amount
+ of compute resources required. If Requests is
+ omitted for a container, it defaults to Limits
+ if that is explicitly specified, otherwise to
+ an implementation-defined value. Requests cannot
+ exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ type: object
+ x-kubernetes-preserve-unknown-fields: true
+ storageClassName:
+ description: 'The name of the StorageClass required
+ by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.'
+ type: string
+ volumeMode:
+ description: Defines what type of volume is required
+ by the claim.
+ type: string
+ type: object
+ required:
+ - name
type: object
type: array
- x-kubernetes-preserve-unknown-fields: true
- updateStrategy:
- description: Defines the update strategy for the component.
- Not supported.
- enum:
- - Serial
- - BestEffortParallel
- - Parallel
- type: string
- userResourceRefs:
- description: Defines the user-defined volumes.
- properties:
- configMapRefs:
- description: ConfigMapRefs defines the user-defined config
- maps.
- items:
- description: ConfigMapRef defines a reference to a ConfigMap.
+ required:
+ - replicas
+ type: object
+ maxItems: 128
+ minItems: 1
+ type: array
+ x-kubernetes-validations:
+ - message: duplicated component
+ rule: self.all(x, size(self.filter(c, c.name == x.name)) == 1)
+ - message: two kinds of definition API can not be used simultaneously
+ rule: self.all(x, size(self.filter(c, has(c.componentDef))) == 0)
+ || self.all(x, size(self.filter(c, has(c.componentDef))) == size(self))
+ monitor:
+ description: The configuration of monitor.
+ properties:
+ monitoringInterval:
+ anyOf:
+ - type: integer
+ - type: string
+ description: Defines the frequency at which monitoring occurs.
+ If set to 0, monitoring is disabled.
+ x-kubernetes-int-or-string: true
+ type: object
+ network:
+ description: The configuration of network.
+ properties:
+ hostNetworkAccessible:
+ default: false
+ description: Indicates whether the host network can be accessed.
+ By default, this is set to false.
+ type: boolean
+ publiclyAccessible:
+ default: false
+ description: Indicates whether the network is accessible to the
+ public. By default, this is set to false.
+ type: boolean
+ type: object
+ replicas:
+ description: Specifies the replicas of the first componentSpec, if
+ the replicas of the first componentSpec is specified, this value
+ will be ignored.
+ format: int32
+ type: integer
+ resources:
+ description: Specifies the resources of the first componentSpec, if
+ the resources of the first componentSpec is specified, this value
+ will be ignored.
+ properties:
+ cpu:
+ anyOf:
+ - type: integer
+ - type: string
+ description: 'Specifies the amount of processing power the cluster
+ needs. For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ memory:
+ anyOf:
+ - type: integer
+ - type: string
+ description: 'Specifies the amount of memory the cluster needs.
+ For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the cluster.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for
+ the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling term matches
+ all objects with implicit weight 0 (i.e. it's a no-op).
+ A null preferred scheduling term matches no objects
+ (i.e. is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated with
+ the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching the
+ corresponding nodeSelectorTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
properties:
- asVolumeFrom:
- description: AsVolumeFrom lists the names of containers
- in which the volume should be mounted.
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms.
+ The terms are ORed.
items:
- type: string
+ description: 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.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
type: array
- x-kubernetes-list-type: set
- configMap:
- description: ConfigMap specifies the ConfigMap to
- be mounted as a volume.
- properties:
- defaultMode:
- description: 'defaultMode is optional: mode bits
- used to set permissions on created files by
- default. Must be an octal value between 0000
- and 0777 or a decimal value between 0 and 511.
- YAML accepts both octal and decimal values,
- JSON requires decimal values for mode bits.
- Defaults to 0644. Directories within the path
- are not affected by this setting. This might
- be in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- items:
- description: items if unspecified, each key-value
- pair in the Data field of the referenced ConfigMap
- will be projected into the volume as a file
- whose name is the key and content is the value.
- If specified, the listed keys will be projected
- into the specified paths, and unlisted keys
- will not be present. If a key is specified which
- is not present in the ConfigMap, the volume
- setup will error unless it is marked optional.
- Paths must be relative and may not contain the
- '..' path or start with '..'.
- items:
- description: Maps a string key to a path within
- a volume.
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g.
+ co-locate this pod in the same node, zone, etc. as some
+ other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
properties:
- key:
- description: key is the key to project.
- type: string
- mode:
- description: 'mode is Optional: mode bits
- used to set permissions on this file.
- Must be an octal value between 0000 and
- 0777 or a decimal value between 0 and
- 511. YAML accepts both octal and decimal
- values, JSON requires decimal values for
- mode bits. If not specified, the volume
- defaultMode will be used. This might be
- in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- path:
- description: path is the relative path of
- the file to map the key to. May not be
- an absolute path. May not contain the
- path element '..'. May not start with
- the string '..'.
- type: string
- required:
- - key
- - path
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
type: object
- type: array
- name:
- description: 'Name of the referent. More info:
- https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
- TODO: Add other useful fields. apiVersion, kind,
- uid?'
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
type: string
- optional:
- description: optional specify whether the ConfigMap
- or its keys must be defined
- type: boolean
- type: object
- x-kubernetes-map-type: atomic
- mountPoint:
- description: MountPoint is the filesystem path where
- the volume will be mounted.
- maxLength: 256
- pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
- type: string
- name:
- description: Name is the name of the referenced ConfigMap
- or Secret object. It must conform to DNS label standards.
- maxLength: 63
- pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
- type: string
- subPath:
- description: SubPath specifies a path within the volume
- from which to mount.
- type: string
- required:
- - configMap
- - mountPoint
- - name
- type: object
- type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- secretRefs:
- description: SecretRefs defines the user-defined secrets.
- items:
- description: SecretRef defines a reference to a Secret.
- properties:
- asVolumeFrom:
- description: AsVolumeFrom lists the names of containers
- in which the volume should be mounted.
- items:
+ type: array
+ topologyKey:
+ description: 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.
type: string
- type: array
- x-kubernetes-list-type: set
- mountPoint:
- description: MountPoint is the filesystem path where
- the volume will be mounted.
- maxLength: 256
- pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
- type: string
- name:
- description: Name is the name of the referenced ConfigMap
- or Secret object. It must conform to DNS label standards.
- maxLength: 63
- pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
- type: string
- secret:
- description: Secret specifies the secret to be mounted
- as a volume.
- properties:
- defaultMode:
- description: 'defaultMode is Optional: mode bits
- used to set permissions on created files by
- default. Must be an octal value between 0000
- and 0777 or a decimal value between 0 and 511.
- YAML accepts both octal and decimal values,
- JSON requires decimal values for mode bits.
- Defaults to 0644. Directories within the path
- are not affected by this setting. This might
- be in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- items:
- description: items If unspecified, each key-value
- pair in the Data field of the referenced Secret
- will be projected into the volume as a file
- whose name is the key and content is the value.
- If specified, the listed keys will be projected
- into the specified paths, and unlisted keys
- will not be present. If a key is specified which
- is not present in the Secret, the volume setup
- will error unless it is marked optional. Paths
- must be relative and may not contain the '..'
- path or start with '..'.
- items:
- description: Maps a string key to a path within
- a volume.
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules
+ (e.g. avoid putting this pod in the same node, zone, etc.
+ as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods
+ to nodes that satisfy the anti-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
+ anti-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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
properties:
- key:
- description: key is the key to project.
- type: string
- mode:
- description: 'mode is Optional: mode bits
- used to set permissions on this file.
- Must be an octal value between 0000 and
- 0777 or a decimal value between 0 and
- 511. YAML accepts both octal and decimal
- values, JSON requires decimal values for
- mode bits. If not specified, the volume
- defaultMode will be used. This might be
- in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- path:
- description: path is the relative path of
- the file to map the key to. May not be
- an absolute path. May not contain the
- path element '..'. May not start with
- the string '..'.
- type: string
- required:
- - key
- - path
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
type: object
- type: array
- optional:
- description: optional field specify whether the
- Secret or its keys must be defined
- type: boolean
- secretName:
- description: 'secretName is the name of the secret
- in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified
+ by this field are not met at scheduling time, the pod
+ will not be scheduled onto the node. If the anti-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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
type: string
- type: object
- subPath:
- description: SubPath specifies a path within the volume
- from which to mount.
- type: string
- required:
- - mountPoint
- - name
- - secret
- type: object
- type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- type: object
- volumeClaimTemplates:
- description: Provides information for statefulset.spec.volumeClaimTemplates.
- items:
- properties:
- name:
- description: Refers to `clusterDefinition.spec.componentDefs.containers.volumeMounts.name`.
- type: string
- spec:
- description: Defines the desired characteristics of a
- volume requested by a pod author.
- properties:
- accessModes:
- description: 'Contains the desired access modes the
- volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.'
- items:
+ type: array
+ topologyKey:
+ description: 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.
type: string
- type: array
- x-kubernetes-preserve-unknown-fields: true
- resources:
- description: 'Represents the minimum resources the
- volume should have. If the RecoverVolumeExpansionFailure
- feature is enabled, users are allowed to specify
- resource requirements that are lower than the previous
- value but must still be higher than the capacity
- recorded in the status field of the claim. More
- info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.'
- properties:
- claims:
- description: "Claims lists the names of resources,
- defined in spec.resourceClaims, that are used
- by this container. \n This is an alpha field
- and requires enabling the DynamicResourceAllocation
- feature gate. \n This field is immutable. It
- can only be set for containers."
- items:
- description: ResourceClaim references one entry
- in PodSpec.ResourceClaims.
- properties:
- name:
- description: Name must match the name of
- one entry in pod.spec.resourceClaims of
- the Pod where this field is used. It makes
- that resource available inside a container.
- type: string
- required:
- - name
- type: object
- type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- limits:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Limits describes the maximum amount
- of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- requests:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Requests describes the minimum amount
- of compute resources required. If Requests is
- omitted for a container, it defaults to Limits
- if that is explicitly specified, otherwise to
- an implementation-defined value. Requests cannot
- exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this pod onto a
+ specific node. If it is non-empty, the scheduler simply schedules
+ this pod onto that node, assuming that it fits resource requirements.
+ type: string
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must be true for
+ the pod to fit on a node. Selector which must match a node''s
+ labels for the pod to be scheduled on that node. More info:
+ https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
+ type: object
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched by specified
+ scheduler. If not specified, the pod will be dispatched by default
+ scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches the triple
+ `key,value,effect` using the matching operator `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple using
+ the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to match.
+ Empty means match all taint effects. When specified, allowed
+ values are NoSchedule, PreferNoSchedule and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration applies
+ to. Empty means match all taint keys. If the key is empty,
+ operator must be Exists; this combination means to match
+ all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship to
+ the value. Valid operators are Exists and Equal. Defaults
+ to Equal. Exists is equivalent to wildcard for value,
+ so that a pod can tolerate all taints of a particular
+ category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period of
+ time the toleration (which must be of effect NoExecute,
+ otherwise this field is ignored) tolerates the taint.
+ By default, it is not set, which means tolerate the taint
+ forever (do not evict). Zero and negative values will
+ be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration matches
+ to. If the operator is Exists, the value should be empty,
+ otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how a group of
+ pods ought to spread across topology domains. Scheduler will
+ schedule pods in a way which abides by the constraints. All
+ topologySpreadConstraints are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how to spread
+ matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching pods.
+ Pods that match this label selector are counted to determine
+ the number of pods in their corresponding topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector
+ requirements. The requirements are ANDed.
+ items:
+ description: A label selector requirement is a selector
+ that contains values, a key, and an operator that
+ relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship
+ to a set of values. Valid operators are In,
+ NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values.
+ If the operator is In or NotIn, the values array
+ must be non-empty. If the operator is Exists
+ or DoesNotExist, the values array must be empty.
+ This array is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
type: object
- x-kubernetes-preserve-unknown-fields: true
- storageClassName:
- description: 'The name of the StorageClass required
- by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.'
- type: string
- volumeMode:
- description: Defines what type of volume is required
- by the claim.
+ type: array
+ matchLabels:
+ additionalProperties:
type: string
- type: object
- required:
- - name
- type: object
- type: array
- required:
- - replicas
- type: object
- maxItems: 128
- minItems: 1
- type: array
- x-kubernetes-validations:
- - message: duplicated component
- rule: self.all(x, size(self.filter(c, c.name == x.name)) == 1)
- - message: two kinds of definition API can not be used simultaneously
- rule: self.all(x, size(self.filter(c, has(c.componentDef))) == 0)
- || self.all(x, size(self.filter(c, has(c.componentDef))) == size(self))
- monitor:
- description: The configuration of monitor.
- properties:
- monitoringInterval:
- anyOf:
- - type: integer
- - type: string
- description: Defines the frequency at which monitoring occurs.
- If set to 0, monitoring is disabled.
- x-kubernetes-int-or-string: true
- type: object
- network:
- description: The configuration of network.
- properties:
- hostNetworkAccessible:
- default: false
- description: Indicates whether the host network can be accessed.
- By default, this is set to false.
- type: boolean
- publiclyAccessible:
- default: false
- description: Indicates whether the network is accessible to the
- public. By default, this is set to false.
- type: boolean
- type: object
- replicas:
- description: Specifies the replicas of the first componentSpec, if
- the replicas of the first componentSpec is specified, this value
- will be ignored.
- format: int32
- type: integer
- resources:
- description: Specifies the resources of the first componentSpec, if
- the resources of the first componentSpec is specified, this value
- will be ignored.
- properties:
- cpu:
- anyOf:
- - type: integer
- - type: string
- description: 'Specifies the amount of processing power the cluster
- needs. For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- memory:
- anyOf:
- - type: integer
- - type: string
- description: 'Specifies the amount of memory the cluster needs.
- For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label keys
+ to select the pods over which spreading will be calculated.
+ The keys are used to lookup values from the incoming pod
+ labels, those key-value labels are ANDed with labelSelector
+ to select the group of existing pods over which spreading
+ will be calculated for the incoming pod. The same key
+ is forbidden to exist in both MatchLabelKeys and LabelSelector.
+ MatchLabelKeys cannot be set when LabelSelector isn't
+ set. Keys that don't exist in the incoming pod labels
+ will be ignored. A null or empty list means only match
+ against labelSelector. \n This is a beta field and requires
+ the MatchLabelKeysInPodTopologySpread feature gate to
+ be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to which pods
+ may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`,
+ it is the maximum permitted difference between the number
+ of matching pods in the target topology and the global
+ minimum. The global minimum is the minimum number of matching
+ pods in an eligible domain or zero if the number of eligible
+ domains is less than 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 this case, the global minimum is 1.
+ | zone1 | zone2 | zone3 | | P P | P P | P | -
+ if MaxSkew is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming pod can be scheduled
+ onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies that
+ satisfy it. It''s a required field. Default value is 1
+ and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number of eligible
+ domains. When the number of eligible domains with matching
+ topology keys is less than minDomains, Pod Topology Spread
+ treats \"global minimum\" as 0, and then the calculation
+ of Skew is performed. And when the number of eligible
+ domains with matching topology keys equals or greater
+ than minDomains, this value has no effect on scheduling.
+ As a result, when the number of eligible domains is less
+ than minDomains, scheduler won't schedule more than maxSkew
+ Pods to those domains. If value is nil, the constraint
+ behaves as if MinDomains is equal to 1. Valid values are
+ integers greater than 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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
+ 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 scheduled to any of the three zones,
+ it will violate MaxSkew. \n This is a beta field and requires
+ the MinDomainsInPodTopologySpread feature gate to be enabled
+ (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how we will treat
+ Pod's nodeAffinity/nodeSelector when calculating pod topology
+ spread skew. Options are: - Honor: only nodes matching
+ nodeAffinity/nodeSelector are included in the calculations.
+ - Ignore: nodeAffinity/nodeSelector are ignored. All nodes
+ are included in the calculations. \n If this value is
+ nil, the behavior is equivalent to the Honor policy. This
+ is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we will treat
+ node taints when calculating pod topology spread skew.
+ Options are: - Honor: nodes without taints, along with
+ tainted nodes for which the incoming pod has a toleration,
+ are included. - Ignore: node taints are ignored. All nodes
+ are included. \n If this value is nil, the behavior is
+ equivalent to the Ignore policy. This is a beta-level
+ feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology. We consider each
+ as a "bucket", and try to put balanced number
+ of pods into each bucket. We define a domain as a particular
+ instance of a topology. Also, we define an eligible domain
+ as a domain whose nodes meet the requirements of nodeAffinityPolicy
+ and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And, if TopologyKey
+ is "topology.kubernetes.io/zone", each zone is a domain
+ of that topology. It's a required field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how to deal with
+ a pod if it doesn''t satisfy the spread constraint. -
+ DoNotSchedule (default) tells the scheduler not to schedule
+ it. - ScheduleAnyway tells the scheduler to schedule the
+ pod in any location, but giving higher precedence to topologies
+ that would help reduce the skew. A constraint is considered
+ "Unsatisfiable" for an incoming pod if and only if every
+ possible node assignment for that pod would violate "MaxSkew"
+ on some topology. For example, in a 3-zone cluster, MaxSkew
+ is set to 1, 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, 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, the cluster can still be imbalanced, but
+ scheduler won''t make it *more* imbalanced. It''s a required
+ field.'
+ type: string
+ required:
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
+ type: object
+ type: array
type: object
services:
description: Defines the services to access a cluster.
@@ -6538,12 +8844,160 @@ spec:
description: 'user is the rados user name.
Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it'
type: string
- required:
- - image
- - monitors
+ required:
+ - image
+ - monitors
+ type: object
+ scaleIO:
+ description: scaleIO represents a ScaleIO persistent
+ volume attached and mounted on Kubernetes
+ nodes.
+ properties:
+ fsType:
+ description: fsType is the filesystem type
+ to mount. Must be a filesystem type supported
+ by the host operating system. Ex. "ext4",
+ "xfs", "ntfs". Default is "xfs".
+ type: string
+ gateway:
+ description: gateway is the host address
+ of the ScaleIO API Gateway.
+ type: string
+ protectionDomain:
+ description: protectionDomain is the name
+ of the ScaleIO Protection Domain for the
+ configured storage.
+ type: string
+ readOnly:
+ description: readOnly Defaults to false
+ (read/write). ReadOnly here will force
+ the ReadOnly setting in VolumeMounts.
+ type: boolean
+ secretRef:
+ description: secretRef references to the
+ secret for ScaleIO user and other sensitive
+ information. If this is not provided,
+ Login operation will fail.
+ properties:
+ name:
+ description: 'Name of the referent.
+ More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+ TODO: Add other useful fields. apiVersion,
+ kind, uid?'
+ type: string
+ type: object
+ x-kubernetes-map-type: atomic
+ sslEnabled:
+ description: sslEnabled Flag enable/disable
+ SSL communication with Gateway, default
+ false
+ type: boolean
+ storageMode:
+ description: storageMode indicates whether
+ the storage for a volume should be ThickProvisioned
+ or ThinProvisioned. Default is ThinProvisioned.
+ type: string
+ storagePool:
+ description: storagePool is the ScaleIO
+ Storage Pool associated with the protection
+ domain.
+ type: string
+ system:
+ description: system is the name of the storage
+ system as configured in ScaleIO.
+ type: string
+ volumeName:
+ description: volumeName is the name of a
+ volume already created in the ScaleIO
+ system that is associated with this volume
+ source.
+ type: string
+ required:
+ - gateway
+ - secretRef
+ - system
+ type: object
+ secret:
+ description: 'secret represents a secret that
+ should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ properties:
+ defaultMode:
+ description: 'defaultMode is Optional: mode
+ bits used to set permissions on created
+ files by default. Must be an octal value
+ between 0000 and 0777 or a decimal value
+ between 0 and 511. YAML accepts both octal
+ and decimal values, JSON requires decimal
+ values for mode bits. Defaults to 0644.
+ Directories within the path are not affected
+ by this setting. This might be in conflict
+ with other options that affect the file
+ mode, like fsGroup, and the result can
+ be other mode bits set.'
+ format: int32
+ type: integer
+ items:
+ description: items If unspecified, each
+ key-value pair in the Data field of the
+ referenced Secret will be projected into
+ the volume as a file whose name is the
+ key and content is the value. If specified,
+ the listed keys will be projected into
+ the specified paths, and unlisted keys
+ will not be present. If a key is specified
+ which is not present in the Secret, the
+ volume setup will error unless it is marked
+ optional. Paths must be relative and may
+ not contain the '..' path or start with
+ '..'.
+ items:
+ description: Maps a string key to a path
+ within a volume.
+ properties:
+ key:
+ description: key is the key to project.
+ type: string
+ mode:
+ description: 'mode is Optional: mode
+ bits used to set permissions on
+ this file. Must be an octal value
+ between 0000 and 0777 or a decimal
+ value between 0 and 511. YAML accepts
+ both octal and decimal values, JSON
+ requires decimal values for mode
+ bits. If not specified, the volume
+ defaultMode will be used. This might
+ be in conflict with other options
+ that affect the file mode, like
+ fsGroup, and the result can be other
+ mode bits set.'
+ format: int32
+ type: integer
+ path:
+ description: path is the relative
+ path of the file to map the key
+ to. May not be an absolute path.
+ May not contain the path element
+ '..'. May not start with the string
+ '..'.
+ type: string
+ required:
+ - key
+ - path
+ type: object
+ type: array
+ optional:
+ description: optional field specify whether
+ the Secret or its keys must be defined
+ type: boolean
+ secretName:
+ description: 'secretName is the name of
+ the secret in the pod''s namespace to
+ use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ type: string
type: object
- scaleIO:
- description: scaleIO represents a ScaleIO persistent
+ storageos:
+ description: storageOS represents a StorageOS
volume attached and mounted on Kubernetes
nodes.
properties:
@@ -6551,27 +9005,19 @@ spec:
description: fsType is the filesystem type
to mount. Must be a filesystem type supported
by the host operating system. Ex. "ext4",
- "xfs", "ntfs". Default is "xfs".
- type: string
- gateway:
- description: gateway is the host address
- of the ScaleIO API Gateway.
- type: string
- protectionDomain:
- description: protectionDomain is the name
- of the ScaleIO Protection Domain for the
- configured storage.
+ "xfs", "ntfs". Implicitly inferred to
+ be "ext4" if unspecified.
type: string
readOnly:
- description: readOnly Defaults to false
+ description: readOnly defaults to false
(read/write). ReadOnly here will force
the ReadOnly setting in VolumeMounts.
type: boolean
secretRef:
- description: secretRef references to the
- secret for ScaleIO user and other sensitive
- information. If this is not provided,
- Login operation will fail.
+ description: secretRef specifies the secret
+ to use for obtaining the StorageOS API
+ credentials. If not specified, default
+ values will be attempted.
properties:
name:
description: 'Name of the referent.
@@ -6581,320 +9027,1447 @@ spec:
type: string
type: object
x-kubernetes-map-type: atomic
- sslEnabled:
- description: sslEnabled Flag enable/disable
- SSL communication with Gateway, default
- false
- type: boolean
- storageMode:
- description: storageMode indicates whether
- the storage for a volume should be ThickProvisioned
- or ThinProvisioned. Default is ThinProvisioned.
+ volumeName:
+ description: volumeName is the human-readable
+ name of the StorageOS volume. Volume
+ names are only unique within a namespace.
type: string
- storagePool:
- description: storagePool is the ScaleIO
- Storage Pool associated with the protection
- domain.
+ volumeNamespace:
+ description: volumeNamespace specifies the
+ scope of the volume within StorageOS. If
+ no namespace is specified then the Pod's
+ namespace will be used. This allows the
+ Kubernetes name scoping to be mirrored
+ within StorageOS for tighter integration.
+ Set VolumeName to any name to override
+ the default behaviour. Set to "default"
+ if you are not using namespaces within
+ StorageOS. Namespaces that do not pre-exist
+ within StorageOS will be created.
type: string
- system:
- description: system is the name of the storage
- system as configured in ScaleIO.
+ type: object
+ vsphereVolume:
+ description: vsphereVolume represents a vSphere
+ volume attached and mounted on kubelets host
+ machine
+ properties:
+ fsType:
+ description: fsType is filesystem type to
+ mount. Must be a filesystem type supported
+ by the host operating system. Ex. "ext4",
+ "xfs", "ntfs". Implicitly inferred to
+ be "ext4" if unspecified.
type: string
- volumeName:
- description: volumeName is the name of a
- volume already created in the ScaleIO
- system that is associated with this volume
- source.
+ storagePolicyID:
+ description: storagePolicyID is the storage
+ Policy Based Management (SPBM) profile
+ ID associated with the StoragePolicyName.
+ type: string
+ storagePolicyName:
+ description: storagePolicyName is the storage
+ Policy Based Management (SPBM) profile
+ name.
+ type: string
+ volumePath:
+ description: volumePath is the path that
+ identifies vSphere volume vmdk
type: string
required:
- - gateway
- - secretRef
- - system
+ - volumePath
type: object
- secret:
- description: 'secret represents a secret that
- should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ required:
+ - name
+ type: object
+ type: array
+ required:
+ - name
+ type: object
+ type: array
+ issuer:
+ description: Defines provider context for TLS certs. Required
+ when TLS is enabled.
+ properties:
+ name:
+ allOf:
+ - enum:
+ - KubeBlocks
+ - UserProvided
+ - enum:
+ - KubeBlocks
+ - UserProvided
+ default: KubeBlocks
+ description: The issuer for TLS certificates.
+ type: string
+ secretRef:
+ description: SecretRef is the reference to the TLS certificates
+ secret. It is required when the issuer is set to UserProvided.
+ properties:
+ ca:
+ description: CA cert key in Secret
+ type: string
+ cert:
+ description: Cert key in Secret
+ type: string
+ key:
+ description: Key of TLS private key in Secret
+ type: string
+ name:
+ description: Name of the Secret
+ type: string
+ required:
+ - ca
+ - cert
+ - key
+ - name
+ type: object
+ required:
+ - name
+ type: object
+ monitor:
+ default: false
+ description: To enable monitoring.
+ type: boolean
+ name:
+ description: "Specifies the name of the cluster's component.
+ This name is also part of the Service DNS name and must
+ comply with the IANA Service Naming rule. When ClusterComponentSpec
+ is referenced as a template, the name is optional. Otherwise,
+ it is required. \n TODO +kubebuilder:validation:XValidation:rule=\"self
+ == oldSelf\",message=\"name is immutable\""
+ maxLength: 22
+ pattern: ^[a-z]([a-z0-9\-]*[a-z0-9])?$
+ type: string
+ offlineInstances:
+ description: Specifies instances to be scaled in with dedicated
+ names in the list.
+ items:
+ type: string
+ type: array
+ replicas:
+ default: 1
+ description: Specifies the number of component replicas.
+ format: int32
+ minimum: 0
+ type: integer
+ resources:
+ description: Specifies the resources requests and limits
+ of the workload.
+ properties:
+ claims:
+ description: "Claims lists the names of resources, defined
+ in spec.resourceClaims, that are used by this container.
+ \n This is an alpha field and requires enabling the
+ DynamicResourceAllocation feature gate. \n This field
+ is immutable. It can only be set for containers."
+ items:
+ description: ResourceClaim references one entry in
+ PodSpec.ResourceClaims.
+ properties:
+ name:
+ description: Name must match the name of one entry
+ in pod.spec.resourceClaims of the Pod where
+ this field is used. It makes that resource available
+ inside a container.
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Limits describes the maximum amount of
+ compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Requests describes the minimum amount
+ of compute resources required. If Requests is omitted
+ for a container, it defaults to Limits if that is
+ explicitly specified, otherwise to an implementation-defined
+ value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ type: object
+ x-kubernetes-preserve-unknown-fields: true
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the component.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling
+ constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling
+ rules for the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling
+ term matches all objects with implicit weight
+ 0 (i.e. it's a no-op). A null preferred
+ scheduling term matches no objects (i.e.
+ is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated
+ with the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector
+ requirements by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector
+ requirements by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching
+ the corresponding nodeSelectorTerm,
+ in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
properties:
- defaultMode:
- description: 'defaultMode is Optional: mode
- bits used to set permissions on created
- files by default. Must be an octal value
- between 0000 and 0777 or a decimal value
- between 0 and 511. YAML accepts both octal
- and decimal values, JSON requires decimal
- values for mode bits. Defaults to 0644.
- Directories within the path are not affected
- by this setting. This might be in conflict
- with other options that affect the file
- mode, like fsGroup, and the result can
- be other mode bits set.'
- format: int32
- type: integer
- items:
- description: items If unspecified, each
- key-value pair in the Data field of the
- referenced Secret will be projected into
- the volume as a file whose name is the
- key and content is the value. If specified,
- the listed keys will be projected into
- the specified paths, and unlisted keys
- will not be present. If a key is specified
- which is not present in the Secret, the
- volume setup will error unless it is marked
- optional. Paths must be relative and may
- not contain the '..' path or start with
- '..'.
+ nodeSelectorTerms:
+ description: Required. A list of node selector
+ terms. The terms are ORed.
items:
- description: Maps a string key to a path
- within a volume.
+ description: 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.
properties:
- key:
- description: key is the key to project.
+ matchExpressions:
+ description: A list of node selector
+ requirements by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector
+ requirements by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules
+ (e.g. co-locate this pod in the same node, zone,
+ etc. as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added
+ per-node to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity
+ term, associated with the corresponding
+ weight.
+ properties:
+ labelSelector:
+ description: A label query over a
+ set of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the
+ set of namespaces that the term
+ applies to. The term is applied
+ to the union of the namespaces selected
+ by this field and the ones listed
+ in the namespaces field. null selector
+ and null or empty namespaces list
+ means "this pod's namespace". An
+ empty selector ({}) matches all
+ namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies
+ a static list of namespace names
+ that the term applies to. The term
+ is applied to the union of the namespaces
+ listed in this field and the ones
+ selected by namespaceSelector. null
+ or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
type: string
- mode:
- description: 'mode is Optional: mode
- bits used to set permissions on
- this file. Must be an octal value
- between 0000 and 0777 or a decimal
- value between 0 and 511. YAML accepts
- both octal and decimal values, JSON
- requires decimal values for mode
- bits. If not specified, the volume
- defaultMode will be used. This might
- be in conflict with other options
- that affect the file mode, like
- fsGroup, and the result can be other
- mode bits set.'
- format: int32
- type: integer
- path:
- description: path is the relative
- path of the file to map the key
- to. May not be an absolute path.
- May not contain the path element
- '..'. May not start with the string
- '..'.
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in
+ the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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 matches
+ that of any node on which a pod of the set
+ of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling
+ rules (e.g. avoid putting this pod in the same
+ node, zone, etc. as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule
+ pods to nodes that satisfy the anti-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 anti-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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added
+ per-node to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity
+ term, associated with the corresponding
+ weight.
+ properties:
+ labelSelector:
+ description: A label query over a
+ set of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the
+ set of namespaces that the term
+ applies to. The term is applied
+ to the union of the namespaces selected
+ by this field and the ones listed
+ in the namespaces field. null selector
+ and null or empty namespaces list
+ means "this pod's namespace". An
+ empty selector ({}) matches all
+ namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies
+ a static list of namespace names
+ that the term applies to. The term
+ is applied to the union of the namespaces
+ listed in this field and the ones
+ selected by namespaceSelector. null
+ or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
type: string
required:
- - key
- - path
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in
+ the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements
+ specified by this field are not met at scheduling
+ time, the pod will not be scheduled onto the
+ node. If the anti-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.
+ items:
+ description: 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 matches
+ that of any node on which a pod of the set
+ of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
type: object
- type: array
- optional:
- description: optional field specify whether
- the Secret or its keys must be defined
- type: boolean
- secretName:
- description: 'secretName is the name of
- the secret in the pod''s namespace to
- use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
- type: string
- type: object
- storageos:
- description: storageOS represents a StorageOS
- volume attached and mounted on Kubernetes
- nodes.
- properties:
- fsType:
- description: fsType is the filesystem type
- to mount. Must be a filesystem type supported
- by the host operating system. Ex. "ext4",
- "xfs", "ntfs". Implicitly inferred to
- be "ext4" if unspecified.
- type: string
- readOnly:
- description: readOnly defaults to false
- (read/write). ReadOnly here will force
- the ReadOnly setting in VolumeMounts.
- type: boolean
- secretRef:
- description: secretRef specifies the secret
- to use for obtaining the StorageOS API
- credentials. If not specified, default
- values will be attempted.
- properties:
- name:
- description: 'Name of the referent.
- More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
- TODO: Add other useful fields. apiVersion,
- kind, uid?'
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
type: string
- type: object
- x-kubernetes-map-type: atomic
- volumeName:
- description: volumeName is the human-readable
- name of the StorageOS volume. Volume
- names are only unique within a namespace.
- type: string
- volumeNamespace:
- description: volumeNamespace specifies the
- scope of the volume within StorageOS. If
- no namespace is specified then the Pod's
- namespace will be used. This allows the
- Kubernetes name scoping to be mirrored
- within StorageOS for tighter integration.
- Set VolumeName to any name to override
- the default behaviour. Set to "default"
- if you are not using namespaces within
- StorageOS. Namespaces that do not pre-exist
- within StorageOS will be created.
- type: string
- type: object
- vsphereVolume:
- description: vsphereVolume represents a vSphere
- volume attached and mounted on kubelets host
- machine
- properties:
- fsType:
- description: fsType is filesystem type to
- mount. Must be a filesystem type supported
- by the host operating system. Ex. "ext4",
- "xfs", "ntfs". Implicitly inferred to
- be "ext4" if unspecified.
- type: string
- storagePolicyID:
- description: storagePolicyID is the storage
- Policy Based Management (SPBM) profile
- ID associated with the StoragePolicyName.
- type: string
- storagePolicyName:
- description: storagePolicyName is the storage
- Policy Based Management (SPBM) profile
- name.
- type: string
- volumePath:
- description: volumePath is the path that
- identifies vSphere volume vmdk
- type: string
- required:
- - volumePath
- type: object
- required:
- - name
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
type: object
- type: array
- required:
- - name
- type: object
- type: array
- issuer:
- description: Defines provider context for TLS certs. Required
- when TLS is enabled.
- properties:
- name:
- allOf:
- - enum:
- - KubeBlocks
- - UserProvided
- - enum:
- - KubeBlocks
- - UserProvided
- default: KubeBlocks
- description: The issuer for TLS certificates.
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this
+ pod onto a specific node. If it is non-empty, the
+ scheduler simply schedules this pod onto that node,
+ assuming that it fits resource requirements.
type: string
- secretRef:
- description: SecretRef is the reference to the TLS certificates
- secret. It is required when the issuer is set to UserProvided.
- properties:
- ca:
- description: CA cert key in Secret
- type: string
- cert:
- description: Cert key in Secret
- type: string
- key:
- description: Key of TLS private key in Secret
- type: string
- name:
- description: Name of the Secret
- type: string
- required:
- - ca
- - cert
- - key
- - name
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must
+ be true for the pod to fit on a node. Selector which
+ must match a node''s labels for the pod to be scheduled
+ on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
type: object
- required:
- - name
- type: object
- monitor:
- default: false
- description: To enable monitoring.
- type: boolean
- name:
- description: "Specifies the name of the cluster's component.
- This name is also part of the Service DNS name and must
- comply with the IANA Service Naming rule. When ClusterComponentSpec
- is referenced as a template, the name is optional. Otherwise,
- it is required. \n TODO +kubebuilder:validation:XValidation:rule=\"self
- == oldSelf\",message=\"name is immutable\""
- maxLength: 22
- pattern: ^[a-z]([a-z0-9\-]*[a-z0-9])?$
- type: string
- offlineInstances:
- description: Specifies instances to be scaled in with dedicated
- names in the list.
- items:
- type: string
- type: array
- replicas:
- default: 1
- description: Specifies the number of component replicas.
- format: int32
- minimum: 0
- type: integer
- resources:
- description: Specifies the resources requests and limits
- of the workload.
- properties:
- claims:
- description: "Claims lists the names of resources, defined
- in spec.resourceClaims, that are used by this container.
- \n This is an alpha field and requires enabling the
- DynamicResourceAllocation feature gate. \n This field
- is immutable. It can only be set for containers."
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched
+ by specified scheduler. If not specified, the pod
+ will be dispatched by default scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches
+ the triple `key,value,effect` using the matching operator
+ `operator`.
items:
- description: ResourceClaim references one entry in
- PodSpec.ResourceClaims.
+ description: The pod this Toleration is attached to
+ tolerates any taint that matches the triple
+ using the matching operator .
properties:
- name:
- description: Name must match the name of one entry
- in pod.spec.resourceClaims of the Pod where
- this field is used. It makes that resource available
- inside a container.
+ effect:
+ description: Effect indicates the taint effect
+ to match. Empty means match all taint effects.
+ When specified, allowed values are NoSchedule,
+ PreferNoSchedule and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration
+ applies to. Empty means match all taint keys.
+ If the key is empty, operator must be Exists;
+ this combination means to match all values and
+ all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship
+ to the value. Valid operators are Exists and
+ Equal. Defaults to Equal. Exists is equivalent
+ to wildcard for value, so that a pod can tolerate
+ all taints of a particular category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the
+ period of time the toleration (which must be
+ of effect NoExecute, otherwise this field is
+ ignored) tolerates the taint. By default, it
+ is not set, which means tolerate the taint forever
+ (do not evict). Zero and negative values will
+ be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration
+ matches to. If the operator is Exists, the value
+ should be empty, otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how
+ a group of pods ought to spread across topology domains.
+ Scheduler will schedule pods in a way which abides
+ by the constraints. All topologySpreadConstraints
+ are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how
+ to spread matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching
+ pods. Pods that match this label selector are
+ counted to determine the number of pods in their
+ corresponding topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of
+ label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a
+ key, and an operator that relates the
+ key and values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label
+ keys to select the pods over which spreading
+ will be calculated. The keys are used to lookup
+ values from the incoming pod labels, those key-value
+ labels are ANDed with labelSelector to select
+ the group of existing pods over which spreading
+ will be calculated for the incoming pod. The
+ same key is forbidden to exist in both MatchLabelKeys
+ and LabelSelector. MatchLabelKeys cannot be
+ set when LabelSelector isn't set. Keys that
+ don't exist in the incoming pod labels will
+ be ignored. A null or empty list means only
+ match against labelSelector. \n This is a beta
+ field and requires the MatchLabelKeysInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to
+ which pods may be unevenly distributed. When
+ `whenUnsatisfiable=DoNotSchedule`, it is the
+ maximum permitted difference between the number
+ of matching pods in the target topology and
+ the global minimum. The global minimum is the
+ minimum number of matching pods in an eligible
+ domain or zero if the number of eligible domains
+ is less than 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 this
+ case, the global minimum is 1. | zone1 | zone2
+ | zone3 | | P P | P P | P | - if MaxSkew
+ is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming
+ pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies
+ that satisfy it. It''s a required field. Default
+ value is 1 and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number
+ of eligible domains. When the number of eligible
+ domains with matching topology keys is less
+ than minDomains, Pod Topology Spread treats
+ \"global minimum\" as 0, and then the calculation
+ of Skew is performed. And when the number of
+ eligible domains with matching topology keys
+ equals or greater than minDomains, this value
+ has no effect on scheduling. As a result, when
+ the number of eligible domains is less than
+ minDomains, scheduler won't schedule more than
+ maxSkew Pods to those domains. If value is nil,
+ the constraint behaves as if MinDomains is equal
+ to 1. Valid values are integers greater than
+ 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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 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 scheduled to any of the three zones,
+ it will violate MaxSkew. \n This is a beta field
+ and requires the MinDomainsInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how
+ we will treat Pod's nodeAffinity/nodeSelector
+ when calculating pod topology spread skew. Options
+ are: - Honor: only nodes matching nodeAffinity/nodeSelector
+ are included in the calculations. - Ignore:
+ nodeAffinity/nodeSelector are ignored. All nodes
+ are included in the calculations. \n If this
+ value is nil, the behavior is equivalent to
+ the Honor policy. This is a beta-level feature
+ default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we
+ will treat node taints when calculating pod
+ topology spread skew. Options are: - Honor:
+ nodes without taints, along with tainted nodes
+ for which the incoming pod has a toleration,
+ are included. - Ignore: node taints are ignored.
+ All nodes are included. \n If this value is
+ nil, the behavior is equivalent to the Ignore
+ policy. This is a beta-level feature default
+ enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology.
+ We consider each as a "bucket",
+ and try to put balanced number of pods into
+ each bucket. We define a domain as a particular
+ instance of a topology. Also, we define an eligible
+ domain as a domain whose nodes meet the requirements
+ of nodeAffinityPolicy and nodeTaintsPolicy.
+ e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And,
+ if TopologyKey is "topology.kubernetes.io/zone",
+ each zone is a domain of that topology. It's
+ a required field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how
+ to deal with a pod if it doesn''t satisfy the
+ spread constraint. - DoNotSchedule (default)
+ tells the scheduler not to schedule it. - ScheduleAnyway
+ tells the scheduler to schedule the pod in any
+ location, but giving higher precedence to topologies
+ that would help reduce the skew. A constraint
+ is considered "Unsatisfiable" for an incoming
+ pod if and only if every possible node assignment
+ for that pod would violate "MaxSkew" on some
+ topology. For example, in a 3-zone cluster,
+ MaxSkew is set to 1, 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, 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, the cluster can
+ still be imbalanced, but scheduler won''t make
+ it *more* imbalanced. It''s a required field.'
type: string
required:
- - name
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
type: object
type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- limits:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Limits describes the maximum amount of
- compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- requests:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Requests describes the minimum amount
- of compute resources required. If Requests is omitted
- for a container, it defaults to Limits if that is
- explicitly specified, otherwise to an implementation-defined
- value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
type: object
- x-kubernetes-preserve-unknown-fields: true
serviceAccountName:
description: Specifies the name of the ServiceAccount that
the running component depends on.
diff --git a/config/crd/bases/apps.kubeblocks.io_components.yaml b/config/crd/bases/apps.kubeblocks.io_components.yaml
index aa891e58560..8b78c9cd7ff 100644
--- a/config/crd/bases/apps.kubeblocks.io_components.yaml
+++ b/config/crd/bases/apps.kubeblocks.io_components.yaml
@@ -57,8 +57,8 @@ spec:
description: ComponentSpec defines the desired state of Component
properties:
affinity:
- description: Specifies the scheduling constraints for the component's
- workload. If specified, it will override the cluster-wide affinity.
+ description: Specifies the scheduling constraints for the component.
+ If specified, it will override the cluster-wide affinity.
properties:
nodeLabels:
additionalProperties:
@@ -2693,6 +2693,1121 @@ spec:
type: object
type: object
x-kubernetes-preserve-unknown-fields: true
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the component.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for
+ the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling term matches
+ all objects with implicit weight 0 (i.e. it's a no-op).
+ A null preferred scheduling term matches no objects
+ (i.e. is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated with
+ the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching the
+ corresponding nodeSelectorTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms.
+ The terms are ORed.
+ items:
+ description: 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.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g.
+ co-locate this pod in the same node, zone, etc. as some
+ other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules
+ (e.g. avoid putting this pod in the same node, zone, etc.
+ as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods
+ to nodes that satisfy the anti-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
+ anti-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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified
+ by this field are not met at scheduling time, the pod
+ will not be scheduled onto the node. If the anti-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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this pod onto a
+ specific node. If it is non-empty, the scheduler simply schedules
+ this pod onto that node, assuming that it fits resource requirements.
+ type: string
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must be true for
+ the pod to fit on a node. Selector which must match a node''s
+ labels for the pod to be scheduled on that node. More info:
+ https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
+ type: object
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched by specified
+ scheduler. If not specified, the pod will be dispatched by default
+ scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches the triple
+ `key,value,effect` using the matching operator `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple using
+ the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to match.
+ Empty means match all taint effects. When specified, allowed
+ values are NoSchedule, PreferNoSchedule and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration applies
+ to. Empty means match all taint keys. If the key is empty,
+ operator must be Exists; this combination means to match
+ all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship to
+ the value. Valid operators are Exists and Equal. Defaults
+ to Equal. Exists is equivalent to wildcard for value,
+ so that a pod can tolerate all taints of a particular
+ category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period of
+ time the toleration (which must be of effect NoExecute,
+ otherwise this field is ignored) tolerates the taint.
+ By default, it is not set, which means tolerate the taint
+ forever (do not evict). Zero and negative values will
+ be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration matches
+ to. If the operator is Exists, the value should be empty,
+ otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how a group of
+ pods ought to spread across topology domains. Scheduler will
+ schedule pods in a way which abides by the constraints. All
+ topologySpreadConstraints are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how to spread
+ matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching pods.
+ Pods that match this label selector are counted to determine
+ the number of pods in their corresponding topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector
+ requirements. The requirements are ANDed.
+ items:
+ description: A label selector requirement is a selector
+ that contains values, a key, and an operator that
+ relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship
+ to a set of values. Valid operators are In,
+ NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values.
+ If the operator is In or NotIn, the values array
+ must be non-empty. If the operator is Exists
+ or DoesNotExist, the values array must be empty.
+ This array is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label keys
+ to select the pods over which spreading will be calculated.
+ The keys are used to lookup values from the incoming pod
+ labels, those key-value labels are ANDed with labelSelector
+ to select the group of existing pods over which spreading
+ will be calculated for the incoming pod. The same key
+ is forbidden to exist in both MatchLabelKeys and LabelSelector.
+ MatchLabelKeys cannot be set when LabelSelector isn't
+ set. Keys that don't exist in the incoming pod labels
+ will be ignored. A null or empty list means only match
+ against labelSelector. \n This is a beta field and requires
+ the MatchLabelKeysInPodTopologySpread feature gate to
+ be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to which pods
+ may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`,
+ it is the maximum permitted difference between the number
+ of matching pods in the target topology and the global
+ minimum. The global minimum is the minimum number of matching
+ pods in an eligible domain or zero if the number of eligible
+ domains is less than 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 this case, the global minimum is 1.
+ | zone1 | zone2 | zone3 | | P P | P P | P | -
+ if MaxSkew is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming pod can be scheduled
+ onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies that
+ satisfy it. It''s a required field. Default value is 1
+ and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number of eligible
+ domains. When the number of eligible domains with matching
+ topology keys is less than minDomains, Pod Topology Spread
+ treats \"global minimum\" as 0, and then the calculation
+ of Skew is performed. And when the number of eligible
+ domains with matching topology keys equals or greater
+ than minDomains, this value has no effect on scheduling.
+ As a result, when the number of eligible domains is less
+ than minDomains, scheduler won't schedule more than maxSkew
+ Pods to those domains. If value is nil, the constraint
+ behaves as if MinDomains is equal to 1. Valid values are
+ integers greater than 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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
+ 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 scheduled to any of the three zones,
+ it will violate MaxSkew. \n This is a beta field and requires
+ the MinDomainsInPodTopologySpread feature gate to be enabled
+ (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how we will treat
+ Pod's nodeAffinity/nodeSelector when calculating pod topology
+ spread skew. Options are: - Honor: only nodes matching
+ nodeAffinity/nodeSelector are included in the calculations.
+ - Ignore: nodeAffinity/nodeSelector are ignored. All nodes
+ are included in the calculations. \n If this value is
+ nil, the behavior is equivalent to the Honor policy. This
+ is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we will treat
+ node taints when calculating pod topology spread skew.
+ Options are: - Honor: nodes without taints, along with
+ tainted nodes for which the incoming pod has a toleration,
+ are included. - Ignore: node taints are ignored. All nodes
+ are included. \n If this value is nil, the behavior is
+ equivalent to the Ignore policy. This is a beta-level
+ feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology. We consider each
+ as a "bucket", and try to put balanced number
+ of pods into each bucket. We define a domain as a particular
+ instance of a topology. Also, we define an eligible domain
+ as a domain whose nodes meet the requirements of nodeAffinityPolicy
+ and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And, if TopologyKey
+ is "topology.kubernetes.io/zone", each zone is a domain
+ of that topology. It's a required field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how to deal with
+ a pod if it doesn''t satisfy the spread constraint. -
+ DoNotSchedule (default) tells the scheduler not to schedule
+ it. - ScheduleAnyway tells the scheduler to schedule the
+ pod in any location, but giving higher precedence to topologies
+ that would help reduce the skew. A constraint is considered
+ "Unsatisfiable" for an incoming pod if and only if every
+ possible node assignment for that pod would violate "MaxSkew"
+ on some topology. For example, in a 3-zone cluster, MaxSkew
+ is set to 1, 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, 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, the cluster can still be imbalanced, but
+ scheduler won''t make it *more* imbalanced. It''s a required
+ field.'
+ type: string
+ required:
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
+ type: object
+ type: array
+ type: object
serviceAccountName:
description: The name of the ServiceAccount that running component
depends on.
diff --git a/controllers/apps/operations/datascript.go b/controllers/apps/operations/datascript.go
index e2e18ab1084..c7920951faa 100644
--- a/controllers/apps/operations/datascript.go
+++ b/controllers/apps/operations/datascript.go
@@ -36,7 +36,7 @@ import (
appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
"github.com/apecloud/kubeblocks/pkg/constant"
- componetutil "github.com/apecloud/kubeblocks/pkg/controller/component"
+ "github.com/apecloud/kubeblocks/pkg/controller/scheduling"
intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
"github.com/apecloud/kubeblocks/pkg/lorry/engines/register"
viper "github.com/apecloud/kubeblocks/pkg/viperx"
@@ -332,11 +332,11 @@ func buildDataScriptJobs(reqCtx intctrlutil.RequestCtx, cli client.Client, clust
// add labels
job.Labels = getDataScriptJobLabels(cluster.Name, component.Name, ops.Name)
// add tolerations
- tolerations, err := componetutil.BuildTolerations(cluster, component)
+ schedulingPolicy, err := scheduling.BuildSchedulingPolicy(cluster, component)
if err != nil {
return nil, intctrlutil.NewFatalError(err.Error())
}
- job.Spec.Template.Spec.Tolerations = tolerations
+ job.Spec.Template.Spec.Tolerations = schedulingPolicy.Tolerations
// add owner reference
scheme, _ := appsv1alpha1.SchemeBuilder.Build()
if err := controllerutil.SetOwnerReference(ops, job, scheme); err != nil {
diff --git a/controllers/apps/systemaccount_util.go b/controllers/apps/systemaccount_util.go
index 909d9f3c532..cd1a869419a 100644
--- a/controllers/apps/systemaccount_util.go
+++ b/controllers/apps/systemaccount_util.go
@@ -33,6 +33,7 @@ import (
appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
"github.com/apecloud/kubeblocks/pkg/constant"
componetutil "github.com/apecloud/kubeblocks/pkg/controller/component"
+ "github.com/apecloud/kubeblocks/pkg/controller/scheduling"
intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
viper "github.com/apecloud/kubeblocks/pkg/viperx"
)
@@ -328,11 +329,11 @@ func calibrateJobMetaAndSpec(job *batchv1.Job, cluster *appsv1alpha1.Cluster, co
// add toleration
clusterComp := cluster.Spec.GetComponentByName(compKey.componentName)
- tolerations, err := componetutil.BuildTolerations(cluster, clusterComp)
+ schedulingPolicy, err := scheduling.BuildSchedulingPolicy(cluster, clusterComp)
if err != nil {
return err
}
- job.Spec.Template.Spec.Tolerations = tolerations
+ job.Spec.Template.Spec.Tolerations = schedulingPolicy.Tolerations
return nil
}
diff --git a/deploy/helm/crds/apps.kubeblocks.io_clusters.yaml b/deploy/helm/crds/apps.kubeblocks.io_clusters.yaml
index 3c4800cc3f9..626242b28d5 100644
--- a/deploy/helm/crds/apps.kubeblocks.io_clusters.yaml
+++ b/deploy/helm/crds/apps.kubeblocks.io_clusters.yaml
@@ -2928,6 +2928,1197 @@ spec:
type: object
type: object
x-kubernetes-preserve-unknown-fields: true
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the component.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules
+ for the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling term
+ matches all objects with implicit weight 0 (i.e.
+ it's a no-op). A null preferred scheduling term
+ matches no objects (i.e. is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated
+ with the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching
+ the corresponding nodeSelectorTerm, in the
+ range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector
+ terms. The terms are ORed.
+ items:
+ description: 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.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt, and
+ Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is In
+ or NotIn, the values array must
+ be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. If
+ the operator is Gt or Lt, the
+ values array must have a single
+ element, which will be interpreted
+ as an integer. This array is replaced
+ during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules
+ (e.g. co-locate this pod in the same node, zone, etc.
+ as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added per-node
+ to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term,
+ associated with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in the
+ range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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
+ matches that of any node on which
+ a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of
+ namespaces that the term applies to. The
+ term is applied to the union of the namespaces
+ selected by this field and the ones listed
+ in the namespaces field. null selector and
+ null or empty namespaces list means "this
+ pod's namespace". An empty selector ({})
+ matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term applies
+ to. The term is applied to the union of
+ the namespaces listed in this field and
+ the ones selected by namespaceSelector.
+ null or empty namespaces list and null namespaceSelector
+ means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling
+ rules (e.g. avoid putting this pod in the same node,
+ zone, etc. as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule
+ pods to nodes that satisfy the anti-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 anti-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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added per-node
+ to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term,
+ associated with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in the
+ range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified
+ by this field are not met at scheduling time,
+ the pod will not be scheduled onto the node. If
+ the anti-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.
+ items:
+ description: 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
+ matches that of any node on which
+ a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of
+ namespaces that the term applies to. The
+ term is applied to the union of the namespaces
+ selected by this field and the ones listed
+ in the namespaces field. null selector and
+ null or empty namespaces list means "this
+ pod's namespace". An empty selector ({})
+ matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The
+ requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a set
+ of values. Valid operators are
+ In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values array
+ must be non-empty. If the operator
+ is Exists or DoesNotExist, the
+ values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term applies
+ to. The term is applied to the union of
+ the namespaces listed in this field and
+ the ones selected by namespaceSelector.
+ null or empty namespaces list and null namespaceSelector
+ means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this pod
+ onto a specific node. If it is non-empty, the scheduler
+ simply schedules this pod onto that node, assuming that
+ it fits resource requirements.
+ type: string
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must be true
+ for the pod to fit on a node. Selector which must match
+ a node''s labels for the pod to be scheduled on that node.
+ More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
+ type: object
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched by
+ specified scheduler. If not specified, the pod will be
+ dispatched by default scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches
+ the triple `key,value,effect` using the matching operator
+ `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple
+ using the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to
+ match. Empty means match all taint effects. When
+ specified, allowed values are NoSchedule, PreferNoSchedule
+ and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration
+ applies to. Empty means match all taint keys. If
+ the key is empty, operator must be Exists; this
+ combination means to match all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship
+ to the value. Valid operators are Exists and Equal.
+ Defaults to Equal. Exists is equivalent to wildcard
+ for value, so that a pod can tolerate all taints
+ of a particular category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period
+ of time the toleration (which must be of effect
+ NoExecute, otherwise this field is ignored) tolerates
+ the taint. By default, it is not set, which means
+ tolerate the taint forever (do not evict). Zero
+ and negative values will be treated as 0 (evict
+ immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration
+ matches to. If the operator is Exists, the value
+ should be empty, otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how a group
+ of pods ought to spread across topology domains. Scheduler
+ will schedule pods in a way which abides by the constraints.
+ All topologySpreadConstraints are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how to
+ spread matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching
+ pods. Pods that match this label selector are counted
+ to determine the number of pods in their corresponding
+ topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement is
+ a selector that contains values, a key, and
+ an operator that relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the
+ selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty. If
+ the operator is Exists or DoesNotExist,
+ the values array must be empty. This array
+ is replaced during a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label
+ keys to select the pods over which spreading will
+ be calculated. The keys are used to lookup values
+ from the incoming pod labels, those key-value labels
+ are ANDed with labelSelector to select the group
+ of existing pods over which spreading will be calculated
+ for the incoming pod. The same key is forbidden
+ to exist in both MatchLabelKeys and LabelSelector.
+ MatchLabelKeys cannot be set when LabelSelector
+ isn't set. Keys that don't exist in the incoming
+ pod labels will be ignored. A null or empty list
+ means only match against labelSelector. \n This
+ is a beta field and requires the MatchLabelKeysInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to which
+ pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`,
+ it is the maximum permitted difference between the
+ number of matching pods in the target topology and
+ the global minimum. The global minimum is the minimum
+ number of matching pods in an eligible domain or
+ zero if the number of eligible domains is less than
+ 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 this case, the global minimum
+ is 1. | zone1 | zone2 | zone3 | | P P | P P | P |
+ - if MaxSkew is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming pod can
+ be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies
+ that satisfy it. It''s a required field. Default
+ value is 1 and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number
+ of eligible domains. When the number of eligible
+ domains with matching topology keys is less than
+ minDomains, Pod Topology Spread treats \"global
+ minimum\" as 0, and then the calculation of Skew
+ is performed. And when the number of eligible domains
+ with matching topology keys equals or greater than
+ minDomains, this value has no effect on scheduling.
+ As a result, when the number of eligible domains
+ is less than minDomains, scheduler won't schedule
+ more than maxSkew Pods to those domains. If value
+ is nil, the constraint behaves as if MinDomains
+ is equal to 1. Valid values are integers greater
+ than 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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
+ 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 scheduled to any of the
+ three zones, it will violate MaxSkew. \n This is
+ a beta field and requires the MinDomainsInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how we
+ will treat Pod's nodeAffinity/nodeSelector when
+ calculating pod topology spread skew. Options are:
+ - Honor: only nodes matching nodeAffinity/nodeSelector
+ are included in the calculations. - Ignore: nodeAffinity/nodeSelector
+ are ignored. All nodes are included in the calculations.
+ \n If this value is nil, the behavior is equivalent
+ to the Honor policy. This is a beta-level feature
+ default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we will
+ treat node taints when calculating pod topology
+ spread skew. Options are: - Honor: nodes without
+ taints, along with tainted nodes for which the incoming
+ pod has a toleration, are included. - Ignore: node
+ taints are ignored. All nodes are included. \n If
+ this value is nil, the behavior is equivalent to
+ the Ignore policy. This is a beta-level feature
+ default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology.
+ We consider each as a "bucket", and
+ try to put balanced number of pods into each bucket.
+ We define a domain as a particular instance of a
+ topology. Also, we define an eligible domain as
+ a domain whose nodes meet the requirements of nodeAffinityPolicy
+ and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And, if
+ TopologyKey is "topology.kubernetes.io/zone", each
+ zone is a domain of that topology. It's a required
+ field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how to deal
+ with a pod if it doesn''t satisfy the spread constraint.
+ - DoNotSchedule (default) tells the scheduler not
+ to schedule it. - ScheduleAnyway tells the scheduler
+ to schedule the pod in any location, but giving
+ higher precedence to topologies that would help
+ reduce the skew. A constraint is considered "Unsatisfiable"
+ for an incoming pod if and only if every possible
+ node assignment for that pod would violate "MaxSkew"
+ on some topology. For example, in a 3-zone cluster,
+ MaxSkew is set to 1, 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, 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,
+ the cluster can still be imbalanced, but scheduler
+ won''t make it *more* imbalanced. It''s a required
+ field.'
+ type: string
+ required:
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
+ type: object
+ type: array
+ type: object
serviceAccountName:
description: Specifies the name of the ServiceAccount that the
running component depends on.
@@ -2952,603 +4143,1718 @@ spec:
same Cluster or ServiceDescriptor."
items:
properties:
- cluster:
- description: "The name of the KubeBlocks cluster being
- referenced when a service provided by another KubeBlocks
- cluster is being referenced. \n By default, the clusterDefinition.spec.connectionCredential
- secret corresponding to the referenced Cluster will
- be used to bind to the current component. The connection
- credential secret should include and correspond to the
- following fields: endpoint, port, username, and password
- when a KubeBlocks cluster is being referenced. \n Under
- this referencing approach, the ServiceKind and ServiceVersion
- of service reference declaration defined in the ClusterDefinition
- will not be validated. If both Cluster and ServiceDescriptor
- are specified, the Cluster takes precedence."
+ cluster:
+ description: "The name of the KubeBlocks cluster being
+ referenced when a service provided by another KubeBlocks
+ cluster is being referenced. \n By default, the clusterDefinition.spec.connectionCredential
+ secret corresponding to the referenced Cluster will
+ be used to bind to the current component. The connection
+ credential secret should include and correspond to the
+ following fields: endpoint, port, username, and password
+ when a KubeBlocks cluster is being referenced. \n Under
+ this referencing approach, the ServiceKind and ServiceVersion
+ of service reference declaration defined in the ClusterDefinition
+ will not be validated. If both Cluster and ServiceDescriptor
+ are specified, the Cluster takes precedence."
+ type: string
+ clusterRef:
+ description: Specifies the cluster to reference.
+ properties:
+ cluster:
+ description: The name of the cluster to reference.
+ type: string
+ credential:
+ description: The credential (SystemAccount) to reference
+ from the cluster.
+ properties:
+ component:
+ description: The name of the component where the
+ credential resides in.
+ type: string
+ name:
+ description: The name of the credential (SystemAccount)
+ to reference.
+ type: string
+ required:
+ - component
+ - name
+ type: object
+ service:
+ description: The service to reference from the cluster.
+ properties:
+ component:
+ description: "The name of the component where
+ the service resides in. \n It is required when
+ referencing a component service."
+ type: string
+ port:
+ description: "The port name of the service to
+ reference. \n If there is a non-zero node-port
+ exist for the matched service port, the node-port
+ will be selected first. If the referenced service
+ is a pod-service, there will be multiple service
+ objects matched, and the resolved value will
+ be presented in the following format: service1.name:port1,service2.name:port2..."
+ type: string
+ service:
+ description: "The name of the service to reference.
+ \n Leave it empty to reference the default service.
+ Set it to \"headless\" to reference the default
+ headless service. If the referenced service
+ is a pod-service, there will be multiple service
+ objects matched, and the resolved value will
+ be presented in the following format: service1.name,service2.name..."
+ type: string
+ required:
+ - service
+ type: object
+ required:
+ - cluster
+ type: object
+ name:
+ description: Specifies the identifier of the service reference
+ declaration. It corresponds to the serviceRefDeclaration
+ name defined in the clusterDefinition.componentDefs[*].serviceRefDeclarations[*].name.
+ type: string
+ namespace:
+ description: Specifies the namespace of the referenced
+ Cluster or ServiceDescriptor object. If not specified,
+ the namespace of the current cluster will be used.
+ type: string
+ serviceDescriptor:
+ description: "The service descriptor of the service provided
+ by external sources. \n When referencing a service provided
+ by external sources, a ServiceDescriptor object is required
+ to establish the service binding. The `serviceDescriptor.spec.serviceKind`
+ and `serviceDescriptor.spec.serviceVersion` should match
+ the serviceKind and serviceVersion declared in the definition.
+ \n If both Cluster and ServiceDescriptor are specified,
+ the Cluster takes precedence."
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ serviceVersion:
+ description: ServiceVersion specifies the version of the service
+ provisioned by the component. The version should follow the
+ syntax and semantics of the "Semantic Versioning" specification
+ (http://semver.org/). If not explicitly specified, the version
+ defined in the referenced topology will be used. If no version
+ is specified in the topology, the latest available version
+ will be used.
+ maxLength: 32
+ type: string
+ services:
+ description: Services overrides services defined in referenced
+ ComponentDefinition.
+ items:
+ properties:
+ annotations:
+ additionalProperties:
+ type: string
+ description: 'If ServiceType is LoadBalancer, cloud provider
+ related parameters can be put here. More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.'
+ type: object
+ name:
+ description: References the component service name defined
+ in the ComponentDefinition.Spec.Services[x].Name.
+ maxLength: 25
+ type: string
+ podService:
+ description: Indicates whether to generate individual
+ services for each pod. If set to true, a separate service
+ will be created for each pod in the cluster.
+ type: boolean
+ serviceType:
+ default: ClusterIP
+ description: "Determines how the Service is exposed. Valid
+ options are ClusterIP, NodePort, and LoadBalancer. \n
+ - `ClusterIP` allocates a cluster-internal IP address
+ for load-balancing to endpoints. Endpoints are determined
+ by the selector or if that is not specified, they are
+ determined by manual construction of an Endpoints object
+ or EndpointSlice objects. If clusterIP is \"None\",
+ no virtual IP is allocated and the endpoints are published
+ as a set of endpoints rather than a virtual IP. - `NodePort`
+ builds on ClusterIP and allocates a port on every node
+ which routes to the same endpoints as the clusterIP.
+ - `LoadBalancer` builds on NodePort and creates an external
+ load-balancer (if supported in the current cloud) which
+ routes to the same endpoints as the clusterIP. \n More
+ info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types."
+ enum:
+ - ClusterIP
+ - NodePort
+ - LoadBalancer
+ type: string
+ x-kubernetes-preserve-unknown-fields: true
+ required:
+ - name
+ type: object
+ type: array
+ switchPolicy:
+ description: Defines the strategy for switchover and failover
+ when workloadType is Replication.
+ properties:
+ type:
+ default: Noop
+ description: Type specifies the type of switch policy to
+ be applied.
+ enum:
+ - Noop
+ type: string
+ type: object
+ tls:
+ description: Enables or disables TLS certs.
+ type: boolean
+ tolerations:
+ description: Attached to tolerate any taint that matches the
+ triple `key,value,effect` using the matching operator `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple using
+ the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to match.
+ Empty means match all taint effects. When specified,
+ allowed values are NoSchedule, PreferNoSchedule and
+ NoExecute.
type: string
- clusterRef:
- description: Specifies the cluster to reference.
+ key:
+ description: Key is the taint key that the toleration
+ applies to. Empty means match all taint keys. If the
+ key is empty, operator must be Exists; this combination
+ means to match all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship
+ to the value. Valid operators are Exists and Equal.
+ Defaults to Equal. Exists is equivalent to wildcard
+ for value, so that a pod can tolerate all taints of
+ a particular category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period of
+ time the toleration (which must be of effect NoExecute,
+ otherwise this field is ignored) tolerates the taint.
+ By default, it is not set, which means tolerate the
+ taint forever (do not evict). Zero and negative values
+ will be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration matches
+ to. If the operator is Exists, the value should be empty,
+ otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ x-kubernetes-preserve-unknown-fields: true
+ updateStrategy:
+ description: Defines the update strategy for the component.
+ Not supported.
+ enum:
+ - Serial
+ - BestEffortParallel
+ - Parallel
+ type: string
+ userResourceRefs:
+ description: Defines the user-defined volumes.
+ properties:
+ configMapRefs:
+ description: ConfigMapRefs defines the user-defined config
+ maps.
+ items:
+ description: ConfigMapRef defines a reference to a ConfigMap.
properties:
- cluster:
- description: The name of the cluster to reference.
- type: string
- credential:
- description: The credential (SystemAccount) to reference
- from the cluster.
+ asVolumeFrom:
+ description: AsVolumeFrom lists the names of containers
+ in which the volume should be mounted.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ configMap:
+ description: ConfigMap specifies the ConfigMap to
+ be mounted as a volume.
properties:
- component:
- description: The name of the component where the
- credential resides in.
- type: string
+ defaultMode:
+ description: 'defaultMode is optional: mode bits
+ used to set permissions on created files by
+ default. Must be an octal value between 0000
+ and 0777 or a decimal value between 0 and 511.
+ YAML accepts both octal and decimal values,
+ JSON requires decimal values for mode bits.
+ Defaults to 0644. Directories within the path
+ are not affected by this setting. This might
+ be in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ items:
+ description: items if unspecified, each key-value
+ pair in the Data field of the referenced ConfigMap
+ will be projected into the volume as a file
+ whose name is the key and content is the value.
+ If specified, the listed keys will be projected
+ into the specified paths, and unlisted keys
+ will not be present. If a key is specified which
+ is not present in the ConfigMap, the volume
+ setup will error unless it is marked optional.
+ Paths must be relative and may not contain the
+ '..' path or start with '..'.
+ items:
+ description: Maps a string key to a path within
+ a volume.
+ properties:
+ key:
+ description: key is the key to project.
+ type: string
+ mode:
+ description: 'mode is Optional: mode bits
+ used to set permissions on this file.
+ Must be an octal value between 0000 and
+ 0777 or a decimal value between 0 and
+ 511. YAML accepts both octal and decimal
+ values, JSON requires decimal values for
+ mode bits. If not specified, the volume
+ defaultMode will be used. This might be
+ in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ path:
+ description: path is the relative path of
+ the file to map the key to. May not be
+ an absolute path. May not contain the
+ path element '..'. May not start with
+ the string '..'.
+ type: string
+ required:
+ - key
+ - path
+ type: object
+ type: array
name:
- description: The name of the credential (SystemAccount)
- to reference.
+ description: 'Name of the referent. More info:
+ https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+ TODO: Add other useful fields. apiVersion, kind,
+ uid?'
type: string
- required:
- - component
- - name
+ optional:
+ description: optional specify whether the ConfigMap
+ or its keys must be defined
+ type: boolean
type: object
- service:
- description: The service to reference from the cluster.
+ x-kubernetes-map-type: atomic
+ mountPoint:
+ description: MountPoint is the filesystem path where
+ the volume will be mounted.
+ maxLength: 256
+ pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referenced ConfigMap
+ or Secret object. It must conform to DNS label standards.
+ maxLength: 63
+ pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
+ type: string
+ subPath:
+ description: SubPath specifies a path within the volume
+ from which to mount.
+ type: string
+ required:
+ - configMap
+ - mountPoint
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ secretRefs:
+ description: SecretRefs defines the user-defined secrets.
+ items:
+ description: SecretRef defines a reference to a Secret.
+ properties:
+ asVolumeFrom:
+ description: AsVolumeFrom lists the names of containers
+ in which the volume should be mounted.
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: set
+ mountPoint:
+ description: MountPoint is the filesystem path where
+ the volume will be mounted.
+ maxLength: 256
+ pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
+ type: string
+ name:
+ description: Name is the name of the referenced ConfigMap
+ or Secret object. It must conform to DNS label standards.
+ maxLength: 63
+ pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
+ type: string
+ secret:
+ description: Secret specifies the secret to be mounted
+ as a volume.
properties:
- component:
- description: "The name of the component where
- the service resides in. \n It is required when
- referencing a component service."
- type: string
- port:
- description: "The port name of the service to
- reference. \n If there is a non-zero node-port
- exist for the matched service port, the node-port
- will be selected first. If the referenced service
- is a pod-service, there will be multiple service
- objects matched, and the resolved value will
- be presented in the following format: service1.name:port1,service2.name:port2..."
- type: string
- service:
- description: "The name of the service to reference.
- \n Leave it empty to reference the default service.
- Set it to \"headless\" to reference the default
- headless service. If the referenced service
- is a pod-service, there will be multiple service
- objects matched, and the resolved value will
- be presented in the following format: service1.name,service2.name..."
+ defaultMode:
+ description: 'defaultMode is Optional: mode bits
+ used to set permissions on created files by
+ default. Must be an octal value between 0000
+ and 0777 or a decimal value between 0 and 511.
+ YAML accepts both octal and decimal values,
+ JSON requires decimal values for mode bits.
+ Defaults to 0644. Directories within the path
+ are not affected by this setting. This might
+ be in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ items:
+ description: items If unspecified, each key-value
+ pair in the Data field of the referenced Secret
+ will be projected into the volume as a file
+ whose name is the key and content is the value.
+ If specified, the listed keys will be projected
+ into the specified paths, and unlisted keys
+ will not be present. If a key is specified which
+ is not present in the Secret, the volume setup
+ will error unless it is marked optional. Paths
+ must be relative and may not contain the '..'
+ path or start with '..'.
+ items:
+ description: Maps a string key to a path within
+ a volume.
+ properties:
+ key:
+ description: key is the key to project.
+ type: string
+ mode:
+ description: 'mode is Optional: mode bits
+ used to set permissions on this file.
+ Must be an octal value between 0000 and
+ 0777 or a decimal value between 0 and
+ 511. YAML accepts both octal and decimal
+ values, JSON requires decimal values for
+ mode bits. If not specified, the volume
+ defaultMode will be used. This might be
+ in conflict with other options that affect
+ the file mode, like fsGroup, and the result
+ can be other mode bits set.'
+ format: int32
+ type: integer
+ path:
+ description: path is the relative path of
+ the file to map the key to. May not be
+ an absolute path. May not contain the
+ path element '..'. May not start with
+ the string '..'.
+ type: string
+ required:
+ - key
+ - path
+ type: object
+ type: array
+ optional:
+ description: optional field specify whether the
+ Secret or its keys must be defined
+ type: boolean
+ secretName:
+ description: 'secretName is the name of the secret
+ in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
type: string
- required:
- - service
type: object
+ subPath:
+ description: SubPath specifies a path within the volume
+ from which to mount.
+ type: string
required:
- - cluster
- type: object
- name:
- description: Specifies the identifier of the service reference
- declaration. It corresponds to the serviceRefDeclaration
- name defined in the clusterDefinition.componentDefs[*].serviceRefDeclarations[*].name.
- type: string
- namespace:
- description: Specifies the namespace of the referenced
- Cluster or ServiceDescriptor object. If not specified,
- the namespace of the current cluster will be used.
- type: string
- serviceDescriptor:
- description: "The service descriptor of the service provided
- by external sources. \n When referencing a service provided
- by external sources, a ServiceDescriptor object is required
- to establish the service binding. The `serviceDescriptor.spec.serviceKind`
- and `serviceDescriptor.spec.serviceVersion` should match
- the serviceKind and serviceVersion declared in the definition.
- \n If both Cluster and ServiceDescriptor are specified,
- the Cluster takes precedence."
- type: string
- required:
- - name
- type: object
- type: array
- serviceVersion:
- description: ServiceVersion specifies the version of the service
- provisioned by the component. The version should follow the
- syntax and semantics of the "Semantic Versioning" specification
- (http://semver.org/). If not explicitly specified, the version
- defined in the referenced topology will be used. If no version
- is specified in the topology, the latest available version
- will be used.
- maxLength: 32
- type: string
- services:
- description: Services overrides services defined in referenced
- ComponentDefinition.
- items:
- properties:
- annotations:
- additionalProperties:
- type: string
- description: 'If ServiceType is LoadBalancer, cloud provider
- related parameters can be put here. More info: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer.'
+ - mountPoint
+ - name
+ - secret
type: object
- name:
- description: References the component service name defined
- in the ComponentDefinition.Spec.Services[x].Name.
- maxLength: 25
- type: string
- podService:
- description: Indicates whether to generate individual
- services for each pod. If set to true, a separate service
- will be created for each pod in the cluster.
- type: boolean
- serviceType:
- default: ClusterIP
- description: "Determines how the Service is exposed. Valid
- options are ClusterIP, NodePort, and LoadBalancer. \n
- - `ClusterIP` allocates a cluster-internal IP address
- for load-balancing to endpoints. Endpoints are determined
- by the selector or if that is not specified, they are
- determined by manual construction of an Endpoints object
- or EndpointSlice objects. If clusterIP is \"None\",
- no virtual IP is allocated and the endpoints are published
- as a set of endpoints rather than a virtual IP. - `NodePort`
- builds on ClusterIP and allocates a port on every node
- which routes to the same endpoints as the clusterIP.
- - `LoadBalancer` builds on NodePort and creates an external
- load-balancer (if supported in the current cloud) which
- routes to the same endpoints as the clusterIP. \n More
- info: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types."
- enum:
- - ClusterIP
- - NodePort
- - LoadBalancer
- type: string
- x-kubernetes-preserve-unknown-fields: true
- required:
- - name
- type: object
- type: array
- switchPolicy:
- description: Defines the strategy for switchover and failover
- when workloadType is Replication.
- properties:
- type:
- default: Noop
- description: Type specifies the type of switch policy to
- be applied.
- enum:
- - Noop
- type: string
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
- tls:
- description: Enables or disables TLS certs.
- type: boolean
- tolerations:
- description: Attached to tolerate any taint that matches the
- triple `key,value,effect` using the matching operator `operator`.
+ volumeClaimTemplates:
+ description: Provides information for statefulset.spec.volumeClaimTemplates.
items:
- description: The pod this Toleration is attached to tolerates
- any taint that matches the triple using
- the matching operator .
properties:
- effect:
- description: Effect indicates the taint effect to match.
- Empty means match all taint effects. When specified,
- allowed values are NoSchedule, PreferNoSchedule and
- NoExecute.
- type: string
- key:
- description: Key is the taint key that the toleration
- applies to. Empty means match all taint keys. If the
- key is empty, operator must be Exists; this combination
- means to match all values and all keys.
- type: string
- operator:
- description: Operator represents a key's relationship
- to the value. Valid operators are Exists and Equal.
- Defaults to Equal. Exists is equivalent to wildcard
- for value, so that a pod can tolerate all taints of
- a particular category.
- type: string
- tolerationSeconds:
- description: TolerationSeconds represents the period of
- time the toleration (which must be of effect NoExecute,
- otherwise this field is ignored) tolerates the taint.
- By default, it is not set, which means tolerate the
- taint forever (do not evict). Zero and negative values
- will be treated as 0 (evict immediately) by the system.
- format: int64
- type: integer
- value:
- description: Value is the taint value the toleration matches
- to. If the operator is Exists, the value should be empty,
- otherwise just a regular string.
+ name:
+ description: Refers to `clusterDefinition.spec.componentDefs.containers.volumeMounts.name`.
type: string
+ spec:
+ description: Defines the desired characteristics of a
+ volume requested by a pod author.
+ properties:
+ accessModes:
+ description: 'Contains the desired access modes the
+ volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.'
+ items:
+ type: string
+ type: array
+ x-kubernetes-preserve-unknown-fields: true
+ resources:
+ description: 'Represents the minimum resources the
+ volume should have. If the RecoverVolumeExpansionFailure
+ feature is enabled, users are allowed to specify
+ resource requirements that are lower than the previous
+ value but must still be higher than the capacity
+ recorded in the status field of the claim. More
+ info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.'
+ properties:
+ claims:
+ description: "Claims lists the names of resources,
+ defined in spec.resourceClaims, that are used
+ by this container. \n This is an alpha field
+ and requires enabling the DynamicResourceAllocation
+ feature gate. \n This field is immutable. It
+ can only be set for containers."
+ items:
+ description: ResourceClaim references one entry
+ in PodSpec.ResourceClaims.
+ properties:
+ name:
+ description: Name must match the name of
+ one entry in pod.spec.resourceClaims of
+ the Pod where this field is used. It makes
+ that resource available inside a container.
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Limits describes the maximum amount
+ of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Requests describes the minimum amount
+ of compute resources required. If Requests is
+ omitted for a container, it defaults to Limits
+ if that is explicitly specified, otherwise to
+ an implementation-defined value. Requests cannot
+ exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ type: object
+ x-kubernetes-preserve-unknown-fields: true
+ storageClassName:
+ description: 'The name of the StorageClass required
+ by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.'
+ type: string
+ volumeMode:
+ description: Defines what type of volume is required
+ by the claim.
+ type: string
+ type: object
+ required:
+ - name
type: object
type: array
- x-kubernetes-preserve-unknown-fields: true
- updateStrategy:
- description: Defines the update strategy for the component.
- Not supported.
- enum:
- - Serial
- - BestEffortParallel
- - Parallel
- type: string
- userResourceRefs:
- description: Defines the user-defined volumes.
- properties:
- configMapRefs:
- description: ConfigMapRefs defines the user-defined config
- maps.
- items:
- description: ConfigMapRef defines a reference to a ConfigMap.
+ required:
+ - replicas
+ type: object
+ maxItems: 128
+ minItems: 1
+ type: array
+ x-kubernetes-validations:
+ - message: duplicated component
+ rule: self.all(x, size(self.filter(c, c.name == x.name)) == 1)
+ - message: two kinds of definition API can not be used simultaneously
+ rule: self.all(x, size(self.filter(c, has(c.componentDef))) == 0)
+ || self.all(x, size(self.filter(c, has(c.componentDef))) == size(self))
+ monitor:
+ description: The configuration of monitor.
+ properties:
+ monitoringInterval:
+ anyOf:
+ - type: integer
+ - type: string
+ description: Defines the frequency at which monitoring occurs.
+ If set to 0, monitoring is disabled.
+ x-kubernetes-int-or-string: true
+ type: object
+ network:
+ description: The configuration of network.
+ properties:
+ hostNetworkAccessible:
+ default: false
+ description: Indicates whether the host network can be accessed.
+ By default, this is set to false.
+ type: boolean
+ publiclyAccessible:
+ default: false
+ description: Indicates whether the network is accessible to the
+ public. By default, this is set to false.
+ type: boolean
+ type: object
+ replicas:
+ description: Specifies the replicas of the first componentSpec, if
+ the replicas of the first componentSpec is specified, this value
+ will be ignored.
+ format: int32
+ type: integer
+ resources:
+ description: Specifies the resources of the first componentSpec, if
+ the resources of the first componentSpec is specified, this value
+ will be ignored.
+ properties:
+ cpu:
+ anyOf:
+ - type: integer
+ - type: string
+ description: 'Specifies the amount of processing power the cluster
+ needs. For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ memory:
+ anyOf:
+ - type: integer
+ - type: string
+ description: 'Specifies the amount of memory the cluster needs.
+ For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the cluster.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for
+ the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling term matches
+ all objects with implicit weight 0 (i.e. it's a no-op).
+ A null preferred scheduling term matches no objects
+ (i.e. is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated with
+ the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching the
+ corresponding nodeSelectorTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
properties:
- asVolumeFrom:
- description: AsVolumeFrom lists the names of containers
- in which the volume should be mounted.
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms.
+ The terms are ORed.
items:
- type: string
+ description: 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.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
type: array
- x-kubernetes-list-type: set
- configMap:
- description: ConfigMap specifies the ConfigMap to
- be mounted as a volume.
- properties:
- defaultMode:
- description: 'defaultMode is optional: mode bits
- used to set permissions on created files by
- default. Must be an octal value between 0000
- and 0777 or a decimal value between 0 and 511.
- YAML accepts both octal and decimal values,
- JSON requires decimal values for mode bits.
- Defaults to 0644. Directories within the path
- are not affected by this setting. This might
- be in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- items:
- description: items if unspecified, each key-value
- pair in the Data field of the referenced ConfigMap
- will be projected into the volume as a file
- whose name is the key and content is the value.
- If specified, the listed keys will be projected
- into the specified paths, and unlisted keys
- will not be present. If a key is specified which
- is not present in the ConfigMap, the volume
- setup will error unless it is marked optional.
- Paths must be relative and may not contain the
- '..' path or start with '..'.
- items:
- description: Maps a string key to a path within
- a volume.
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g.
+ co-locate this pod in the same node, zone, etc. as some
+ other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
properties:
- key:
- description: key is the key to project.
- type: string
- mode:
- description: 'mode is Optional: mode bits
- used to set permissions on this file.
- Must be an octal value between 0000 and
- 0777 or a decimal value between 0 and
- 511. YAML accepts both octal and decimal
- values, JSON requires decimal values for
- mode bits. If not specified, the volume
- defaultMode will be used. This might be
- in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- path:
- description: path is the relative path of
- the file to map the key to. May not be
- an absolute path. May not contain the
- path element '..'. May not start with
- the string '..'.
- type: string
- required:
- - key
- - path
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
type: object
- type: array
- name:
- description: 'Name of the referent. More info:
- https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
- TODO: Add other useful fields. apiVersion, kind,
- uid?'
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
type: string
- optional:
- description: optional specify whether the ConfigMap
- or its keys must be defined
- type: boolean
- type: object
- x-kubernetes-map-type: atomic
- mountPoint:
- description: MountPoint is the filesystem path where
- the volume will be mounted.
- maxLength: 256
- pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
- type: string
- name:
- description: Name is the name of the referenced ConfigMap
- or Secret object. It must conform to DNS label standards.
- maxLength: 63
- pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
- type: string
- subPath:
- description: SubPath specifies a path within the volume
- from which to mount.
- type: string
- required:
- - configMap
- - mountPoint
- - name
- type: object
- type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- secretRefs:
- description: SecretRefs defines the user-defined secrets.
- items:
- description: SecretRef defines a reference to a Secret.
- properties:
- asVolumeFrom:
- description: AsVolumeFrom lists the names of containers
- in which the volume should be mounted.
- items:
+ type: array
+ topologyKey:
+ description: 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.
type: string
- type: array
- x-kubernetes-list-type: set
- mountPoint:
- description: MountPoint is the filesystem path where
- the volume will be mounted.
- maxLength: 256
- pattern: ^/[a-z]([a-z0-9\-]*[a-z0-9])?$
- type: string
- name:
- description: Name is the name of the referenced ConfigMap
- or Secret object. It must conform to DNS label standards.
- maxLength: 63
- pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
- type: string
- secret:
- description: Secret specifies the secret to be mounted
- as a volume.
- properties:
- defaultMode:
- description: 'defaultMode is Optional: mode bits
- used to set permissions on created files by
- default. Must be an octal value between 0000
- and 0777 or a decimal value between 0 and 511.
- YAML accepts both octal and decimal values,
- JSON requires decimal values for mode bits.
- Defaults to 0644. Directories within the path
- are not affected by this setting. This might
- be in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- items:
- description: items If unspecified, each key-value
- pair in the Data field of the referenced Secret
- will be projected into the volume as a file
- whose name is the key and content is the value.
- If specified, the listed keys will be projected
- into the specified paths, and unlisted keys
- will not be present. If a key is specified which
- is not present in the Secret, the volume setup
- will error unless it is marked optional. Paths
- must be relative and may not contain the '..'
- path or start with '..'.
- items:
- description: Maps a string key to a path within
- a volume.
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules
+ (e.g. avoid putting this pod in the same node, zone, etc.
+ as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods
+ to nodes that satisfy the anti-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
+ anti-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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
properties:
- key:
- description: key is the key to project.
- type: string
- mode:
- description: 'mode is Optional: mode bits
- used to set permissions on this file.
- Must be an octal value between 0000 and
- 0777 or a decimal value between 0 and
- 511. YAML accepts both octal and decimal
- values, JSON requires decimal values for
- mode bits. If not specified, the volume
- defaultMode will be used. This might be
- in conflict with other options that affect
- the file mode, like fsGroup, and the result
- can be other mode bits set.'
- format: int32
- type: integer
- path:
- description: path is the relative path of
- the file to map the key to. May not be
- an absolute path. May not contain the
- path element '..'. May not start with
- the string '..'.
- type: string
- required:
- - key
- - path
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
type: object
- type: array
- optional:
- description: optional field specify whether the
- Secret or its keys must be defined
- type: boolean
- secretName:
- description: 'secretName is the name of the secret
- in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified
+ by this field are not met at scheduling time, the pod
+ will not be scheduled onto the node. If the anti-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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
type: string
- type: object
- subPath:
- description: SubPath specifies a path within the volume
- from which to mount.
- type: string
- required:
- - mountPoint
- - name
- - secret
- type: object
- type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- type: object
- volumeClaimTemplates:
- description: Provides information for statefulset.spec.volumeClaimTemplates.
- items:
- properties:
- name:
- description: Refers to `clusterDefinition.spec.componentDefs.containers.volumeMounts.name`.
- type: string
- spec:
- description: Defines the desired characteristics of a
- volume requested by a pod author.
- properties:
- accessModes:
- description: 'Contains the desired access modes the
- volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1.'
- items:
+ type: array
+ topologyKey:
+ description: 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.
type: string
- type: array
- x-kubernetes-preserve-unknown-fields: true
- resources:
- description: 'Represents the minimum resources the
- volume should have. If the RecoverVolumeExpansionFailure
- feature is enabled, users are allowed to specify
- resource requirements that are lower than the previous
- value but must still be higher than the capacity
- recorded in the status field of the claim. More
- info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources.'
- properties:
- claims:
- description: "Claims lists the names of resources,
- defined in spec.resourceClaims, that are used
- by this container. \n This is an alpha field
- and requires enabling the DynamicResourceAllocation
- feature gate. \n This field is immutable. It
- can only be set for containers."
- items:
- description: ResourceClaim references one entry
- in PodSpec.ResourceClaims.
- properties:
- name:
- description: Name must match the name of
- one entry in pod.spec.resourceClaims of
- the Pod where this field is used. It makes
- that resource available inside a container.
- type: string
- required:
- - name
- type: object
- type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- limits:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Limits describes the maximum amount
- of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- requests:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Requests describes the minimum amount
- of compute resources required. If Requests is
- omitted for a container, it defaults to Limits
- if that is explicitly specified, otherwise to
- an implementation-defined value. Requests cannot
- exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this pod onto a
+ specific node. If it is non-empty, the scheduler simply schedules
+ this pod onto that node, assuming that it fits resource requirements.
+ type: string
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must be true for
+ the pod to fit on a node. Selector which must match a node''s
+ labels for the pod to be scheduled on that node. More info:
+ https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
+ type: object
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched by specified
+ scheduler. If not specified, the pod will be dispatched by default
+ scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches the triple
+ `key,value,effect` using the matching operator `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple using
+ the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to match.
+ Empty means match all taint effects. When specified, allowed
+ values are NoSchedule, PreferNoSchedule and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration applies
+ to. Empty means match all taint keys. If the key is empty,
+ operator must be Exists; this combination means to match
+ all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship to
+ the value. Valid operators are Exists and Equal. Defaults
+ to Equal. Exists is equivalent to wildcard for value,
+ so that a pod can tolerate all taints of a particular
+ category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period of
+ time the toleration (which must be of effect NoExecute,
+ otherwise this field is ignored) tolerates the taint.
+ By default, it is not set, which means tolerate the taint
+ forever (do not evict). Zero and negative values will
+ be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration matches
+ to. If the operator is Exists, the value should be empty,
+ otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how a group of
+ pods ought to spread across topology domains. Scheduler will
+ schedule pods in a way which abides by the constraints. All
+ topologySpreadConstraints are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how to spread
+ matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching pods.
+ Pods that match this label selector are counted to determine
+ the number of pods in their corresponding topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector
+ requirements. The requirements are ANDed.
+ items:
+ description: A label selector requirement is a selector
+ that contains values, a key, and an operator that
+ relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship
+ to a set of values. Valid operators are In,
+ NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values.
+ If the operator is In or NotIn, the values array
+ must be non-empty. If the operator is Exists
+ or DoesNotExist, the values array must be empty.
+ This array is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
type: object
- x-kubernetes-preserve-unknown-fields: true
- storageClassName:
- description: 'The name of the StorageClass required
- by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1.'
- type: string
- volumeMode:
- description: Defines what type of volume is required
- by the claim.
+ type: array
+ matchLabels:
+ additionalProperties:
type: string
- type: object
- required:
- - name
- type: object
- type: array
- required:
- - replicas
- type: object
- maxItems: 128
- minItems: 1
- type: array
- x-kubernetes-validations:
- - message: duplicated component
- rule: self.all(x, size(self.filter(c, c.name == x.name)) == 1)
- - message: two kinds of definition API can not be used simultaneously
- rule: self.all(x, size(self.filter(c, has(c.componentDef))) == 0)
- || self.all(x, size(self.filter(c, has(c.componentDef))) == size(self))
- monitor:
- description: The configuration of monitor.
- properties:
- monitoringInterval:
- anyOf:
- - type: integer
- - type: string
- description: Defines the frequency at which monitoring occurs.
- If set to 0, monitoring is disabled.
- x-kubernetes-int-or-string: true
- type: object
- network:
- description: The configuration of network.
- properties:
- hostNetworkAccessible:
- default: false
- description: Indicates whether the host network can be accessed.
- By default, this is set to false.
- type: boolean
- publiclyAccessible:
- default: false
- description: Indicates whether the network is accessible to the
- public. By default, this is set to false.
- type: boolean
- type: object
- replicas:
- description: Specifies the replicas of the first componentSpec, if
- the replicas of the first componentSpec is specified, this value
- will be ignored.
- format: int32
- type: integer
- resources:
- description: Specifies the resources of the first componentSpec, if
- the resources of the first componentSpec is specified, this value
- will be ignored.
- properties:
- cpu:
- anyOf:
- - type: integer
- - type: string
- description: 'Specifies the amount of processing power the cluster
- needs. For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- memory:
- anyOf:
- - type: integer
- - type: string
- description: 'Specifies the amount of memory the cluster needs.
- For more information, refer to: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label keys
+ to select the pods over which spreading will be calculated.
+ The keys are used to lookup values from the incoming pod
+ labels, those key-value labels are ANDed with labelSelector
+ to select the group of existing pods over which spreading
+ will be calculated for the incoming pod. The same key
+ is forbidden to exist in both MatchLabelKeys and LabelSelector.
+ MatchLabelKeys cannot be set when LabelSelector isn't
+ set. Keys that don't exist in the incoming pod labels
+ will be ignored. A null or empty list means only match
+ against labelSelector. \n This is a beta field and requires
+ the MatchLabelKeysInPodTopologySpread feature gate to
+ be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to which pods
+ may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`,
+ it is the maximum permitted difference between the number
+ of matching pods in the target topology and the global
+ minimum. The global minimum is the minimum number of matching
+ pods in an eligible domain or zero if the number of eligible
+ domains is less than 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 this case, the global minimum is 1.
+ | zone1 | zone2 | zone3 | | P P | P P | P | -
+ if MaxSkew is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming pod can be scheduled
+ onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies that
+ satisfy it. It''s a required field. Default value is 1
+ and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number of eligible
+ domains. When the number of eligible domains with matching
+ topology keys is less than minDomains, Pod Topology Spread
+ treats \"global minimum\" as 0, and then the calculation
+ of Skew is performed. And when the number of eligible
+ domains with matching topology keys equals or greater
+ than minDomains, this value has no effect on scheduling.
+ As a result, when the number of eligible domains is less
+ than minDomains, scheduler won't schedule more than maxSkew
+ Pods to those domains. If value is nil, the constraint
+ behaves as if MinDomains is equal to 1. Valid values are
+ integers greater than 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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
+ 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 scheduled to any of the three zones,
+ it will violate MaxSkew. \n This is a beta field and requires
+ the MinDomainsInPodTopologySpread feature gate to be enabled
+ (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how we will treat
+ Pod's nodeAffinity/nodeSelector when calculating pod topology
+ spread skew. Options are: - Honor: only nodes matching
+ nodeAffinity/nodeSelector are included in the calculations.
+ - Ignore: nodeAffinity/nodeSelector are ignored. All nodes
+ are included in the calculations. \n If this value is
+ nil, the behavior is equivalent to the Honor policy. This
+ is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we will treat
+ node taints when calculating pod topology spread skew.
+ Options are: - Honor: nodes without taints, along with
+ tainted nodes for which the incoming pod has a toleration,
+ are included. - Ignore: node taints are ignored. All nodes
+ are included. \n If this value is nil, the behavior is
+ equivalent to the Ignore policy. This is a beta-level
+ feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology. We consider each
+ as a "bucket", and try to put balanced number
+ of pods into each bucket. We define a domain as a particular
+ instance of a topology. Also, we define an eligible domain
+ as a domain whose nodes meet the requirements of nodeAffinityPolicy
+ and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And, if TopologyKey
+ is "topology.kubernetes.io/zone", each zone is a domain
+ of that topology. It's a required field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how to deal with
+ a pod if it doesn''t satisfy the spread constraint. -
+ DoNotSchedule (default) tells the scheduler not to schedule
+ it. - ScheduleAnyway tells the scheduler to schedule the
+ pod in any location, but giving higher precedence to topologies
+ that would help reduce the skew. A constraint is considered
+ "Unsatisfiable" for an incoming pod if and only if every
+ possible node assignment for that pod would violate "MaxSkew"
+ on some topology. For example, in a 3-zone cluster, MaxSkew
+ is set to 1, 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, 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, the cluster can still be imbalanced, but
+ scheduler won''t make it *more* imbalanced. It''s a required
+ field.'
+ type: string
+ required:
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
+ type: object
+ type: array
type: object
services:
description: Defines the services to access a cluster.
@@ -6538,12 +8844,160 @@ spec:
description: 'user is the rados user name.
Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it'
type: string
- required:
- - image
- - monitors
+ required:
+ - image
+ - monitors
+ type: object
+ scaleIO:
+ description: scaleIO represents a ScaleIO persistent
+ volume attached and mounted on Kubernetes
+ nodes.
+ properties:
+ fsType:
+ description: fsType is the filesystem type
+ to mount. Must be a filesystem type supported
+ by the host operating system. Ex. "ext4",
+ "xfs", "ntfs". Default is "xfs".
+ type: string
+ gateway:
+ description: gateway is the host address
+ of the ScaleIO API Gateway.
+ type: string
+ protectionDomain:
+ description: protectionDomain is the name
+ of the ScaleIO Protection Domain for the
+ configured storage.
+ type: string
+ readOnly:
+ description: readOnly Defaults to false
+ (read/write). ReadOnly here will force
+ the ReadOnly setting in VolumeMounts.
+ type: boolean
+ secretRef:
+ description: secretRef references to the
+ secret for ScaleIO user and other sensitive
+ information. If this is not provided,
+ Login operation will fail.
+ properties:
+ name:
+ description: 'Name of the referent.
+ More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+ TODO: Add other useful fields. apiVersion,
+ kind, uid?'
+ type: string
+ type: object
+ x-kubernetes-map-type: atomic
+ sslEnabled:
+ description: sslEnabled Flag enable/disable
+ SSL communication with Gateway, default
+ false
+ type: boolean
+ storageMode:
+ description: storageMode indicates whether
+ the storage for a volume should be ThickProvisioned
+ or ThinProvisioned. Default is ThinProvisioned.
+ type: string
+ storagePool:
+ description: storagePool is the ScaleIO
+ Storage Pool associated with the protection
+ domain.
+ type: string
+ system:
+ description: system is the name of the storage
+ system as configured in ScaleIO.
+ type: string
+ volumeName:
+ description: volumeName is the name of a
+ volume already created in the ScaleIO
+ system that is associated with this volume
+ source.
+ type: string
+ required:
+ - gateway
+ - secretRef
+ - system
+ type: object
+ secret:
+ description: 'secret represents a secret that
+ should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ properties:
+ defaultMode:
+ description: 'defaultMode is Optional: mode
+ bits used to set permissions on created
+ files by default. Must be an octal value
+ between 0000 and 0777 or a decimal value
+ between 0 and 511. YAML accepts both octal
+ and decimal values, JSON requires decimal
+ values for mode bits. Defaults to 0644.
+ Directories within the path are not affected
+ by this setting. This might be in conflict
+ with other options that affect the file
+ mode, like fsGroup, and the result can
+ be other mode bits set.'
+ format: int32
+ type: integer
+ items:
+ description: items If unspecified, each
+ key-value pair in the Data field of the
+ referenced Secret will be projected into
+ the volume as a file whose name is the
+ key and content is the value. If specified,
+ the listed keys will be projected into
+ the specified paths, and unlisted keys
+ will not be present. If a key is specified
+ which is not present in the Secret, the
+ volume setup will error unless it is marked
+ optional. Paths must be relative and may
+ not contain the '..' path or start with
+ '..'.
+ items:
+ description: Maps a string key to a path
+ within a volume.
+ properties:
+ key:
+ description: key is the key to project.
+ type: string
+ mode:
+ description: 'mode is Optional: mode
+ bits used to set permissions on
+ this file. Must be an octal value
+ between 0000 and 0777 or a decimal
+ value between 0 and 511. YAML accepts
+ both octal and decimal values, JSON
+ requires decimal values for mode
+ bits. If not specified, the volume
+ defaultMode will be used. This might
+ be in conflict with other options
+ that affect the file mode, like
+ fsGroup, and the result can be other
+ mode bits set.'
+ format: int32
+ type: integer
+ path:
+ description: path is the relative
+ path of the file to map the key
+ to. May not be an absolute path.
+ May not contain the path element
+ '..'. May not start with the string
+ '..'.
+ type: string
+ required:
+ - key
+ - path
+ type: object
+ type: array
+ optional:
+ description: optional field specify whether
+ the Secret or its keys must be defined
+ type: boolean
+ secretName:
+ description: 'secretName is the name of
+ the secret in the pod''s namespace to
+ use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ type: string
type: object
- scaleIO:
- description: scaleIO represents a ScaleIO persistent
+ storageos:
+ description: storageOS represents a StorageOS
volume attached and mounted on Kubernetes
nodes.
properties:
@@ -6551,27 +9005,19 @@ spec:
description: fsType is the filesystem type
to mount. Must be a filesystem type supported
by the host operating system. Ex. "ext4",
- "xfs", "ntfs". Default is "xfs".
- type: string
- gateway:
- description: gateway is the host address
- of the ScaleIO API Gateway.
- type: string
- protectionDomain:
- description: protectionDomain is the name
- of the ScaleIO Protection Domain for the
- configured storage.
+ "xfs", "ntfs". Implicitly inferred to
+ be "ext4" if unspecified.
type: string
readOnly:
- description: readOnly Defaults to false
+ description: readOnly defaults to false
(read/write). ReadOnly here will force
the ReadOnly setting in VolumeMounts.
type: boolean
secretRef:
- description: secretRef references to the
- secret for ScaleIO user and other sensitive
- information. If this is not provided,
- Login operation will fail.
+ description: secretRef specifies the secret
+ to use for obtaining the StorageOS API
+ credentials. If not specified, default
+ values will be attempted.
properties:
name:
description: 'Name of the referent.
@@ -6581,320 +9027,1447 @@ spec:
type: string
type: object
x-kubernetes-map-type: atomic
- sslEnabled:
- description: sslEnabled Flag enable/disable
- SSL communication with Gateway, default
- false
- type: boolean
- storageMode:
- description: storageMode indicates whether
- the storage for a volume should be ThickProvisioned
- or ThinProvisioned. Default is ThinProvisioned.
+ volumeName:
+ description: volumeName is the human-readable
+ name of the StorageOS volume. Volume
+ names are only unique within a namespace.
type: string
- storagePool:
- description: storagePool is the ScaleIO
- Storage Pool associated with the protection
- domain.
+ volumeNamespace:
+ description: volumeNamespace specifies the
+ scope of the volume within StorageOS. If
+ no namespace is specified then the Pod's
+ namespace will be used. This allows the
+ Kubernetes name scoping to be mirrored
+ within StorageOS for tighter integration.
+ Set VolumeName to any name to override
+ the default behaviour. Set to "default"
+ if you are not using namespaces within
+ StorageOS. Namespaces that do not pre-exist
+ within StorageOS will be created.
type: string
- system:
- description: system is the name of the storage
- system as configured in ScaleIO.
+ type: object
+ vsphereVolume:
+ description: vsphereVolume represents a vSphere
+ volume attached and mounted on kubelets host
+ machine
+ properties:
+ fsType:
+ description: fsType is filesystem type to
+ mount. Must be a filesystem type supported
+ by the host operating system. Ex. "ext4",
+ "xfs", "ntfs". Implicitly inferred to
+ be "ext4" if unspecified.
type: string
- volumeName:
- description: volumeName is the name of a
- volume already created in the ScaleIO
- system that is associated with this volume
- source.
+ storagePolicyID:
+ description: storagePolicyID is the storage
+ Policy Based Management (SPBM) profile
+ ID associated with the StoragePolicyName.
+ type: string
+ storagePolicyName:
+ description: storagePolicyName is the storage
+ Policy Based Management (SPBM) profile
+ name.
+ type: string
+ volumePath:
+ description: volumePath is the path that
+ identifies vSphere volume vmdk
type: string
required:
- - gateway
- - secretRef
- - system
+ - volumePath
type: object
- secret:
- description: 'secret represents a secret that
- should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
+ required:
+ - name
+ type: object
+ type: array
+ required:
+ - name
+ type: object
+ type: array
+ issuer:
+ description: Defines provider context for TLS certs. Required
+ when TLS is enabled.
+ properties:
+ name:
+ allOf:
+ - enum:
+ - KubeBlocks
+ - UserProvided
+ - enum:
+ - KubeBlocks
+ - UserProvided
+ default: KubeBlocks
+ description: The issuer for TLS certificates.
+ type: string
+ secretRef:
+ description: SecretRef is the reference to the TLS certificates
+ secret. It is required when the issuer is set to UserProvided.
+ properties:
+ ca:
+ description: CA cert key in Secret
+ type: string
+ cert:
+ description: Cert key in Secret
+ type: string
+ key:
+ description: Key of TLS private key in Secret
+ type: string
+ name:
+ description: Name of the Secret
+ type: string
+ required:
+ - ca
+ - cert
+ - key
+ - name
+ type: object
+ required:
+ - name
+ type: object
+ monitor:
+ default: false
+ description: To enable monitoring.
+ type: boolean
+ name:
+ description: "Specifies the name of the cluster's component.
+ This name is also part of the Service DNS name and must
+ comply with the IANA Service Naming rule. When ClusterComponentSpec
+ is referenced as a template, the name is optional. Otherwise,
+ it is required. \n TODO +kubebuilder:validation:XValidation:rule=\"self
+ == oldSelf\",message=\"name is immutable\""
+ maxLength: 22
+ pattern: ^[a-z]([a-z0-9\-]*[a-z0-9])?$
+ type: string
+ offlineInstances:
+ description: Specifies instances to be scaled in with dedicated
+ names in the list.
+ items:
+ type: string
+ type: array
+ replicas:
+ default: 1
+ description: Specifies the number of component replicas.
+ format: int32
+ minimum: 0
+ type: integer
+ resources:
+ description: Specifies the resources requests and limits
+ of the workload.
+ properties:
+ claims:
+ description: "Claims lists the names of resources, defined
+ in spec.resourceClaims, that are used by this container.
+ \n This is an alpha field and requires enabling the
+ DynamicResourceAllocation feature gate. \n This field
+ is immutable. It can only be set for containers."
+ items:
+ description: ResourceClaim references one entry in
+ PodSpec.ResourceClaims.
+ properties:
+ name:
+ description: Name must match the name of one entry
+ in pod.spec.resourceClaims of the Pod where
+ this field is used. It makes that resource available
+ inside a container.
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Limits describes the maximum amount of
+ compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ description: 'Requests describes the minimum amount
+ of compute resources required. If Requests is omitted
+ for a container, it defaults to Limits if that is
+ explicitly specified, otherwise to an implementation-defined
+ value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ type: object
+ type: object
+ x-kubernetes-preserve-unknown-fields: true
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the component.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling
+ constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling
+ rules for the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling
+ term matches all objects with implicit weight
+ 0 (i.e. it's a no-op). A null preferred
+ scheduling term matches no objects (i.e.
+ is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated
+ with the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector
+ requirements by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector
+ requirements by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching
+ the corresponding nodeSelectorTerm,
+ in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
properties:
- defaultMode:
- description: 'defaultMode is Optional: mode
- bits used to set permissions on created
- files by default. Must be an octal value
- between 0000 and 0777 or a decimal value
- between 0 and 511. YAML accepts both octal
- and decimal values, JSON requires decimal
- values for mode bits. Defaults to 0644.
- Directories within the path are not affected
- by this setting. This might be in conflict
- with other options that affect the file
- mode, like fsGroup, and the result can
- be other mode bits set.'
- format: int32
- type: integer
- items:
- description: items If unspecified, each
- key-value pair in the Data field of the
- referenced Secret will be projected into
- the volume as a file whose name is the
- key and content is the value. If specified,
- the listed keys will be projected into
- the specified paths, and unlisted keys
- will not be present. If a key is specified
- which is not present in the Secret, the
- volume setup will error unless it is marked
- optional. Paths must be relative and may
- not contain the '..' path or start with
- '..'.
+ nodeSelectorTerms:
+ description: Required. A list of node selector
+ terms. The terms are ORed.
items:
- description: Maps a string key to a path
- within a volume.
+ description: 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.
properties:
- key:
- description: key is the key to project.
+ matchExpressions:
+ description: A list of node selector
+ requirements by node's labels.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector
+ requirements by node's fields.
+ items:
+ description: A node selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: The label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's
+ relationship to a set of values.
+ Valid operators are In, NotIn,
+ Exists, DoesNotExist. Gt,
+ and Lt.
+ type: string
+ values:
+ description: An array of string
+ values. If the operator is
+ In or NotIn, the values array
+ must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty.
+ If the operator is Gt or Lt,
+ the values array must have
+ a single element, which will
+ be interpreted as an integer.
+ This array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules
+ (e.g. co-locate this pod in the same node, zone,
+ etc. as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added
+ per-node to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity
+ term, associated with the corresponding
+ weight.
+ properties:
+ labelSelector:
+ description: A label query over a
+ set of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the
+ set of namespaces that the term
+ applies to. The term is applied
+ to the union of the namespaces selected
+ by this field and the ones listed
+ in the namespaces field. null selector
+ and null or empty namespaces list
+ means "this pod's namespace". An
+ empty selector ({}) matches all
+ namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies
+ a static list of namespace names
+ that the term applies to. The term
+ is applied to the union of the namespaces
+ listed in this field and the ones
+ selected by namespaceSelector. null
+ or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
type: string
- mode:
- description: 'mode is Optional: mode
- bits used to set permissions on
- this file. Must be an octal value
- between 0000 and 0777 or a decimal
- value between 0 and 511. YAML accepts
- both octal and decimal values, JSON
- requires decimal values for mode
- bits. If not specified, the volume
- defaultMode will be used. This might
- be in conflict with other options
- that affect the file mode, like
- fsGroup, and the result can be other
- mode bits set.'
- format: int32
- type: integer
- path:
- description: path is the relative
- path of the file to map the key
- to. May not be an absolute path.
- May not contain the path element
- '..'. May not start with the string
- '..'.
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in
+ the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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 matches
+ that of any node on which a pod of the set
+ of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling
+ rules (e.g. avoid putting this pod in the same
+ node, zone, etc. as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule
+ pods to nodes that satisfy the anti-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 anti-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.
+ items:
+ description: The weights of all of the matched
+ WeightedPodAffinityTerm fields are added
+ per-node to find the most preferred node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity
+ term, associated with the corresponding
+ weight.
+ properties:
+ labelSelector:
+ description: A label query over a
+ set of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the
+ set of namespaces that the term
+ applies to. The term is applied
+ to the union of the namespaces selected
+ by this field and the ones listed
+ in the namespaces field. null selector
+ and null or empty namespaces list
+ means "this pod's namespace". An
+ empty selector ({}) matches all
+ namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions
+ is a list of label selector
+ requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector
+ requirement is a selector
+ that contains values, a key,
+ and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the
+ label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to
+ a set of values. Valid
+ operators are In, NotIn,
+ Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an
+ array of string values.
+ If the operator is In
+ or NotIn, the values array
+ must be non-empty. If
+ the operator is Exists
+ or DoesNotExist, the values
+ array must be empty. This
+ array is replaced during
+ a strategic merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies
+ a static list of namespace names
+ that the term applies to. The term
+ is applied to the union of the namespaces
+ listed in this field and the ones
+ selected by namespaceSelector. null
+ or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
type: string
required:
- - key
- - path
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching
+ the corresponding podAffinityTerm, in
+ the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements
+ specified by this field are not met at scheduling
+ time, the pod will not be scheduled onto the
+ node. If the anti-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.
+ items:
+ description: 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 matches
+ that of any node on which a pod of the set
+ of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set
+ of resources, in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set
+ of namespaces that the term applies
+ to. The term is applied to the union
+ of the namespaces selected by this field
+ and the ones listed in the namespaces
+ field. null selector and null or empty
+ namespaces list means "this pod's namespace".
+ An empty selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a
+ list of label selector requirements.
+ The requirements are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label
+ key that the selector applies
+ to.
+ type: string
+ operator:
+ description: operator represents
+ a key's relationship to a
+ set of values. Valid operators
+ are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array
+ of string values. If the operator
+ is In or NotIn, the values
+ array must be non-empty. If
+ the operator is Exists or
+ DoesNotExist, the values array
+ must be empty. This array
+ is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
type: object
- type: array
- optional:
- description: optional field specify whether
- the Secret or its keys must be defined
- type: boolean
- secretName:
- description: 'secretName is the name of
- the secret in the pod''s namespace to
- use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret'
- type: string
- type: object
- storageos:
- description: storageOS represents a StorageOS
- volume attached and mounted on Kubernetes
- nodes.
- properties:
- fsType:
- description: fsType is the filesystem type
- to mount. Must be a filesystem type supported
- by the host operating system. Ex. "ext4",
- "xfs", "ntfs". Implicitly inferred to
- be "ext4" if unspecified.
- type: string
- readOnly:
- description: readOnly defaults to false
- (read/write). ReadOnly here will force
- the ReadOnly setting in VolumeMounts.
- type: boolean
- secretRef:
- description: secretRef specifies the secret
- to use for obtaining the StorageOS API
- credentials. If not specified, default
- values will be attempted.
- properties:
- name:
- description: 'Name of the referent.
- More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
- TODO: Add other useful fields. apiVersion,
- kind, uid?'
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static
+ list of namespace names that the term
+ applies to. The term is applied to the
+ union of the namespaces listed in this
+ field and the ones selected by namespaceSelector.
+ null or empty namespaces list and null
+ namespaceSelector means "this pod's
+ namespace".
+ items:
type: string
- type: object
- x-kubernetes-map-type: atomic
- volumeName:
- description: volumeName is the human-readable
- name of the StorageOS volume. Volume
- names are only unique within a namespace.
- type: string
- volumeNamespace:
- description: volumeNamespace specifies the
- scope of the volume within StorageOS. If
- no namespace is specified then the Pod's
- namespace will be used. This allows the
- Kubernetes name scoping to be mirrored
- within StorageOS for tighter integration.
- Set VolumeName to any name to override
- the default behaviour. Set to "default"
- if you are not using namespaces within
- StorageOS. Namespaces that do not pre-exist
- within StorageOS will be created.
- type: string
- type: object
- vsphereVolume:
- description: vsphereVolume represents a vSphere
- volume attached and mounted on kubelets host
- machine
- properties:
- fsType:
- description: fsType is filesystem type to
- mount. Must be a filesystem type supported
- by the host operating system. Ex. "ext4",
- "xfs", "ntfs". Implicitly inferred to
- be "ext4" if unspecified.
- type: string
- storagePolicyID:
- description: storagePolicyID is the storage
- Policy Based Management (SPBM) profile
- ID associated with the StoragePolicyName.
- type: string
- storagePolicyName:
- description: storagePolicyName is the storage
- Policy Based Management (SPBM) profile
- name.
- type: string
- volumePath:
- description: volumePath is the path that
- identifies vSphere volume vmdk
- type: string
- required:
- - volumePath
- type: object
- required:
- - name
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
type: object
- type: array
- required:
- - name
- type: object
- type: array
- issuer:
- description: Defines provider context for TLS certs. Required
- when TLS is enabled.
- properties:
- name:
- allOf:
- - enum:
- - KubeBlocks
- - UserProvided
- - enum:
- - KubeBlocks
- - UserProvided
- default: KubeBlocks
- description: The issuer for TLS certificates.
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this
+ pod onto a specific node. If it is non-empty, the
+ scheduler simply schedules this pod onto that node,
+ assuming that it fits resource requirements.
type: string
- secretRef:
- description: SecretRef is the reference to the TLS certificates
- secret. It is required when the issuer is set to UserProvided.
- properties:
- ca:
- description: CA cert key in Secret
- type: string
- cert:
- description: Cert key in Secret
- type: string
- key:
- description: Key of TLS private key in Secret
- type: string
- name:
- description: Name of the Secret
- type: string
- required:
- - ca
- - cert
- - key
- - name
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must
+ be true for the pod to fit on a node. Selector which
+ must match a node''s labels for the pod to be scheduled
+ on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
type: object
- required:
- - name
- type: object
- monitor:
- default: false
- description: To enable monitoring.
- type: boolean
- name:
- description: "Specifies the name of the cluster's component.
- This name is also part of the Service DNS name and must
- comply with the IANA Service Naming rule. When ClusterComponentSpec
- is referenced as a template, the name is optional. Otherwise,
- it is required. \n TODO +kubebuilder:validation:XValidation:rule=\"self
- == oldSelf\",message=\"name is immutable\""
- maxLength: 22
- pattern: ^[a-z]([a-z0-9\-]*[a-z0-9])?$
- type: string
- offlineInstances:
- description: Specifies instances to be scaled in with dedicated
- names in the list.
- items:
- type: string
- type: array
- replicas:
- default: 1
- description: Specifies the number of component replicas.
- format: int32
- minimum: 0
- type: integer
- resources:
- description: Specifies the resources requests and limits
- of the workload.
- properties:
- claims:
- description: "Claims lists the names of resources, defined
- in spec.resourceClaims, that are used by this container.
- \n This is an alpha field and requires enabling the
- DynamicResourceAllocation feature gate. \n This field
- is immutable. It can only be set for containers."
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched
+ by specified scheduler. If not specified, the pod
+ will be dispatched by default scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches
+ the triple `key,value,effect` using the matching operator
+ `operator`.
items:
- description: ResourceClaim references one entry in
- PodSpec.ResourceClaims.
+ description: The pod this Toleration is attached to
+ tolerates any taint that matches the triple
+ using the matching operator .
properties:
- name:
- description: Name must match the name of one entry
- in pod.spec.resourceClaims of the Pod where
- this field is used. It makes that resource available
- inside a container.
+ effect:
+ description: Effect indicates the taint effect
+ to match. Empty means match all taint effects.
+ When specified, allowed values are NoSchedule,
+ PreferNoSchedule and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration
+ applies to. Empty means match all taint keys.
+ If the key is empty, operator must be Exists;
+ this combination means to match all values and
+ all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship
+ to the value. Valid operators are Exists and
+ Equal. Defaults to Equal. Exists is equivalent
+ to wildcard for value, so that a pod can tolerate
+ all taints of a particular category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the
+ period of time the toleration (which must be
+ of effect NoExecute, otherwise this field is
+ ignored) tolerates the taint. By default, it
+ is not set, which means tolerate the taint forever
+ (do not evict). Zero and negative values will
+ be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration
+ matches to. If the operator is Exists, the value
+ should be empty, otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how
+ a group of pods ought to spread across topology domains.
+ Scheduler will schedule pods in a way which abides
+ by the constraints. All topologySpreadConstraints
+ are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how
+ to spread matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching
+ pods. Pods that match this label selector are
+ counted to determine the number of pods in their
+ corresponding topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of
+ label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a
+ key, and an operator that relates the
+ key and values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label
+ keys to select the pods over which spreading
+ will be calculated. The keys are used to lookup
+ values from the incoming pod labels, those key-value
+ labels are ANDed with labelSelector to select
+ the group of existing pods over which spreading
+ will be calculated for the incoming pod. The
+ same key is forbidden to exist in both MatchLabelKeys
+ and LabelSelector. MatchLabelKeys cannot be
+ set when LabelSelector isn't set. Keys that
+ don't exist in the incoming pod labels will
+ be ignored. A null or empty list means only
+ match against labelSelector. \n This is a beta
+ field and requires the MatchLabelKeysInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to
+ which pods may be unevenly distributed. When
+ `whenUnsatisfiable=DoNotSchedule`, it is the
+ maximum permitted difference between the number
+ of matching pods in the target topology and
+ the global minimum. The global minimum is the
+ minimum number of matching pods in an eligible
+ domain or zero if the number of eligible domains
+ is less than 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 this
+ case, the global minimum is 1. | zone1 | zone2
+ | zone3 | | P P | P P | P | - if MaxSkew
+ is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming
+ pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies
+ that satisfy it. It''s a required field. Default
+ value is 1 and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number
+ of eligible domains. When the number of eligible
+ domains with matching topology keys is less
+ than minDomains, Pod Topology Spread treats
+ \"global minimum\" as 0, and then the calculation
+ of Skew is performed. And when the number of
+ eligible domains with matching topology keys
+ equals or greater than minDomains, this value
+ has no effect on scheduling. As a result, when
+ the number of eligible domains is less than
+ minDomains, scheduler won't schedule more than
+ maxSkew Pods to those domains. If value is nil,
+ the constraint behaves as if MinDomains is equal
+ to 1. Valid values are integers greater than
+ 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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 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 scheduled to any of the three zones,
+ it will violate MaxSkew. \n This is a beta field
+ and requires the MinDomainsInPodTopologySpread
+ feature gate to be enabled (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how
+ we will treat Pod's nodeAffinity/nodeSelector
+ when calculating pod topology spread skew. Options
+ are: - Honor: only nodes matching nodeAffinity/nodeSelector
+ are included in the calculations. - Ignore:
+ nodeAffinity/nodeSelector are ignored. All nodes
+ are included in the calculations. \n If this
+ value is nil, the behavior is equivalent to
+ the Honor policy. This is a beta-level feature
+ default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we
+ will treat node taints when calculating pod
+ topology spread skew. Options are: - Honor:
+ nodes without taints, along with tainted nodes
+ for which the incoming pod has a toleration,
+ are included. - Ignore: node taints are ignored.
+ All nodes are included. \n If this value is
+ nil, the behavior is equivalent to the Ignore
+ policy. This is a beta-level feature default
+ enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology.
+ We consider each as a "bucket",
+ and try to put balanced number of pods into
+ each bucket. We define a domain as a particular
+ instance of a topology. Also, we define an eligible
+ domain as a domain whose nodes meet the requirements
+ of nodeAffinityPolicy and nodeTaintsPolicy.
+ e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And,
+ if TopologyKey is "topology.kubernetes.io/zone",
+ each zone is a domain of that topology. It's
+ a required field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how
+ to deal with a pod if it doesn''t satisfy the
+ spread constraint. - DoNotSchedule (default)
+ tells the scheduler not to schedule it. - ScheduleAnyway
+ tells the scheduler to schedule the pod in any
+ location, but giving higher precedence to topologies
+ that would help reduce the skew. A constraint
+ is considered "Unsatisfiable" for an incoming
+ pod if and only if every possible node assignment
+ for that pod would violate "MaxSkew" on some
+ topology. For example, in a 3-zone cluster,
+ MaxSkew is set to 1, 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, 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, the cluster can
+ still be imbalanced, but scheduler won''t make
+ it *more* imbalanced. It''s a required field.'
type: string
required:
- - name
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
type: object
type: array
- x-kubernetes-list-map-keys:
- - name
- x-kubernetes-list-type: map
- limits:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Limits describes the maximum amount of
- compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
- requests:
- additionalProperties:
- anyOf:
- - type: integer
- - type: string
- pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
- x-kubernetes-int-or-string: true
- description: 'Requests describes the minimum amount
- of compute resources required. If Requests is omitted
- for a container, it defaults to Limits if that is
- explicitly specified, otherwise to an implementation-defined
- value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
- type: object
type: object
- x-kubernetes-preserve-unknown-fields: true
serviceAccountName:
description: Specifies the name of the ServiceAccount that
the running component depends on.
diff --git a/deploy/helm/crds/apps.kubeblocks.io_components.yaml b/deploy/helm/crds/apps.kubeblocks.io_components.yaml
index aa891e58560..8b78c9cd7ff 100644
--- a/deploy/helm/crds/apps.kubeblocks.io_components.yaml
+++ b/deploy/helm/crds/apps.kubeblocks.io_components.yaml
@@ -57,8 +57,8 @@ spec:
description: ComponentSpec defines the desired state of Component
properties:
affinity:
- description: Specifies the scheduling constraints for the component's
- workload. If specified, it will override the cluster-wide affinity.
+ description: Specifies the scheduling constraints for the component.
+ If specified, it will override the cluster-wide affinity.
properties:
nodeLabels:
additionalProperties:
@@ -2693,6 +2693,1121 @@ spec:
type: object
type: object
x-kubernetes-preserve-unknown-fields: true
+ schedulingPolicy:
+ description: Specifies the scheduling policy for the component.
+ properties:
+ affinity:
+ description: If specified, the cluster's scheduling constraints.
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for
+ the pod.
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: An empty preferred scheduling term matches
+ all objects with implicit weight 0 (i.e. it's a no-op).
+ A null preferred scheduling term matches no objects
+ (i.e. is also a no-op).
+ properties:
+ preference:
+ description: A node selector term, associated with
+ the corresponding weight.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ weight:
+ description: Weight associated with matching the
+ corresponding nodeSelectorTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms.
+ The terms are ORed.
+ items:
+ description: 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.
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements
+ by node's labels.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ description: A list of node selector requirements
+ by node's fields.
+ items:
+ description: A node selector requirement is
+ a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: The label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship
+ to a set of values. Valid operators
+ are In, NotIn, Exists, DoesNotExist.
+ Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values.
+ If the operator is In or NotIn, the
+ values array must be non-empty. If the
+ operator is Exists or DoesNotExist,
+ the values array must be empty. If the
+ operator is Gt or Lt, the values array
+ must have a single element, which will
+ be interpreted as an integer. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ x-kubernetes-map-type: atomic
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ x-kubernetes-map-type: atomic
+ type: object
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g.
+ co-locate this pod in the same node, zone, etc. as some
+ other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: 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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules
+ (e.g. avoid putting this pod in the same node, zone, etc.
+ as some other pod(s)).
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods
+ to nodes that satisfy the anti-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
+ anti-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.
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm
+ fields are added per-node to find the most preferred
+ node(s)
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated
+ with the corresponding weight.
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by
+ this field and the ones listed in the namespaces
+ field. null selector and null or empty namespaces
+ list means "this pod's namespace". An empty
+ selector ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list
+ of label selector requirements. The requirements
+ are ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values,
+ a key, and an operator that relates
+ the key and values.
+ properties:
+ key:
+ description: key is the label key
+ that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a
+ key's relationship to a set of values.
+ Valid operators are In, NotIn, Exists
+ and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of
+ string values. If the operator is
+ In or NotIn, the values array must
+ be non-empty. If the operator is
+ Exists or DoesNotExist, the values
+ array must be empty. This array
+ is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to.
+ The term is applied to the union of the namespaces
+ listed in this field and the ones selected
+ by namespaceSelector. null or empty namespaces
+ list and null namespaceSelector means "this
+ pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ description: weight associated with matching the
+ corresponding podAffinityTerm, in the range 1-100.
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified
+ by this field are not met at scheduling time, the pod
+ will not be scheduled onto the node. If the anti-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.
+ items:
+ description: 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 matches that of any node
+ on which a pod of the set of pods is running
+ properties:
+ labelSelector:
+ description: A label query over a set of resources,
+ in this case pods.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaceSelector:
+ description: A label query over the set of namespaces
+ that the term applies to. The term is applied
+ to the union of the namespaces selected by this
+ field and the ones listed in the namespaces field.
+ null selector and null or empty namespaces list
+ means "this pod's namespace". An empty selector
+ ({}) matches all namespaces.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label
+ selector requirements. The requirements are
+ ANDed.
+ items:
+ description: A label selector requirement
+ is a selector that contains values, a key,
+ and an operator that relates the key and
+ values.
+ properties:
+ key:
+ description: key is the label key that
+ the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's
+ relationship to a set of values. Valid
+ operators are In, NotIn, Exists and
+ DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string
+ values. If the operator is In or NotIn,
+ the values array must be non-empty.
+ If the operator is Exists or DoesNotExist,
+ the values array must be empty. This
+ array is replaced during a strategic
+ merge patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ namespaces:
+ description: namespaces specifies a static list
+ of namespace names that the term applies to. The
+ term is applied to the union of the namespaces
+ listed in this field and the ones selected by
+ namespaceSelector. null or empty namespaces list
+ and null namespaceSelector means "this pod's namespace".
+ items:
+ type: string
+ type: array
+ topologyKey:
+ description: 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.
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ nodeName:
+ description: NodeName is a request to schedule this pod onto a
+ specific node. If it is non-empty, the scheduler simply schedules
+ this pod onto that node, assuming that it fits resource requirements.
+ type: string
+ nodeSelector:
+ additionalProperties:
+ type: string
+ description: 'NodeSelector is a selector which must be true for
+ the pod to fit on a node. Selector which must match a node''s
+ labels for the pod to be scheduled on that node. More info:
+ https://kubernetes.io/docs/concepts/configuration/assign-pod-node/'
+ type: object
+ x-kubernetes-map-type: atomic
+ schedulerName:
+ description: If specified, the pod will be dispatched by specified
+ scheduler. If not specified, the pod will be dispatched by default
+ scheduler.
+ type: string
+ tolerations:
+ description: Attached to tolerate any taint that matches the triple
+ `key,value,effect` using the matching operator `operator`.
+ items:
+ description: The pod this Toleration is attached to tolerates
+ any taint that matches the triple using
+ the matching operator .
+ properties:
+ effect:
+ description: Effect indicates the taint effect to match.
+ Empty means match all taint effects. When specified, allowed
+ values are NoSchedule, PreferNoSchedule and NoExecute.
+ type: string
+ key:
+ description: Key is the taint key that the toleration applies
+ to. Empty means match all taint keys. If the key is empty,
+ operator must be Exists; this combination means to match
+ all values and all keys.
+ type: string
+ operator:
+ description: Operator represents a key's relationship to
+ the value. Valid operators are Exists and Equal. Defaults
+ to Equal. Exists is equivalent to wildcard for value,
+ so that a pod can tolerate all taints of a particular
+ category.
+ type: string
+ tolerationSeconds:
+ description: TolerationSeconds represents the period of
+ time the toleration (which must be of effect NoExecute,
+ otherwise this field is ignored) tolerates the taint.
+ By default, it is not set, which means tolerate the taint
+ forever (do not evict). Zero and negative values will
+ be treated as 0 (evict immediately) by the system.
+ format: int64
+ type: integer
+ value:
+ description: Value is the taint value the toleration matches
+ to. If the operator is Exists, the value should be empty,
+ otherwise just a regular string.
+ type: string
+ type: object
+ type: array
+ topologySpreadConstraints:
+ description: TopologySpreadConstraints describes how a group of
+ pods ought to spread across topology domains. Scheduler will
+ schedule pods in a way which abides by the constraints. All
+ topologySpreadConstraints are ANDed.
+ items:
+ description: TopologySpreadConstraint specifies how to spread
+ matching pods among the given topology.
+ properties:
+ labelSelector:
+ description: LabelSelector is used to find matching pods.
+ Pods that match this label selector are counted to determine
+ the number of pods in their corresponding topology domain.
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector
+ requirements. The requirements are ANDed.
+ items:
+ description: A label selector requirement is a selector
+ that contains values, a key, and an operator that
+ relates the key and values.
+ properties:
+ key:
+ description: key is the label key that the selector
+ applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship
+ to a set of values. Valid operators are In,
+ NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values.
+ If the operator is In or NotIn, the values array
+ must be non-empty. If the operator is Exists
+ or DoesNotExist, the values array must be empty.
+ This array is replaced during a strategic merge
+ patch.
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ description: 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.
+ type: object
+ type: object
+ x-kubernetes-map-type: atomic
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label keys
+ to select the pods over which spreading will be calculated.
+ The keys are used to lookup values from the incoming pod
+ labels, those key-value labels are ANDed with labelSelector
+ to select the group of existing pods over which spreading
+ will be calculated for the incoming pod. The same key
+ is forbidden to exist in both MatchLabelKeys and LabelSelector.
+ MatchLabelKeys cannot be set when LabelSelector isn't
+ set. Keys that don't exist in the incoming pod labels
+ will be ignored. A null or empty list means only match
+ against labelSelector. \n This is a beta field and requires
+ the MatchLabelKeysInPodTopologySpread feature gate to
+ be enabled (enabled by default)."
+ items:
+ type: string
+ type: array
+ x-kubernetes-list-type: atomic
+ maxSkew:
+ description: 'MaxSkew describes the degree to which pods
+ may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`,
+ it is the maximum permitted difference between the number
+ of matching pods in the target topology and the global
+ minimum. The global minimum is the minimum number of matching
+ pods in an eligible domain or zero if the number of eligible
+ domains is less than 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 this case, the global minimum is 1.
+ | zone1 | zone2 | zone3 | | P P | P P | P | -
+ if MaxSkew is 1, incoming pod can only be 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). - if MaxSkew is 2, incoming pod can be scheduled
+ onto any zone. When `whenUnsatisfiable=ScheduleAnyway`,
+ it is used to give higher precedence to topologies that
+ satisfy it. It''s a required field. Default value is 1
+ and 0 is not allowed.'
+ format: int32
+ type: integer
+ minDomains:
+ description: "MinDomains indicates a minimum number of eligible
+ domains. When the number of eligible domains with matching
+ topology keys is less than minDomains, Pod Topology Spread
+ treats \"global minimum\" as 0, and then the calculation
+ of Skew is performed. And when the number of eligible
+ domains with matching topology keys equals or greater
+ than minDomains, this value has no effect on scheduling.
+ As a result, when the number of eligible domains is less
+ than minDomains, scheduler won't schedule more than maxSkew
+ Pods to those domains. If value is nil, the constraint
+ behaves as if MinDomains is equal to 1. Valid values are
+ integers greater than 0. When value is not nil, WhenUnsatisfiable
+ must be DoNotSchedule. \n 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 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
+ 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 scheduled to any of the three zones,
+ it will violate MaxSkew. \n This is a beta field and requires
+ the MinDomainsInPodTopologySpread feature gate to be enabled
+ (enabled by default)."
+ format: int32
+ type: integer
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how we will treat
+ Pod's nodeAffinity/nodeSelector when calculating pod topology
+ spread skew. Options are: - Honor: only nodes matching
+ nodeAffinity/nodeSelector are included in the calculations.
+ - Ignore: nodeAffinity/nodeSelector are ignored. All nodes
+ are included in the calculations. \n If this value is
+ nil, the behavior is equivalent to the Honor policy. This
+ is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we will treat
+ node taints when calculating pod topology spread skew.
+ Options are: - Honor: nodes without taints, along with
+ tainted nodes for which the incoming pod has a toleration,
+ are included. - Ignore: node taints are ignored. All nodes
+ are included. \n If this value is nil, the behavior is
+ equivalent to the Ignore policy. This is a beta-level
+ feature default enabled by the NodeInclusionPolicyInPodTopologySpread
+ feature flag."
+ type: string
+ topologyKey:
+ description: 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 topology. We consider each
+ as a "bucket", and try to put balanced number
+ of pods into each bucket. We define a domain as a particular
+ instance of a topology. Also, we define an eligible domain
+ as a domain whose nodes meet the requirements of nodeAffinityPolicy
+ and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname",
+ each Node is a domain of that topology. And, if TopologyKey
+ is "topology.kubernetes.io/zone", each zone is a domain
+ of that topology. It's a required field.
+ type: string
+ whenUnsatisfiable:
+ description: 'WhenUnsatisfiable indicates how to deal with
+ a pod if it doesn''t satisfy the spread constraint. -
+ DoNotSchedule (default) tells the scheduler not to schedule
+ it. - ScheduleAnyway tells the scheduler to schedule the
+ pod in any location, but giving higher precedence to topologies
+ that would help reduce the skew. A constraint is considered
+ "Unsatisfiable" for an incoming pod if and only if every
+ possible node assignment for that pod would violate "MaxSkew"
+ on some topology. For example, in a 3-zone cluster, MaxSkew
+ is set to 1, 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, 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, the cluster can still be imbalanced, but
+ scheduler won''t make it *more* imbalanced. It''s a required
+ field.'
+ type: string
+ required:
+ - maxSkew
+ - topologyKey
+ - whenUnsatisfiable
+ type: object
+ type: array
+ type: object
serviceAccountName:
description: The name of the ServiceAccount that running component
depends on.
diff --git a/docs/developer_docs/api-reference/cluster.md b/docs/developer_docs/api-reference/cluster.md
index 74d4f0ce41b..a50aee3024e 100644
--- a/docs/developer_docs/api-reference/cluster.md
+++ b/docs/developer_docs/api-reference/cluster.md
@@ -345,6 +345,20 @@ Affinity
+schedulingPolicy
+
+
+SchedulingPolicy
+
+
+ |
+
+(Optional)
+ Specifies the scheduling policy for the cluster.
+ |
+
+
+
backup
@@ -924,7 +938,7 @@ Affinity
|
(Optional)
- Specifies the scheduling constraints for the component’s workload.
+ Specifies the scheduling constraints for the component.
If specified, it will override the cluster-wide affinity.
|
@@ -945,6 +959,20 @@ If specified, they will override the cluster-wide toleration settings.
+schedulingPolicy
+
+
+SchedulingPolicy
+
+
+ |
+
+(Optional)
+ Specifies the scheduling policy for the component.
+ |
+
+
+
tlsConfig
@@ -4188,6 +4216,20 @@ Affinity
|
+schedulingPolicy
+
+
+SchedulingPolicy
+
+
+ |
+
+(Optional)
+ Specifies the scheduling policy for the component.
+ |
+
+
+
resources
@@ -5419,6 +5461,20 @@ Affinity
|
+schedulingPolicy
+
+
+SchedulingPolicy
+
+
+ |
+
+(Optional)
+ Specifies the scheduling policy for the cluster.
+ |
+
+
+
backup
@@ -7524,7 +7580,7 @@ Affinity
|
(Optional)
- Specifies the scheduling constraints for the component’s workload.
+ Specifies the scheduling constraints for the component.
If specified, it will override the cluster-wide affinity.
|
@@ -7545,6 +7601,20 @@ If specified, they will override the cluster-wide toleration settings.
+schedulingPolicy
+
+
+SchedulingPolicy
+
+
+ |
+
+(Optional)
+ Specifies the scheduling policy for the component.
+ |
+
+
+
tlsConfig
@@ -15375,6 +15445,108 @@ Sample duration format:
|
+SchedulingPolicy
+
+
+(Appears on:ClusterComponentSpec, ClusterSpec, ComponentSpec)
+
+
+
+
+
+
+Field |
+Description |
+
+
+
+
+
+schedulerName
+
+string
+
+ |
+
+(Optional)
+ If specified, the pod will be dispatched by specified scheduler.
+If not specified, the pod will be dispatched by default scheduler.
+ |
+
+
+
+nodeSelector
+
+map[string]string
+
+ |
+
+(Optional)
+ NodeSelector is a selector which must be true for the pod to fit on a node.
+Selector which must match a node’s labels for the pod to be scheduled on that node.
+More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
+ |
+
+
+
+nodeName
+
+string
+
+ |
+
+(Optional)
+ NodeName is a request to schedule this pod onto a specific node. If it is non-empty,
+the scheduler simply schedules this pod onto that node, assuming that it fits resource
+requirements.
+ |
+
+
+
+affinity
+
+
+Kubernetes core/v1.Affinity
+
+
+ |
+
+(Optional)
+ If specified, the cluster’s scheduling constraints.
+ |
+
+
+
+tolerations
+
+
+[]Kubernetes core/v1.Toleration
+
+
+ |
+
+(Optional)
+ Attached to tolerate any taint that matches the triple key,value,effect using the matching operator operator .
+ |
+
+
+
+topologySpreadConstraints
+
+
+[]Kubernetes core/v1.TopologySpreadConstraint
+
+
+ |
+
+(Optional)
+ TopologySpreadConstraints describes how a group of pods ought to spread across topology
+domains. Scheduler will schedule pods in a way which abides by the constraints.
+All topologySpreadConstraints are ANDed.
+ |
+
+
+
ScriptFrom
diff --git a/pkg/controller/builder/builder_component.go b/pkg/controller/builder/builder_component.go
index 7c130492da2..f2796471f47 100644
--- a/pkg/controller/builder/builder_component.go
+++ b/pkg/controller/builder/builder_component.go
@@ -45,23 +45,8 @@ func (builder *ComponentBuilder) SetServiceVersion(serviceVersion string) *Compo
return builder
}
-func (builder *ComponentBuilder) SetAffinity(affinity *appsv1alpha1.Affinity) *ComponentBuilder {
- builder.get().Spec.Affinity = affinity
- return builder
-}
-
-func (builder *ComponentBuilder) SetToleration(toleration corev1.Toleration) *ComponentBuilder {
- tolerations := builder.get().Spec.Tolerations
- if len(tolerations) == 0 {
- tolerations = []corev1.Toleration{}
- }
- tolerations = append(tolerations, toleration)
- builder.get().Spec.Tolerations = tolerations
- return builder
-}
-
-func (builder *ComponentBuilder) SetTolerations(tolerations []corev1.Toleration) *ComponentBuilder {
- builder.get().Spec.Tolerations = tolerations
+func (builder *ComponentBuilder) SetSchedulingPolicy(schedulingPolicy *appsv1alpha1.SchedulingPolicy) *ComponentBuilder {
+ builder.get().Spec.SchedulingPolicy = schedulingPolicy
return builder
}
diff --git a/pkg/controller/component/component.go b/pkg/controller/component/component.go
index 18392c18ff5..a39b9421fb3 100644
--- a/pkg/controller/component/component.go
+++ b/pkg/controller/component/component.go
@@ -35,6 +35,7 @@ import (
"github.com/apecloud/kubeblocks/pkg/constant"
"github.com/apecloud/kubeblocks/pkg/controller/apiconversion"
"github.com/apecloud/kubeblocks/pkg/controller/builder"
+ "github.com/apecloud/kubeblocks/pkg/controller/scheduling"
intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
)
@@ -67,25 +68,23 @@ func IsGenerated(comp *appsv1alpha1.Component) bool {
func BuildComponent(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec,
labels, annotations map[string]string) (*appsv1alpha1.Component, error) {
compName := FullName(cluster.Name, compSpec.Name)
- affinities := BuildAffinity(cluster, compSpec)
- tolerations, err := BuildTolerations(cluster, compSpec)
- if err != nil {
- return nil, err
- }
compDefName := func() string {
if strings.HasPrefix(compSpec.ComponentDef, constant.KBGeneratedVirtualCompDefPrefix) {
return ""
}
return compSpec.ComponentDef
}
+ schedulingPolicy, err := scheduling.BuildSchedulingPolicy(cluster, compSpec)
+ if err != nil {
+ return nil, err
+ }
compBuilder := builder.NewComponentBuilder(cluster.Namespace, compName, compDefName()).
AddAnnotations(constant.KubeBlocksGenerationKey, strconv.FormatInt(cluster.Generation, 10)).
AddAnnotations(constant.KBAppMultiClusterPlacementKey, cluster.Annotations[constant.KBAppMultiClusterPlacementKey]).
AddLabelsInMap(constant.GetComponentWellKnownLabels(cluster.Name, compSpec.Name)).
AddLabels(constant.KBAppClusterUIDLabelKey, string(cluster.UID)).
SetServiceVersion(compSpec.ServiceVersion).
- SetAffinity(affinities).
- SetTolerations(tolerations).
+ SetSchedulingPolicy(schedulingPolicy).
SetReplicas(compSpec.Replicas).
SetResources(compSpec.Resources).
SetMonitor(compSpec.Monitor).
diff --git a/pkg/controller/component/synthesize_component.go b/pkg/controller/component/synthesize_component.go
index 560f01cb95f..aebbac67d52 100644
--- a/pkg/controller/component/synthesize_component.go
+++ b/pkg/controller/component/synthesize_component.go
@@ -21,6 +21,7 @@ package component
import (
"fmt"
+ "github.com/apecloud/kubeblocks/pkg/controller/scheduling"
"strconv"
"strings"
@@ -184,9 +185,9 @@ func buildSynthesizedComponent(reqCtx intctrlutil.RequestCtx,
buildCompatibleHorizontalScalePolicy(compDefObj, synthesizeComp)
}
- // build affinity and tolerations
- if err := buildAffinitiesAndTolerations(comp, synthesizeComp); err != nil {
- reqCtx.Log.Error(err, "build affinities and tolerations failed.")
+ // build scheduling policy for workload
+ if err = buildSchedulingPolicy(synthesizeComp, comp); err != nil {
+ reqCtx.Log.Error(err, "failed to build scheduling policy")
return nil, err
}
@@ -296,16 +297,24 @@ func buildLabelsAndAnnotations(compDef *appsv1alpha1.ComponentDefinition, comp *
}
}
-// buildAffinitiesAndTolerations builds affinities and tolerations for component.
-func buildAffinitiesAndTolerations(comp *appsv1alpha1.Component, synthesizeComp *SynthesizedComponent) error {
- podAffinity, err := BuildPodAffinity(synthesizeComp.ClusterName, synthesizeComp.Name, comp.Spec.Affinity)
- if err != nil {
- return err
+func buildSchedulingPolicy(synthesizedComp *SynthesizedComponent, comp *appsv1alpha1.Component) error {
+ var (
+ schedulingPolicy = comp.Spec.SchedulingPolicy
+ err error
+ )
+ if schedulingPolicy == nil {
+ schedulingPolicy, err = scheduling.BuildSchedulingPolicy4Component(synthesizedComp.ClusterName,
+ synthesizedComp.Name, comp.Spec.Affinity, comp.Spec.Tolerations)
+ if err != nil {
+ return err
+ }
}
- synthesizeComp.PodSpec.Affinity = podAffinity
- synthesizeComp.PodSpec.TopologySpreadConstraints =
- BuildPodTopologySpreadConstraints(synthesizeComp.ClusterName, synthesizeComp.Name, comp.Spec.Affinity)
- synthesizeComp.PodSpec.Tolerations = comp.Spec.Tolerations
+ synthesizedComp.PodSpec.SchedulerName = schedulingPolicy.SchedulerName
+ synthesizedComp.PodSpec.NodeSelector = schedulingPolicy.NodeSelector
+ synthesizedComp.PodSpec.NodeName = schedulingPolicy.NodeName
+ synthesizedComp.PodSpec.Affinity = schedulingPolicy.Affinity
+ synthesizedComp.PodSpec.Tolerations = schedulingPolicy.Tolerations
+ synthesizedComp.PodSpec.TopologySpreadConstraints = schedulingPolicy.TopologySpreadConstraints
return nil
}
diff --git a/pkg/controller/plan/restore.go b/pkg/controller/plan/restore.go
index bfeaa32d009..2d93d17c585 100644
--- a/pkg/controller/plan/restore.go
+++ b/pkg/controller/plan/restore.go
@@ -22,6 +22,7 @@ package plan
import (
"context"
"fmt"
+ "github.com/apecloud/kubeblocks/pkg/controller/scheduling"
"strings"
corev1 "k8s.io/api/core/v1"
@@ -261,18 +262,15 @@ func (r *RestoreManager) buildRequiredPolicy(sourceTarget *dpv1alpha1.BackupStat
}
func (r *RestoreManager) buildSchedulingSpec(comp *component.SynthesizedComponent) (dpv1alpha1.SchedulingSpec, error) {
- var err error
- schedulingSpec := dpv1alpha1.SchedulingSpec{}
- compSpec := r.Cluster.Spec.GetComponentByName(comp.Name)
- affinity := component.BuildAffinity(r.Cluster, compSpec)
- if schedulingSpec.Affinity, err = component.BuildPodAffinity(r.Cluster.Name, comp.Name, affinity); err != nil {
- return schedulingSpec, err
- }
- schedulingSpec.TopologySpreadConstraints = component.BuildPodTopologySpreadConstraints(r.Cluster.Name, comp.Name, affinity)
- if schedulingSpec.Tolerations, err = component.BuildTolerations(r.Cluster, compSpec); err != nil {
- return schedulingSpec, err
- }
- return schedulingSpec, nil
+ schedulingPolicy, err := scheduling.BuildSchedulingPolicy(r.Cluster, r.Cluster.Spec.GetComponentByName(comp.Name))
+ if err != nil {
+ return dpv1alpha1.SchedulingSpec{}, err
+ }
+ return dpv1alpha1.SchedulingSpec{
+ Affinity: schedulingPolicy.Affinity,
+ Tolerations: schedulingPolicy.Tolerations,
+ TopologySpreadConstraints: schedulingPolicy.TopologySpreadConstraints,
+ }, nil
}
func (r *RestoreManager) GetRestoreObjectMeta(comp *component.SynthesizedComponent, stage dpv1alpha1.RestoreStage) metav1.ObjectMeta {
diff --git a/pkg/controller/component/affinity_utils.go b/pkg/controller/scheduling/scheduling_utils.go
similarity index 63%
rename from pkg/controller/component/affinity_utils.go
rename to pkg/controller/scheduling/scheduling_utils.go
index 242539d6f62..01589312311 100644
--- a/pkg/controller/component/affinity_utils.go
+++ b/pkg/controller/scheduling/scheduling_utils.go
@@ -17,7 +17,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
-package component
+package scheduling
import (
"encoding/json"
@@ -31,8 +31,80 @@ import (
viper "github.com/apecloud/kubeblocks/pkg/viperx"
)
-// BuildAffinity builds affinities for components from cluster and comp spec.
-func BuildAffinity(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec) *appsv1alpha1.Affinity {
+func BuildSchedulingPolicy(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec) (*appsv1alpha1.SchedulingPolicy, error) {
+ if cluster.Spec.SchedulingPolicy != nil || (compSpec != nil && compSpec.SchedulingPolicy != nil) {
+ return buildSchedulingPolicy(cluster, compSpec)
+ }
+ return buildSchedulingPolicy4Legacy(cluster, compSpec)
+}
+
+func BuildSchedulingPolicy4Component(clusterName, compName string, affinity *appsv1alpha1.Affinity,
+ tolerations []corev1.Toleration) (*appsv1alpha1.SchedulingPolicy, error) {
+ return buildSchedulingPolicy4LegacyComponent(clusterName, compName, affinity, tolerations)
+}
+
+func buildSchedulingPolicy(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec) (*appsv1alpha1.SchedulingPolicy, error) {
+ schedulingPolicy := cluster.Spec.SchedulingPolicy
+ if compSpec != nil && compSpec.SchedulingPolicy != nil {
+ schedulingPolicy = compSpec.SchedulingPolicy
+ }
+
+ mergeGlobalAffinity := func() error {
+ affinity, err := buildClusterWideAffinity()
+ if err != nil {
+ return err
+ }
+ schedulingPolicy.Affinity = mergeAffinity(schedulingPolicy.Affinity, affinity)
+ return nil
+ }
+
+ mergeGlobalTolerations := func() error {
+ tolerations, err := buildClusterWideTolerations()
+ if err != nil {
+ return err
+ }
+ if len(tolerations) > 0 {
+ if len(schedulingPolicy.Tolerations) == 0 {
+ schedulingPolicy.Tolerations = tolerations
+ } else {
+ schedulingPolicy.Tolerations = append(schedulingPolicy.Tolerations, tolerations...)
+ }
+ }
+ return nil
+ }
+
+ if err := mergeGlobalAffinity(); err != nil {
+ return nil, err
+ }
+ if err := mergeGlobalTolerations(); err != nil {
+ return nil, err
+ }
+ return schedulingPolicy, nil
+}
+
+func buildSchedulingPolicy4Legacy(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec) (*appsv1alpha1.SchedulingPolicy, error) {
+ affinity := buildAffinity4Legacy(cluster, compSpec)
+ tolerations, err := buildTolerations4Legacy(cluster, compSpec)
+ if err != nil {
+ return nil, err
+ }
+ return buildSchedulingPolicy4LegacyComponent(cluster.Name, compSpec.Name, affinity, tolerations)
+}
+
+func buildSchedulingPolicy4LegacyComponent(clusterName, compName string, affinity *appsv1alpha1.Affinity,
+ tolerations []corev1.Toleration) (*appsv1alpha1.SchedulingPolicy, error) {
+ podAffinity, err := buildPodAffinity4Legacy(clusterName, compName, affinity)
+ if err != nil {
+ return nil, err
+ }
+ return &appsv1alpha1.SchedulingPolicy{
+ Affinity: podAffinity,
+ Tolerations: tolerations,
+ TopologySpreadConstraints: buildPodTopologySpreadConstraints4Legacy(clusterName, compName, affinity),
+ }, nil
+}
+
+func buildAffinity4Legacy(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec) *appsv1alpha1.Affinity {
var affinity *appsv1alpha1.Affinity
if cluster.Spec.Affinity != nil {
affinity = cluster.Spec.Affinity
@@ -43,23 +115,19 @@ func BuildAffinity(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.Cluster
return affinity
}
-// BuildTolerations builds tolerations for components from cluster and comp spec.
-func BuildTolerations(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec) ([]corev1.Toleration, error) {
+func buildTolerations4Legacy(cluster *appsv1alpha1.Cluster, compSpec *appsv1alpha1.ClusterComponentSpec) ([]corev1.Toleration, error) {
tolerations := cluster.Spec.Tolerations
if compSpec != nil && len(compSpec.Tolerations) != 0 {
tolerations = compSpec.Tolerations
}
- // build data plane tolerations from config
- var dpTolerations []corev1.Toleration
- if val := viper.GetString(constant.CfgKeyDataPlaneTolerations); val != "" {
- if err := json.Unmarshal([]byte(val), &dpTolerations); err != nil {
- return nil, err
- }
+ dpTolerations, err := buildClusterWideTolerations()
+ if err != nil {
+ return nil, err
}
return append(tolerations, dpTolerations...), nil
}
-func BuildPodTopologySpreadConstraints(clusterName, compName string, compAffinity *appsv1alpha1.Affinity) []corev1.TopologySpreadConstraint {
+func buildPodTopologySpreadConstraints4Legacy(clusterName, compName string, compAffinity *appsv1alpha1.Affinity) []corev1.TopologySpreadConstraint {
if compAffinity == nil {
return nil
}
@@ -88,20 +156,16 @@ func BuildPodTopologySpreadConstraints(clusterName, compName string, compAffinit
return topologySpreadConstraints
}
-func BuildPodAffinity(clusterName string, compName string, compAffinity *appsv1alpha1.Affinity) (*corev1.Affinity, error) {
- affinity := buildNewAffinity(clusterName, compName, compAffinity)
-
- // read data plane affinity from config and merge it
- dpAffinity := new(corev1.Affinity)
- if val := viper.GetString(constant.CfgKeyDataPlaneAffinity); val != "" {
- if err := json.Unmarshal([]byte(val), &dpAffinity); err != nil {
- return nil, err
- }
+func buildPodAffinity4Legacy(clusterName string, compName string, compAffinity *appsv1alpha1.Affinity) (*corev1.Affinity, error) {
+ affinity := buildNewAffinity4Legacy(clusterName, compName, compAffinity)
+ dpAffinity, err := buildClusterWideAffinity()
+ if err != nil {
+ return nil, err
}
- return mergeAffinity(affinity, dpAffinity)
+ return mergeAffinity(affinity, dpAffinity), nil
}
-func buildNewAffinity(clusterName, compName string, compAffinity *appsv1alpha1.Affinity) *corev1.Affinity {
+func buildNewAffinity4Legacy(clusterName, compName string, compAffinity *appsv1alpha1.Affinity) *corev1.Affinity {
if compAffinity == nil {
return nil
}
@@ -176,14 +240,37 @@ func buildNewAffinity(clusterName, compName string, compAffinity *appsv1alpha1.A
return affinity
}
+// buildClusterWideAffinity builds data plane affinity from global config
+func buildClusterWideAffinity() (*corev1.Affinity, error) {
+ affinity := new(corev1.Affinity)
+ if val := viper.GetString(constant.CfgKeyDataPlaneAffinity); val != "" {
+ if err := json.Unmarshal([]byte(val), &affinity); err != nil {
+ return nil, err
+ }
+ }
+ return affinity, nil
+}
+
+// buildClusterWideTolerations builds data plane tolerations from global config
+func buildClusterWideTolerations() ([]corev1.Toleration, error) {
+ // build data plane tolerations from config
+ var tolerations []corev1.Toleration
+ if val := viper.GetString(constant.CfgKeyDataPlaneTolerations); val != "" {
+ if err := json.Unmarshal([]byte(val), &tolerations); err != nil {
+ return nil, err
+ }
+ }
+ return tolerations, nil
+}
+
// mergeAffinity merges affinity from src to dest
-func mergeAffinity(dest, src *corev1.Affinity) (*corev1.Affinity, error) {
+func mergeAffinity(dest, src *corev1.Affinity) *corev1.Affinity {
if src == nil {
- return dest, nil
+ return dest
}
if dest == nil {
- return src.DeepCopy(), nil
+ return src.DeepCopy()
}
rst := dest.DeepCopy()
@@ -239,5 +326,5 @@ func mergeAffinity(dest, src *corev1.Affinity) (*corev1.Affinity, error) {
src.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms...)
}
}
- return rst, nil
+ return rst
}
diff --git a/pkg/controller/component/affinity_utils_test.go b/pkg/controller/scheduling/scheduling_utils_test.go
similarity index 86%
rename from pkg/controller/component/affinity_utils_test.go
rename to pkg/controller/scheduling/scheduling_utils_test.go
index 90c69103432..fc4a0695bcb 100644
--- a/pkg/controller/component/affinity_utils_test.go
+++ b/pkg/controller/scheduling/scheduling_utils_test.go
@@ -17,7 +17,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
-package component
+package scheduling
import (
"fmt"
@@ -29,6 +29,7 @@ import (
appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
"github.com/apecloud/kubeblocks/pkg/constant"
+ "github.com/apecloud/kubeblocks/pkg/controller/component"
intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
viper "github.com/apecloud/kubeblocks/pkg/viperx"
@@ -50,8 +51,8 @@ var _ = Describe("affinity utils", func() {
)
var (
- clusterObj *appsv1alpha1.Cluster
- component *SynthesizedComponent
+ clusterObj *appsv1alpha1.Cluster
+ synthesizedComp *component.SynthesizedComponent
buildObjs = func(podAntiAffinity appsv1alpha1.PodAntiAffinity) {
clusterDefObj := testapps.NewClusterDefFactory(clusterDefName).
@@ -87,7 +88,7 @@ var _ = Describe("affinity utils", func() {
Ctx: ctx,
Log: logger,
}
- component, _ = BuildSynthesizedComponentWrapper4Test(reqCtx, testCtx.Cli,
+ synthesizedComp, _ = component.BuildSynthesizedComponentWrapper4Test(reqCtx, testCtx.Cli,
clusterDefObj, clusterVersionObj, clusterObj, &clusterObj.Spec.ComponentSpecs[0])
}
)
@@ -95,18 +96,18 @@ var _ = Describe("affinity utils", func() {
Context("with PodAntiAffinity set to Required", func() {
BeforeEach(func() {
buildObjs(appsv1alpha1.Required)
- Expect(component).ShouldNot(BeNil())
+ Expect(synthesizedComp).ShouldNot(BeNil())
})
It("should have correct Affinity and TopologySpreadConstraints", func() {
- affinity, err := BuildPodAffinity(clusterObj.Name, component.Name, clusterObj.Spec.Affinity)
+ affinity, err := buildPodAffinity4Legacy(clusterObj.Name, synthesizedComp.Name, clusterObj.Spec.Affinity)
Expect(err).Should(Succeed())
Expect(affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions[0].Key).Should(Equal(labelKey))
Expect(affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].TopologyKey).Should(Equal(topologyKey))
Expect(affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution).Should(BeEmpty())
Expect(affinity.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution).Should(BeEmpty())
- topologySpreadConstraints := BuildPodTopologySpreadConstraints(clusterObj.Name, component.Name, clusterObj.Spec.Affinity)
+ topologySpreadConstraints := buildPodTopologySpreadConstraints4Legacy(clusterObj.Name, synthesizedComp.Name, clusterObj.Spec.Affinity)
Expect(topologySpreadConstraints[0].WhenUnsatisfiable).Should(Equal(corev1.DoNotSchedule))
Expect(topologySpreadConstraints[0].TopologyKey).Should(Equal(topologyKey))
})
@@ -116,14 +117,14 @@ var _ = Describe("affinity utils", func() {
fmt.Sprintf("{\"nodeAffinity\":{\"preferredDuringSchedulingIgnoredDuringExecution\":[{\"preference\":{\"matchExpressions\":[{\"key\":\"%s\",\"operator\":\"In\",\"values\":[\"true\"]}]},\"weight\":100}]}}", nodeKey))
defer viper.Set(constant.CfgKeyDataPlaneAffinity, "")
- affinity, err := BuildPodAffinity(clusterObj.Name, component.Name, clusterObj.Spec.Affinity)
+ affinity, err := buildPodAffinity4Legacy(clusterObj.Name, synthesizedComp.Name, clusterObj.Spec.Affinity)
Expect(err).Should(Succeed())
Expect(affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions[0].Key).Should(Equal(labelKey))
Expect(affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution[0].TopologyKey).Should(Equal(topologyKey))
Expect(affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution).Should(BeEmpty())
Expect(affinity.NodeAffinity.PreferredDuringSchedulingIgnoredDuringExecution[0].Preference.MatchExpressions[0].Key).Should(Equal(nodeKey))
- topologySpreadConstraints := BuildPodTopologySpreadConstraints(clusterObj.Name, component.Name, clusterObj.Spec.Affinity)
+ topologySpreadConstraints := buildPodTopologySpreadConstraints4Legacy(clusterObj.Name, synthesizedComp.Name, clusterObj.Spec.Affinity)
Expect(topologySpreadConstraints[0].WhenUnsatisfiable).Should(Equal(corev1.DoNotSchedule))
Expect(topologySpreadConstraints[0].TopologyKey).Should(Equal(topologyKey))
})
@@ -132,18 +133,18 @@ var _ = Describe("affinity utils", func() {
Context("with PodAntiAffinity set to Preferred", func() {
BeforeEach(func() {
buildObjs(appsv1alpha1.Preferred)
- Expect(component).ShouldNot(BeNil())
+ Expect(synthesizedComp).ShouldNot(BeNil())
})
It("should have correct Affinity and TopologySpreadConstraints", func() {
- affinity, err := BuildPodAffinity(clusterObj.Name, component.Name, clusterObj.Spec.Affinity)
+ affinity, err := buildPodAffinity4Legacy(clusterObj.Name, synthesizedComp.Name, clusterObj.Spec.Affinity)
Expect(err).Should(Succeed())
Expect(affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions[0].Key).Should(Equal(labelKey))
Expect(affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution).Should(BeEmpty())
Expect(affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution[0].Weight).ShouldNot(BeNil())
Expect(affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution[0].PodAffinityTerm.TopologyKey).Should(Equal(topologyKey))
- topologySpreadConstraints := BuildPodTopologySpreadConstraints(clusterObj.Name, component.Name, clusterObj.Spec.Affinity)
+ topologySpreadConstraints := buildPodTopologySpreadConstraints4Legacy(clusterObj.Name, synthesizedComp.Name, clusterObj.Spec.Affinity)
Expect(topologySpreadConstraints[0].WhenUnsatisfiable).Should(Equal(corev1.ScheduleAnyway))
Expect(topologySpreadConstraints[0].TopologyKey).Should(Equal(topologyKey))
})
diff --git a/pkg/controller/scheduling/suite_test.go b/pkg/controller/scheduling/suite_test.go
new file mode 100644
index 00000000000..7bc9d395007
--- /dev/null
+++ b/pkg/controller/scheduling/suite_test.go
@@ -0,0 +1,151 @@
+/*
+Copyright (C) 2022-2024 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+package scheduling
+
+import (
+ "context"
+ "path/filepath"
+ "testing"
+
+ . "github.com/onsi/ginkgo/v2"
+ . "github.com/onsi/gomega"
+
+ "github.com/go-logr/logr"
+ snapshotv1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1"
+ "go.uber.org/zap/zapcore"
+ "k8s.io/client-go/kubernetes/scheme"
+ "k8s.io/client-go/rest"
+ ctrl "sigs.k8s.io/controller-runtime"
+ "sigs.k8s.io/controller-runtime/pkg/client"
+ "sigs.k8s.io/controller-runtime/pkg/envtest"
+ logf "sigs.k8s.io/controller-runtime/pkg/log"
+ "sigs.k8s.io/controller-runtime/pkg/log/zap"
+ "sigs.k8s.io/controller-runtime/pkg/metrics/server"
+
+ appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+ appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+ dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+ "github.com/apecloud/kubeblocks/pkg/controller/model"
+ intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+ "github.com/apecloud/kubeblocks/pkg/testutil"
+ viper "github.com/apecloud/kubeblocks/pkg/viperx"
+)
+
+// These tests use Ginkgo (BDD-style Go testing framework). Refer to
+// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
+
+var cfg *rest.Config
+var k8sClient client.Client
+var graphCli model.GraphClient
+var testEnv *envtest.Environment
+var ctx context.Context
+var cancel context.CancelFunc
+var testCtx testutil.TestContext
+var logger logr.Logger
+
+func init() {
+ viper.AutomaticEnv()
+ model.AddScheme(appsv1alpha1.AddToScheme)
+ model.AddScheme(appsv1beta1.AddToScheme)
+ // viper.Set("ENABLE_DEBUG_LOG", "true")
+}
+
+func TestAPIs(t *testing.T) {
+ RegisterFailHandler(Fail)
+
+ RunSpecs(t, "Controller Suite")
+}
+
+var _ = BeforeSuite(func() {
+ if viper.GetBool("ENABLE_DEBUG_LOG") {
+ logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true), func(o *zap.Options) {
+ o.TimeEncoder = zapcore.ISO8601TimeEncoder
+ }))
+ }
+
+ ctx, cancel = context.WithCancel(context.TODO())
+ logger = logf.FromContext(ctx).WithValues()
+ logger.Info("logger start")
+
+ By("bootstrapping test environment")
+ testEnv = &envtest.Environment{
+ CRDDirectoryPaths: []string{
+ filepath.Join("..", "..", "..", "config", "crd", "bases"),
+ // use dependent external CRDs.
+ // resolved by ref: https://github.com/operator-framework/operator-sdk/issues/4434#issuecomment-786794418
+ // filepath.Join(build.Default.GOPATH, "pkg", "mod", "github.com", "kubernetes-csi/external-snapshotter/",
+ // "client/v6@v6.2.0", "config", "crd"),
+ },
+ ErrorIfCRDPathMissing: true,
+ }
+
+ var err error
+ // cfg is defined in this file globally.
+ cfg, err = testEnv.Start()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(cfg).NotTo(BeNil())
+
+ err = appsv1alpha1.AddToScheme(scheme.Scheme)
+ Expect(err).NotTo(HaveOccurred())
+
+ err = appsv1beta1.AddToScheme(scheme.Scheme)
+ Expect(err).NotTo(HaveOccurred())
+
+ err = dpv1alpha1.AddToScheme(scheme.Scheme)
+ Expect(err).NotTo(HaveOccurred())
+
+ err = snapshotv1.AddToScheme(scheme.Scheme)
+ Expect(err).NotTo(HaveOccurred())
+
+ // +kubebuilder:scaffold:scheme
+
+ k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
+ Expect(err).NotTo(HaveOccurred())
+ Expect(k8sClient).NotTo(BeNil())
+
+ graphCli = model.NewGraphClient(k8sClient)
+
+ // run reconcile
+ k8sManager, err := ctrl.NewManager(cfg, ctrl.Options{
+ Scheme: scheme.Scheme,
+ Metrics: server.Options{BindAddress: "0"},
+ Client: client.Options{
+ Cache: &client.CacheOptions{
+ DisableFor: intctrlutil.GetUncachedObjects(),
+ },
+ },
+ })
+ Expect(err).ToNot(HaveOccurred())
+
+ testCtx = testutil.NewDefaultTestContext(ctx, k8sClient, testEnv)
+
+ go func() {
+ defer GinkgoRecover()
+ err = k8sManager.Start(ctx)
+ Expect(err).ToNot(HaveOccurred(), "failed to run manager")
+ }()
+})
+
+var _ = AfterSuite(func() {
+ cancel()
+ By("tearing down the test environment")
+ err := testEnv.Stop()
+ Expect(err).NotTo(HaveOccurred())
+})