mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 05:57:25 +00:00
Change default update strategy to rolling update
This commit is contained in:
parent
3e0eff9f55
commit
27e6ceed88
@ -43,7 +43,7 @@ func SetDefaults_DaemonSet(obj *appsv1beta2.DaemonSet) {
|
|||||||
}
|
}
|
||||||
updateStrategy := &obj.Spec.UpdateStrategy
|
updateStrategy := &obj.Spec.UpdateStrategy
|
||||||
if updateStrategy.Type == "" {
|
if updateStrategy.Type == "" {
|
||||||
updateStrategy.Type = appsv1beta2.OnDeleteDaemonSetStrategyType
|
updateStrategy.Type = appsv1beta2.RollingUpdateDaemonSetStrategyType
|
||||||
}
|
}
|
||||||
if updateStrategy.Type == appsv1beta2.RollingUpdateDaemonSetStrategyType {
|
if updateStrategy.Type == appsv1beta2.RollingUpdateDaemonSetStrategyType {
|
||||||
if updateStrategy.RollingUpdate == nil {
|
if updateStrategy.RollingUpdate == nil {
|
||||||
@ -68,8 +68,19 @@ func SetDefaults_StatefulSet(obj *appsv1beta2.StatefulSet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if obj.Spec.UpdateStrategy.Type == "" {
|
if obj.Spec.UpdateStrategy.Type == "" {
|
||||||
obj.Spec.UpdateStrategy.Type = appsv1beta2.OnDeleteStatefulSetStrategyType
|
obj.Spec.UpdateStrategy.Type = appsv1beta2.RollingUpdateStatefulSetStrategyType
|
||||||
|
|
||||||
|
// UpdateStrategy.RollingUpdate will take default values below.
|
||||||
|
obj.Spec.UpdateStrategy.RollingUpdate = &appsv1beta2.RollingUpdateStatefulSetStrategy{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if obj.Spec.UpdateStrategy.Type == appsv1beta2.RollingUpdateStatefulSetStrategyType &&
|
||||||
|
obj.Spec.UpdateStrategy.RollingUpdate != nil &&
|
||||||
|
obj.Spec.UpdateStrategy.RollingUpdate.Partition == nil {
|
||||||
|
obj.Spec.UpdateStrategy.RollingUpdate.Partition = new(int32)
|
||||||
|
*obj.Spec.UpdateStrategy.RollingUpdate.Partition = 0
|
||||||
|
}
|
||||||
|
|
||||||
labels := obj.Spec.Template.Labels
|
labels := obj.Spec.Template.Labels
|
||||||
if labels != nil {
|
if labels != nil {
|
||||||
if obj.Spec.Selector == nil {
|
if obj.Spec.Selector == nil {
|
||||||
@ -89,13 +100,6 @@ func SetDefaults_StatefulSet(obj *appsv1beta2.StatefulSet) {
|
|||||||
obj.Spec.RevisionHistoryLimit = new(int32)
|
obj.Spec.RevisionHistoryLimit = new(int32)
|
||||||
*obj.Spec.RevisionHistoryLimit = 10
|
*obj.Spec.RevisionHistoryLimit = 10
|
||||||
}
|
}
|
||||||
if obj.Spec.UpdateStrategy.Type == appsv1beta2.RollingUpdateStatefulSetStrategyType &&
|
|
||||||
obj.Spec.UpdateStrategy.RollingUpdate != nil &&
|
|
||||||
obj.Spec.UpdateStrategy.RollingUpdate.Partition == nil {
|
|
||||||
obj.Spec.UpdateStrategy.RollingUpdate.Partition = new(int32)
|
|
||||||
*obj.Spec.UpdateStrategy.RollingUpdate.Partition = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetDefaults_Deployment sets additional defaults compared to its counterpart
|
// SetDefaults_Deployment sets additional defaults compared to its counterpart
|
||||||
|
@ -21,7 +21,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
appsv1beta2 "k8s.io/api/apps/v1beta2"
|
appsv1beta2 "k8s.io/api/apps/v1beta2"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
@ -36,6 +35,7 @@ import (
|
|||||||
|
|
||||||
func TestSetDefaultDaemonSetSpec(t *testing.T) {
|
func TestSetDefaultDaemonSetSpec(t *testing.T) {
|
||||||
defaultLabels := map[string]string{"foo": "bar"}
|
defaultLabels := map[string]string{"foo": "bar"}
|
||||||
|
maxUnavailable := intstr.FromInt(1)
|
||||||
period := int64(v1.DefaultTerminationGracePeriodSeconds)
|
period := int64(v1.DefaultTerminationGracePeriodSeconds)
|
||||||
defaultTemplate := v1.PodTemplateSpec{
|
defaultTemplate := v1.PodTemplateSpec{
|
||||||
Spec: v1.PodSpec{
|
Spec: v1.PodSpec{
|
||||||
@ -78,7 +78,10 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Template: defaultTemplate,
|
Template: defaultTemplate,
|
||||||
UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{
|
UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{
|
||||||
Type: appsv1beta2.OnDeleteDaemonSetStrategyType,
|
Type: appsv1beta2.RollingUpdateStatefulSetStrategyType,
|
||||||
|
RollingUpdate: &appsv1beta2.RollingUpdateDaemonSet{
|
||||||
|
MaxUnavailable: &maxUnavailable,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
RevisionHistoryLimit: newInt32(10),
|
RevisionHistoryLimit: newInt32(10),
|
||||||
},
|
},
|
||||||
@ -108,14 +111,24 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Template: defaultTemplate,
|
Template: defaultTemplate,
|
||||||
UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{
|
UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{
|
||||||
Type: appsv1beta2.OnDeleteDaemonSetStrategyType,
|
Type: appsv1beta2.RollingUpdateStatefulSetStrategyType,
|
||||||
|
RollingUpdate: &appsv1beta2.RollingUpdateDaemonSet{
|
||||||
|
MaxUnavailable: &maxUnavailable,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
RevisionHistoryLimit: newInt32(1),
|
RevisionHistoryLimit: newInt32(1),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ // Update strategy.
|
{ // OnDeleteDaemonSetStrategyType update strategy.
|
||||||
original: &appsv1beta2.DaemonSet{},
|
original: &appsv1beta2.DaemonSet{
|
||||||
|
Spec: appsv1beta2.DaemonSetSpec{
|
||||||
|
Template: templateNoLabel,
|
||||||
|
UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{
|
||||||
|
Type: appsv1beta2.OnDeleteDaemonSetStrategyType,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
expected: &appsv1beta2.DaemonSet{
|
expected: &appsv1beta2.DaemonSet{
|
||||||
Spec: appsv1beta2.DaemonSetSpec{
|
Spec: appsv1beta2.DaemonSetSpec{
|
||||||
Template: templateNoLabel,
|
Template: templateNoLabel,
|
||||||
@ -134,7 +147,10 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) {
|
|||||||
Spec: appsv1beta2.DaemonSetSpec{
|
Spec: appsv1beta2.DaemonSetSpec{
|
||||||
Template: templateNoLabel,
|
Template: templateNoLabel,
|
||||||
UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{
|
UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{
|
||||||
Type: appsv1beta2.OnDeleteDaemonSetStrategyType,
|
Type: appsv1beta2.RollingUpdateStatefulSetStrategyType,
|
||||||
|
RollingUpdate: &appsv1beta2.RollingUpdateDaemonSet{
|
||||||
|
MaxUnavailable: &maxUnavailable,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
RevisionHistoryLimit: newInt32(10),
|
RevisionHistoryLimit: newInt32(10),
|
||||||
},
|
},
|
||||||
@ -157,6 +173,128 @@ func TestSetDefaultDaemonSetSpec(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSetDefaultStatefulSet(t *testing.T) {
|
||||||
|
defaultLabels := map[string]string{"foo": "bar"}
|
||||||
|
var defaultPartition int32 = 0
|
||||||
|
var defaultReplicas int32 = 1
|
||||||
|
|
||||||
|
period := int64(v1.DefaultTerminationGracePeriodSeconds)
|
||||||
|
defaultTemplate := v1.PodTemplateSpec{
|
||||||
|
Spec: v1.PodSpec{
|
||||||
|
DNSPolicy: v1.DNSClusterFirst,
|
||||||
|
RestartPolicy: v1.RestartPolicyAlways,
|
||||||
|
SecurityContext: &v1.PodSecurityContext{},
|
||||||
|
TerminationGracePeriodSeconds: &period,
|
||||||
|
SchedulerName: api.DefaultSchedulerName,
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: defaultLabels,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
original *appsv1beta2.StatefulSet
|
||||||
|
expected *appsv1beta2.StatefulSet
|
||||||
|
}{
|
||||||
|
{ // Selector, labels and default update strategy
|
||||||
|
original: &appsv1beta2.StatefulSet{
|
||||||
|
Spec: appsv1beta2.StatefulSetSpec{
|
||||||
|
Template: defaultTemplate,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &appsv1beta2.StatefulSet{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: defaultLabels,
|
||||||
|
},
|
||||||
|
Spec: appsv1beta2.StatefulSetSpec{
|
||||||
|
Selector: &metav1.LabelSelector{
|
||||||
|
MatchLabels: defaultLabels,
|
||||||
|
},
|
||||||
|
Replicas: &defaultReplicas,
|
||||||
|
Template: defaultTemplate,
|
||||||
|
PodManagementPolicy: appsv1beta2.OrderedReadyPodManagement,
|
||||||
|
UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{
|
||||||
|
Type: appsv1beta2.RollingUpdateStatefulSetStrategyType,
|
||||||
|
RollingUpdate: &appsv1beta2.RollingUpdateStatefulSetStrategy{
|
||||||
|
Partition: &defaultPartition,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
RevisionHistoryLimit: newInt32(10),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ // Alternate update strategy
|
||||||
|
original: &appsv1beta2.StatefulSet{
|
||||||
|
Spec: appsv1beta2.StatefulSetSpec{
|
||||||
|
Template: defaultTemplate,
|
||||||
|
UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{
|
||||||
|
Type: appsv1beta2.OnDeleteStatefulSetStrategyType,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &appsv1beta2.StatefulSet{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: defaultLabels,
|
||||||
|
},
|
||||||
|
Spec: appsv1beta2.StatefulSetSpec{
|
||||||
|
Selector: &metav1.LabelSelector{
|
||||||
|
MatchLabels: defaultLabels,
|
||||||
|
},
|
||||||
|
Replicas: &defaultReplicas,
|
||||||
|
Template: defaultTemplate,
|
||||||
|
PodManagementPolicy: appsv1beta2.OrderedReadyPodManagement,
|
||||||
|
UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{
|
||||||
|
Type: appsv1beta2.OnDeleteStatefulSetStrategyType,
|
||||||
|
},
|
||||||
|
RevisionHistoryLimit: newInt32(10),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ // Parallel pod management policy.
|
||||||
|
original: &appsv1beta2.StatefulSet{
|
||||||
|
Spec: appsv1beta2.StatefulSetSpec{
|
||||||
|
Template: defaultTemplate,
|
||||||
|
PodManagementPolicy: appsv1beta2.ParallelPodManagement,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &appsv1beta2.StatefulSet{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: defaultLabels,
|
||||||
|
},
|
||||||
|
Spec: appsv1beta2.StatefulSetSpec{
|
||||||
|
Selector: &metav1.LabelSelector{
|
||||||
|
MatchLabels: defaultLabels,
|
||||||
|
},
|
||||||
|
Replicas: &defaultReplicas,
|
||||||
|
Template: defaultTemplate,
|
||||||
|
PodManagementPolicy: appsv1beta2.ParallelPodManagement,
|
||||||
|
UpdateStrategy: appsv1beta2.StatefulSetUpdateStrategy{
|
||||||
|
Type: appsv1beta2.RollingUpdateStatefulSetStrategyType,
|
||||||
|
RollingUpdate: &appsv1beta2.RollingUpdateStatefulSetStrategy{
|
||||||
|
Partition: &defaultPartition,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
RevisionHistoryLimit: newInt32(10),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, test := range tests {
|
||||||
|
original := test.original
|
||||||
|
expected := test.expected
|
||||||
|
obj2 := roundTrip(t, runtime.Object(original))
|
||||||
|
got, ok := obj2.(*appsv1beta2.StatefulSet)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("(%d) unexpected object: %v", i, got)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
if !apiequality.Semantic.DeepEqual(got.Spec, expected.Spec) {
|
||||||
|
t.Errorf("(%d) got different than expected\ngot:\n\t%+v\nexpected:\n\t%+v", i, got.Spec, expected.Spec)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSetDefaultDeployment(t *testing.T) {
|
func TestSetDefaultDeployment(t *testing.T) {
|
||||||
defaultIntOrString := intstr.FromString("25%")
|
defaultIntOrString := intstr.FromString("25%")
|
||||||
differentIntOrString := intstr.FromInt(5)
|
differentIntOrString := intstr.FromInt(5)
|
||||||
|
@ -122,8 +122,11 @@ const (
|
|||||||
// necessary to perform the update for the indicated strategy.
|
// necessary to perform the update for the indicated strategy.
|
||||||
type StatefulSetUpdateStrategy struct {
|
type StatefulSetUpdateStrategy struct {
|
||||||
// Type indicates the type of the StatefulSetUpdateStrategy.
|
// Type indicates the type of the StatefulSetUpdateStrategy.
|
||||||
|
// Default is RollingUpdate.
|
||||||
|
// +optional
|
||||||
Type StatefulSetUpdateStrategyType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type,casttype=StatefulSetStrategyType"`
|
Type StatefulSetUpdateStrategyType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type,casttype=StatefulSetStrategyType"`
|
||||||
// RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType.
|
// RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType.
|
||||||
|
// +optional
|
||||||
RollingUpdate *RollingUpdateStatefulSetStrategy `json:"rollingUpdate,omitempty" protobuf:"bytes,2,opt,name=rollingUpdate"`
|
RollingUpdate *RollingUpdateStatefulSetStrategy `json:"rollingUpdate,omitempty" protobuf:"bytes,2,opt,name=rollingUpdate"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,6 +154,8 @@ const (
|
|||||||
type RollingUpdateStatefulSetStrategy struct {
|
type RollingUpdateStatefulSetStrategy struct {
|
||||||
// Partition indicates the ordinal at which the StatefulSet should be
|
// Partition indicates the ordinal at which the StatefulSet should be
|
||||||
// partitioned.
|
// partitioned.
|
||||||
|
// Default value is 0.
|
||||||
|
// +optional
|
||||||
Partition *int32 `json:"partition,omitempty" protobuf:"varint,1,opt,name=partition"`
|
Partition *int32 `json:"partition,omitempty" protobuf:"varint,1,opt,name=partition"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,8 +509,7 @@ type DeploymentList struct {
|
|||||||
|
|
||||||
// WIP: This is not ready to be used and we plan to make breaking changes to it.
|
// WIP: This is not ready to be used and we plan to make breaking changes to it.
|
||||||
type DaemonSetUpdateStrategy struct {
|
type DaemonSetUpdateStrategy struct {
|
||||||
// Type of daemon set update. Can be "RollingUpdate" or "OnDelete".
|
// Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is RollingUpdate.
|
||||||
// Default is OnDelete.
|
|
||||||
// +optional
|
// +optional
|
||||||
Type DaemonSetUpdateStrategyType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type"`
|
Type DaemonSetUpdateStrategyType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type"`
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user