Skip to content

Commit

Permalink
feat: Supports upper-layer modification of the InstanceSet's UpdateSt…
Browse files Browse the repository at this point in the history
…rategy

Signed-off-by: Liang Deng <[email protected]>
  • Loading branch information
YTGhost committed Aug 15, 2024
1 parent 8839052 commit e1de8d6
Show file tree
Hide file tree
Showing 28 changed files with 406 additions and 148 deletions.
26 changes: 26 additions & 0 deletions apis/apps/v1alpha1/cluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,25 @@ type UserResourceRefs struct {
ConfigMapRefs []ConfigMapRef `json:"configMapRefs,omitempty"`
}

// InstanceUpdateStrategy indicates the strategy that the InstanceSet
// controller will use to perform updates.
type InstanceUpdateStrategy struct {
// Partition indicates the number of pods that should be updated during a rolling update.
// The remaining pods will remain untouched. This is helpful in defining how many pods
// should participate in the update process. The update process will follow the order
// of pod names in descending lexicographical (dictionary) order. The default value is
// Replicas (i.e., update all pods).
// +optional
Partition *int32 `json:"partition,omitempty"`
// The maximum number of pods that can be unavailable during the update.
// Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
// Absolute number is calculated from percentage by rounding up. This can not be 0.
// Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,
// it will be counted towards MaxUnavailable.
// +optional
MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"`
}

// InstanceTemplate allows customization of individual replica configurations in a Component.
type InstanceTemplate struct {
// Name specifies the unique name of the instance Pod created using this InstanceTemplate.
Expand Down Expand Up @@ -800,6 +819,13 @@ type ClusterComponentSpec struct {
// +optional
UpdateStrategy *UpdateStrategy `json:"updateStrategy,omitempty"`

// Indicates the InstanceUpdateStrategy that will be
// employed to update Pods in the InstanceSet when a revision is made to
// Template.
//
// +optional
InstanceUpdateStrategy InstanceUpdateStrategy `json:"instanceUpdateStrategy,omitempty"`

// Controls the concurrency of pods during initial scale up, when replacing pods on nodes,
// or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.
// The default Concurrency is 100%.
Expand Down
7 changes: 7 additions & 0 deletions apis/apps/v1alpha1/component_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,13 @@ type ComponentSpec struct {
// +optional
ServiceAccountName string `json:"serviceAccountName,omitempty"`

// Indicates the InstanceUpdateStrategy that will be
// employed to update Pods in the InstanceSet when a revision is made to
// Template.
//
// +optional
InstanceUpdateStrategy InstanceUpdateStrategy `json:"instanceUpdateStrategy,omitempty"`

// Controls the concurrency of pods during initial scale up, when replacing pods on nodes,
// or when scaling down. It only used when `PodManagementPolicy` is set to `Parallel`.
// The default Concurrency is 100%.
Expand Down
27 changes: 27 additions & 0 deletions apis/apps/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 32 additions & 2 deletions apis/workloads/v1alpha1/instanceset_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,35 @@ type SchedulingPolicy struct {
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`
}

// InstanceUpdateStrategy indicates the strategy that the InstanceSet
// controller will use to perform updates. It includes any additional parameters
// necessary to perform the update for the indicated strategy.
type InstanceUpdateStrategy struct {
// Partition indicates the number of pods that should be updated during a rolling update.
// The remaining pods will remain untouched. This is helpful in defining how many pods
// should participate in the update process. The update process will follow the order
// of pod names in descending lexicographical (dictionary) order. The default value is
// Replicas (i.e., update all pods).
// +optional
Partition *int32 `json:"partition,omitempty"`
// The maximum number of pods that can be unavailable during the update.
// Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
// Absolute number is calculated from percentage by rounding up. This can not be 0.
// Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,
// it will be counted towards MaxUnavailable.
// +optional
MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"`
// Members(Pods) update strategy.
//
// - serial: update Members one by one that guarantee minimum component unavailable time.
// - bestEffortParallel: update Members in parallel that guarantee minimum component un-writable time.
// - parallel: force parallel
//
// +kubebuilder:validation:Enum={Serial,BestEffortParallel,Parallel}
// +optional
MemberUpdateStrategy *MemberUpdateStrategy `json:"memberUpdateStrategy,omitempty"`
}

// Range represents a range with a start and an end value.
// It is used to define a continuous segment.
type Range struct {
Expand Down Expand Up @@ -326,10 +355,9 @@ type InstanceSetSpec struct {
// Indicates the StatefulSetUpdateStrategy that will be
// employed to update Pods in the InstanceSet when a revision is made to
// Template.
// UpdateStrategy.Type will be set to appsv1.OnDeleteStatefulSetStrategyType if MemberUpdateStrategy is not nil
//
// Note: This field will be removed in future version.
UpdateStrategy appsv1.StatefulSetUpdateStrategy `json:"updateStrategy,omitempty"`
UpdateStrategy InstanceUpdateStrategy `json:"updateStrategy,omitempty"`

// A list of roles defined in the system.
//
Expand All @@ -348,11 +376,13 @@ type InstanceSetSpec struct {

// Members(Pods) update strategy.
//
// Deprecated since v0.9.0
// - serial: update Members one by one that guarantee minimum component unavailable time.
// - bestEffortParallel: update Members in parallel that guarantee minimum component un-writable time.
// - parallel: force parallel
//
// +kubebuilder:validation:Enum={Serial,BestEffortParallel,Parallel}
// +kubebuilder:deprecatedversion:warning="This field has been deprecated since 0.9.0"
// +optional
MemberUpdateStrategy *MemberUpdateStrategy `json:"memberUpdateStrategy,omitempty"`

Expand Down
30 changes: 30 additions & 0 deletions apis/workloads/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 54 additions & 0 deletions config/crd/bases/apps.kubeblocks.io_clusters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,33 @@ spec:
- name
type: object
type: array
instanceUpdateStrategy:
description: |-
Indicates the InstanceUpdateStrategy that will be
employed to update Pods in the InstanceSet when a revision is made to
Template.
properties:
maxUnavailable:
anyOf:
- type: integer
- type: string
description: |-
The maximum number of pods that can be unavailable during the update.
Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
Absolute number is calculated from percentage by rounding up. This can not be 0.
Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,
it will be counted towards MaxUnavailable.
x-kubernetes-int-or-string: true
partition:
description: |-
Partition indicates the number of pods that should be updated during a rolling update.
The remaining pods will remain untouched. This is helpful in defining how many pods
should participate in the update process. The update process will follow the order
of pod names in descending lexicographical (dictionary) order. The default value is
Replicas (i.e., update all pods).
format: int32
type: integer
type: object
instances:
description: |-
Allows for the customization of configuration values for each instance within a Component.
Expand Down Expand Up @@ -9772,6 +9799,33 @@ spec:
- name
type: object
type: array
instanceUpdateStrategy:
description: |-
Indicates the InstanceUpdateStrategy that will be
employed to update Pods in the InstanceSet when a revision is made to
Template.
properties:
maxUnavailable:
anyOf:
- type: integer
- type: string
description: |-
The maximum number of pods that can be unavailable during the update.
Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
Absolute number is calculated from percentage by rounding up. This can not be 0.
Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,
it will be counted towards MaxUnavailable.
x-kubernetes-int-or-string: true
partition:
description: |-
Partition indicates the number of pods that should be updated during a rolling update.
The remaining pods will remain untouched. This is helpful in defining how many pods
should participate in the update process. The update process will follow the order
of pod names in descending lexicographical (dictionary) order. The default value is
Replicas (i.e., update all pods).
format: int32
type: integer
type: object
instances:
description: |-
Allows for the customization of configuration values for each instance within a Component.
Expand Down
27 changes: 27 additions & 0 deletions config/crd/bases/apps.kubeblocks.io_components.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,33 @@ spec:
- name
type: object
type: array
instanceUpdateStrategy:
description: |-
Indicates the InstanceUpdateStrategy that will be
employed to update Pods in the InstanceSet when a revision is made to
Template.
properties:
maxUnavailable:
anyOf:
- type: integer
- type: string
description: |-
The maximum number of pods that can be unavailable during the update.
Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
Absolute number is calculated from percentage by rounding up. This can not be 0.
Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,
it will be counted towards MaxUnavailable.
x-kubernetes-int-or-string: true
partition:
description: |-
Partition indicates the number of pods that should be updated during a rolling update.
The remaining pods will remain untouched. This is helpful in defining how many pods
should participate in the update process. The update process will follow the order
of pod names in descending lexicographical (dictionary) order. The default value is
Replicas (i.e., update all pods).
format: int32
type: integer
type: object
instances:
description: |-
Allows for the customization of configuration values for each instance within a Component.
Expand Down
62 changes: 32 additions & 30 deletions config/crd/bases/workloads.kubeblocks.io_instancesets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3947,6 +3947,7 @@ spec:
Members(Pods) update strategy.


Deprecated since v0.9.0
- serial: update Members one by one that guarantee minimum component unavailable time.
- bestEffortParallel: update Members in parallel that guarantee minimum component un-writable time.
- parallel: force parallel
Expand Down Expand Up @@ -12391,42 +12392,43 @@ spec:
Indicates the StatefulSetUpdateStrategy that will be
employed to update Pods in the InstanceSet when a revision is made to
Template.
UpdateStrategy.Type will be set to appsv1.OnDeleteStatefulSetStrategyType if MemberUpdateStrategy is not nil


Note: This field will be removed in future version.
properties:
rollingUpdate:
description: RollingUpdate is used to communicate parameters when
Type is RollingUpdateStatefulSetStrategyType.
properties:
maxUnavailable:
anyOf:
- type: integer
- type: string
description: |-
The maximum number of pods that can be unavailable during the update.
Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
Absolute number is calculated from percentage by rounding up. This can not be 0.
Defaults to 1. This field is alpha-level and is only honored by servers that enable the
MaxUnavailableStatefulSet feature. The field applies to all pods in the range 0 to
Replicas-1. That means if there is any unavailable pod in the range 0 to Replicas-1, it
will be counted towards MaxUnavailable.
x-kubernetes-int-or-string: true
partition:
description: |-
Partition indicates the ordinal at which the StatefulSet should be partitioned
for updates. During a rolling update, all pods from ordinal Replicas-1 to
Partition are updated. All pods from ordinal Partition-1 to 0 remain untouched.
This is helpful in being able to do a canary based deployment. The default value is 0.
format: int32
type: integer
type: object
type:
maxUnavailable:
anyOf:
- type: integer
- type: string
description: |-
The maximum number of pods that can be unavailable during the update.
Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
Absolute number is calculated from percentage by rounding up. This can not be 0.
Defaults to 1. The field applies to all pods. That means if there is any unavailable pod,
it will be counted towards MaxUnavailable.
x-kubernetes-int-or-string: true
memberUpdateStrategy:
description: |-
Type indicates the type of the StatefulSetUpdateStrategy.
Default is RollingUpdate.
Members(Pods) update strategy.


- serial: update Members one by one that guarantee minimum component unavailable time.
- bestEffortParallel: update Members in parallel that guarantee minimum component un-writable time.
- parallel: force parallel
enum:
- Serial
- BestEffortParallel
- Parallel
type: string
partition:
description: |-
Partition indicates the number of pods that should be updated during a rolling update.
The remaining pods will remain untouched. This is helpful in defining how many pods
should participate in the update process. The update process will follow the order
of pod names in descending lexicographical (dictionary) order. The default value is
Replicas (i.e., update all pods).
format: int32
type: integer
type: object
volumeClaimTemplates:
description: |-
Expand Down
Loading

0 comments on commit e1de8d6

Please sign in to comment.