diff --git a/cmd/kubeadm/app/util/apiclient/idempotency.go b/cmd/kubeadm/app/util/apiclient/idempotency.go index 99b831c0472..fa5fc00cbff 100644 --- a/cmd/kubeadm/app/util/apiclient/idempotency.go +++ b/cmd/kubeadm/app/util/apiclient/idempotency.go @@ -303,7 +303,7 @@ func PatchNodeOnce(client clientset.Interface, nodeName string, patchFn func(*v1 if _, err := client.CoreV1().Nodes().Patch(context.TODO(), n.Name, types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}); err != nil { *lastError = errors.Wrapf(err, "error patching node %q through apiserver", n.Name) - if apierrors.IsTimeout(err) || apierrors.IsConflict(err) { + if apierrors.IsTimeout(err) || apierrors.IsConflict(err) || apierrors.IsServerTimeout(err) || apierrors.IsServiceUnavailable(err) { return false, nil } return false, *lastError diff --git a/cmd/kubeadm/app/util/apiclient/idempotency_test.go b/cmd/kubeadm/app/util/apiclient/idempotency_test.go index 8dc14a83938..6c10cae0c04 100644 --- a/cmd/kubeadm/app/util/apiclient/idempotency_test.go +++ b/cmd/kubeadm/app/util/apiclient/idempotency_test.go @@ -91,6 +91,30 @@ func TestPatchNode(t *testing.T) { success: false, fakeError: apierrors.NewConflict(schema.GroupResource{}, "fake conflict", nil), }, + { + name: "patch node when there is a server timeout", + lookupName: "testnode", + node: v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testnode", + Labels: map[string]string{v1.LabelHostname: ""}, + }, + }, + success: false, + fakeError: apierrors.NewServerTimeout(schema.GroupResource{}, "fake server timeout", 1), + }, + { + name: "patch node when the service is unavailable", + lookupName: "testnode", + node: v1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testnode", + Labels: map[string]string{v1.LabelHostname: ""}, + }, + }, + success: false, + fakeError: apierrors.NewServiceUnavailable("fake service unavailable"), + }, } for _, tc := range testcases {