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 7, 2024
1 parent 5d1c6c5 commit e4d3405
Show file tree
Hide file tree
Showing 27 changed files with 471 additions and 195 deletions.
24 changes: 17 additions & 7 deletions apis/apps/v1alpha1/cluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,19 @@ type UserResourceRefs struct {
ConfigMapRefs []ConfigMapRef `json:"configMapRefs,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 {
// Type indicates the type of the InstanceUpdateStrategy.
// Default is RollingUpdate.
// +optional
Type workloads.InstanceSetUpdateStrategyType `json:"type,omitempty"`
// RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType.
// +optional
RollingUpdate *workloads.RollingUpdateStrategy `json:"rollingUpdate,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 @@ -790,15 +803,12 @@ type ClusterComponentSpec struct {
// +optional
ServiceAccountName string `json:"serviceAccountName,omitempty"`

// Defines the update strategy for the Component.
// Indicates the InstanceUpdateStrategy that will be
// employed to update Pods in the InstanceSet when a revision is made to
// Template.
//
// Deprecated since v0.9.
// This field is maintained for backward compatibility and its use is discouraged.
// Existing usage should be updated to the current preferred approach to avoid compatibility issues in future releases.
//
// +kubebuilder:deprecatedversion:warning="This field has been deprecated since 0.9.0"
// +optional
UpdateStrategy *UpdateStrategy `json:"updateStrategy,omitempty"`
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`.
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: 22 additions & 5 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.

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

// InstanceSetUpdateStrategyType is a string enumeration type that enumerates
// all possible update strategies for the InstanceSet controller.
// +enum
type InstanceSetUpdateStrategyType string

const (
// RollingUpdateInstanceSetStrategyType indicates that update will be
// applied to all Pods in the InstanceSet with respect to the InstanceSet
// ordering constraints. When a scale operation is performed with this
// strategy, new Pods will be created from the specification version indicated
// by the InstanceSet's updateRevision.
RollingUpdateInstanceSetStrategyType InstanceSetUpdateStrategyType = "RollingUpdate"
// OnDeleteInstanceSetStrategyType triggers the legacy behavior. Version
// tracking and ordered rolling restarts are disabled. Pods are recreated
// when they are manually deleted. When a scale
// operation is performed with this strategy, specification version indicated
// by the InstanceSet's currentRevision.
OnDeleteInstanceSetStrategyType InstanceSetUpdateStrategyType = "OnDelete"
)

// 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 {
// Type indicates the type of the InstanceUpdateStrategy.
// Default is RollingUpdate.
// +optional
Type InstanceSetUpdateStrategyType `json:"type,omitempty"`
// RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType.
// +optional
RollingUpdate *RollingUpdateStrategy `json:"rollingUpdate,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"`
}

// RollingUpdateStrategy is used to communicate parameter for RollingUpdateInstanceSetStrategyType.
type RollingUpdateStrategy 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"`
}

// 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 +386,10 @@ 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
// UpdateStrategy.Type will be set to OnDeleteInstanceSetStrategyType if UpdateStrategy.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 @@ -346,16 +406,6 @@ type InstanceSetSpec struct {
// +optional
MembershipReconfiguration *MembershipReconfiguration `json:"membershipReconfiguration,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"`

// Indicates that the InstanceSet is paused, meaning the reconciliation of this InstanceSet object will be paused.
// +optional
Paused bool `json:"paused,omitempty"`
Expand Down
55 changes: 50 additions & 5 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.

Loading

0 comments on commit e4d3405

Please sign in to comment.