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 <283304489@qq.com>
  • Loading branch information
YTGhost committed Aug 14, 2024
1 parent 4b19c5f commit f84bd1e
Show file tree
Hide file tree
Showing 28 changed files with 406 additions and 160 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 ordinal at which the InstanceSet 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.
// +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 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.
// +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 ordinal at which the InstanceSet 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.
// +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 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.
// +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 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 InstanceSet 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
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 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 InstanceSet 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
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 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 InstanceSet 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
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 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
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 ordinal at which the InstanceSet 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
volumeClaimTemplates:
description: |-
Expand Down
Loading

0 comments on commit f84bd1e

Please sign in to comment.