Skip to content

Commit 566ba4e

Browse files
Introduce a new nodeVolumeDetachTimeout field and ExcludeNodeVolumeDetachingAnnotation annotation
to be able to skip the wait for volume detachment. Move out shouldWaitForNodeVolumes from the node drain logic to its own condition to keep a cleaner separation between them.
1 parent f26bdb3 commit 566ba4e

26 files changed

+270
-5
lines changed

api/v1alpha3/conversion.go

+3
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func (src *Machine) ConvertTo(dstRaw conversion.Hub) error {
9898
}
9999

100100
dst.Spec.NodeDeletionTimeout = restored.Spec.NodeDeletionTimeout
101+
dst.Spec.NodeVolumeDetachTimeout = restored.Spec.NodeVolumeDetachTimeout
101102
dst.Status.NodeInfo = restored.Status.NodeInfo
102103
return nil
103104
}
@@ -141,6 +142,7 @@ func (src *MachineSet) ConvertTo(dstRaw conversion.Hub) error {
141142
return err
142143
}
143144
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
145+
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
144146
dst.Status.Conditions = restored.Status.Conditions
145147
return nil
146148
}
@@ -195,6 +197,7 @@ func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
195197
}
196198

197199
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
200+
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
198201
dst.Status.Conditions = restored.Status.Conditions
199202
return nil
200203
}

api/v1alpha3/zz_generated.conversion.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha4/conversion.go

+3
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ func (src *Machine) ConvertTo(dstRaw conversion.Hub) error {
159159
}
160160

161161
dst.Spec.NodeDeletionTimeout = restored.Spec.NodeDeletionTimeout
162+
dst.Spec.NodeVolumeDetachTimeout = restored.Spec.NodeVolumeDetachTimeout
162163
return nil
163164
}
164165

@@ -203,6 +204,7 @@ func (src *MachineSet) ConvertTo(dstRaw conversion.Hub) error {
203204
}
204205

205206
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
207+
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
206208
return nil
207209
}
208210

@@ -243,6 +245,7 @@ func (src *MachineDeployment) ConvertTo(dstRaw conversion.Hub) error {
243245
}
244246

245247
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
248+
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
246249
return nil
247250
}
248251

api/v1alpha4/zz_generated.conversion.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/machine_types.go

+8
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ const (
3333
// ExcludeNodeDrainingAnnotation annotation explicitly skips node draining if set.
3434
ExcludeNodeDrainingAnnotation = "machine.cluster.x-k8s.io/exclude-node-draining"
3535

36+
// ExcludeWaitForNodeVolumeDetachAnnotation annotation explicitly skips the waiting for node volume detaching if set.
37+
ExcludeWaitForNodeVolumeDetachAnnotation = "machine.cluster.x-k8s.io/exclude-wait-for-node-volume-detach"
38+
3639
// MachineSetLabelName is the label set on machines if they're controlled by MachineSet.
3740
MachineSetLabelName = "cluster.x-k8s.io/set-name"
3841

@@ -97,6 +100,11 @@ type MachineSpec struct {
97100
// +optional
98101
NodeDrainTimeout *metav1.Duration `json:"nodeDrainTimeout,omitempty"`
99102

103+
// NodeVolumeDetachTimeout is the total amount of time that the controller will spend on waiting for all volumes
104+
// to be detached. The default value is 0, meaning that the volumes can be detached without any time limitations.
105+
// +optional
106+
NodeVolumeDetachTimeout *metav1.Duration `json:"nodeVolumeDetachTimeout,omitempty"`
107+
100108
// NodeDeletionTimeout defines how long the controller will attempt to delete the Node that the Machine
101109
// hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely.
102110
// Defaults to 10 seconds.

api/v1beta1/zz_generated.deepcopy.go

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/zz_generated.openapi.go

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/cluster.x-k8s.io_machinedeployments.yaml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/cluster.x-k8s.io_machinepools.yaml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/cluster.x-k8s.io_machines.yaml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/cluster.x-k8s.io_machinesets.yaml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

controlplane/kubeadm/api/v1alpha3/conversion.go

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func (src *KubeadmControlPlane) ConvertTo(dstRaw conversion.Hub) error {
4242
dst.Spec.MachineTemplate.NodeDeletionTimeout = restored.Spec.MachineTemplate.NodeDeletionTimeout
4343
dst.Spec.KubeadmConfigSpec.Files = restored.Spec.KubeadmConfigSpec.Files
4444
dst.Spec.KubeadmConfigSpec.Users = restored.Spec.KubeadmConfigSpec.Users
45+
dst.Spec.MachineTemplate.NodeVolumeDetachTimeout = restored.Spec.MachineTemplate.NodeVolumeDetachTimeout
4546
dst.Status.Version = restored.Status.Version
4647

4748
if restored.Spec.KubeadmConfigSpec.Users != nil {

controlplane/kubeadm/api/v1alpha4/conversion.go

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func (src *KubeadmControlPlane) ConvertTo(dstRaw conversion.Hub) error {
6767
}
6868

6969
dst.Spec.MachineTemplate.NodeDeletionTimeout = restored.Spec.MachineTemplate.NodeDeletionTimeout
70+
dst.Spec.MachineTemplate.NodeVolumeDetachTimeout = restored.Spec.MachineTemplate.NodeVolumeDetachTimeout
7071

7172
return nil
7273
}
@@ -138,6 +139,7 @@ func (src *KubeadmControlPlaneTemplate) ConvertTo(dstRaw conversion.Hub) error {
138139
dst.Spec.Template.Spec.MachineTemplate = restored.Spec.Template.Spec.MachineTemplate
139140
} else if restored.Spec.Template.Spec.MachineTemplate != nil {
140141
dst.Spec.Template.Spec.MachineTemplate.NodeDeletionTimeout = restored.Spec.Template.Spec.MachineTemplate.NodeDeletionTimeout
142+
dst.Spec.Template.Spec.MachineTemplate.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.MachineTemplate.NodeVolumeDetachTimeout
141143
}
142144

143145
return nil

controlplane/kubeadm/api/v1alpha4/zz_generated.conversion.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_types.go

+5
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ type KubeadmControlPlaneMachineTemplate struct {
102102
// +optional
103103
NodeDrainTimeout *metav1.Duration `json:"nodeDrainTimeout,omitempty"`
104104

105+
// NodeVolumeDetachTimeout is the total amount of time that the controller will spend on waiting for all volumes
106+
// to be detached. The default value is 0, meaning that the volumes can be detached without any time limitations.
107+
// +optional
108+
NodeVolumeDetachTimeout *metav1.Duration `json:"nodeVolumeDetachTimeout,omitempty"`
109+
105110
// NodeDeletionTimeout defines how long the machine controller will attempt to delete the Node that the Machine
106111
// hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely.
107112
// If no value is provided, the default value for this property of the Machine resource will be used.

controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook.go

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ func (in *KubeadmControlPlane) ValidateUpdate(old runtime.Object) error {
159159
{spec, "machineTemplate", "infrastructureRef", "name"},
160160
{spec, "machineTemplate", "infrastructureRef", "kind"},
161161
{spec, "machineTemplate", "nodeDrainTimeout"},
162+
{spec, "machineTemplate", "nodeVolumeDetachTimeout"},
162163
{spec, "machineTemplate", "nodeDeletionTimeout"},
163164
{spec, "replicas"},
164165
{spec, "version"},

controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,9 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) {
261261
Namespace: "foo",
262262
Name: "infraTemplate",
263263
},
264-
NodeDrainTimeout: &metav1.Duration{Duration: time.Second},
265-
NodeDeletionTimeout: &metav1.Duration{Duration: time.Second},
264+
NodeDrainTimeout: &metav1.Duration{Duration: time.Second},
265+
NodeVolumeDetachTimeout: &metav1.Duration{Duration: time.Second},
266+
NodeDeletionTimeout: &metav1.Duration{Duration: time.Second},
266267
},
267268
Replicas: pointer.Int32Ptr(1),
268269
RolloutStrategy: &RolloutStrategy{
@@ -388,6 +389,7 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) {
388389
validUpdate.Spec.MachineTemplate.InfrastructureRef.APIVersion = "test/v1alpha2"
389390
validUpdate.Spec.MachineTemplate.InfrastructureRef.Name = "orange"
390391
validUpdate.Spec.MachineTemplate.NodeDrainTimeout = &metav1.Duration{Duration: 10 * time.Second}
392+
validUpdate.Spec.MachineTemplate.NodeVolumeDetachTimeout = &metav1.Duration{Duration: 10 * time.Second}
391393
validUpdate.Spec.MachineTemplate.NodeDeletionTimeout = &metav1.Duration{Duration: 10 * time.Second}
392394
validUpdate.Spec.Replicas = pointer.Int32Ptr(5)
393395
now := metav1.NewTime(time.Now())

controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_types.go

+5
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ type KubeadmControlPlaneTemplateMachineTemplate struct {
100100
// +optional
101101
NodeDrainTimeout *metav1.Duration `json:"nodeDrainTimeout,omitempty"`
102102

103+
// NodeVolumeDetachTimeout is the total amount of time that the controller will spend on waiting for all volumes
104+
// to be detached. The default value is 0, meaning that the volumes can be detached without any time limitations.
105+
// +optional
106+
NodeVolumeDetachTimeout *metav1.Duration `json:"nodeVolumeDetachTimeout,omitempty"`
107+
103108
// NodeDeletionTimeout defines how long the machine controller will attempt to delete the Node that the Machine
104109
// hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely.
105110
// If no value is provided, the default value for this property of the Machine resource will be used.

controlplane/kubeadm/api/v1beta1/zz_generated.deepcopy.go

+10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/book/src/developer/architecture/controllers/control-plane.md

+4
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ documentation][scale].
9898
that the controller will spend on draining a control plane node.
9999
The default value is 0, meaning that the node can be drained without any time limitations.
100100

101+
* `machineTemplate.nodeVolumeDetachTimeout` - is a *metav1.Duration defining how long the controller
102+
will spend on waiting for all volumes to be detached.
103+
The default value is 0, meaning that the volume can be detached without any time limitations.
104+
101105
* `machineTemplate.nodeDeletionTimeout` - is a *metav1.Duration defining how long the controller
102106
will attempt to delete the Node that is hosted by a Machine after the Machine is marked for
103107
deletion. A duration of 0 will retry deletion indefinitely. It defaults to 10 seconds on the

exp/api/v1alpha3/conversion.go

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func (src *MachinePool) ConvertTo(dstRaw conversion.Hub) error {
7171
return err
7272
}
7373
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
74+
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
7475
return nil
7576
}
7677

exp/api/v1alpha4/conversion.go

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func (src *MachinePool) ConvertTo(dstRaw conversion.Hub) error {
3636
return err
3737
}
3838
dst.Spec.Template.Spec.NodeDeletionTimeout = restored.Spec.Template.Spec.NodeDeletionTimeout
39+
dst.Spec.Template.Spec.NodeVolumeDetachTimeout = restored.Spec.Template.Spec.NodeVolumeDetachTimeout
3940
return nil
4041
}
4142

0 commit comments

Comments
 (0)