mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Updating EndpointSlice controllers to return if error encountered
Previously the controllers would proceed with additional creates, updates, or deletes if 1 failed. That could potentially result in scenarios where an EndpointSlice create or update failing while a delete worked. This updates the logic so that removals will not happen if additions fail.
This commit is contained in:
parent
343817ef93
commit
4cfe4403b4
@ -26,7 +26,6 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
@ -27,7 +27,6 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
corelisters "k8s.io/client-go/listers/core/v1"
|
corelisters "k8s.io/client-go/listers/core/v1"
|
||||||
@ -180,8 +179,6 @@ func (r *reconciler) finalize(
|
|||||||
slicesToDelete []*discovery.EndpointSlice,
|
slicesToDelete []*discovery.EndpointSlice,
|
||||||
triggerTime time.Time,
|
triggerTime time.Time,
|
||||||
) error {
|
) error {
|
||||||
errs := []error{}
|
|
||||||
|
|
||||||
// If there are slices to create and delete, change the creates to updates
|
// If there are slices to create and delete, change the creates to updates
|
||||||
// of the slices that would otherwise be deleted.
|
// of the slices that would otherwise be deleted.
|
||||||
for i := 0; i < len(slicesToDelete); {
|
for i := 0; i < len(slicesToDelete); {
|
||||||
@ -218,11 +215,10 @@ func (r *reconciler) finalize(
|
|||||||
if errors.HasStatusCause(err, corev1.NamespaceTerminatingCause) {
|
if errors.HasStatusCause(err, corev1.NamespaceTerminatingCause) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
errs = append(errs, fmt.Errorf("Error creating EndpointSlice for Service %s/%s: %v", service.Namespace, service.Name, err))
|
return fmt.Errorf("failed to create EndpointSlice for Service %s/%s: %v", service.Namespace, service.Name, err)
|
||||||
} else {
|
|
||||||
r.endpointSliceTracker.Update(createdSlice)
|
|
||||||
metrics.EndpointSliceChanges.WithLabelValues("create").Inc()
|
|
||||||
}
|
}
|
||||||
|
r.endpointSliceTracker.Update(createdSlice)
|
||||||
|
metrics.EndpointSliceChanges.WithLabelValues("create").Inc()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,24 +226,22 @@ func (r *reconciler) finalize(
|
|||||||
addTriggerTimeAnnotation(endpointSlice, triggerTime)
|
addTriggerTimeAnnotation(endpointSlice, triggerTime)
|
||||||
updatedSlice, err := r.client.DiscoveryV1beta1().EndpointSlices(service.Namespace).Update(context.TODO(), endpointSlice, metav1.UpdateOptions{})
|
updatedSlice, err := r.client.DiscoveryV1beta1().EndpointSlices(service.Namespace).Update(context.TODO(), endpointSlice, metav1.UpdateOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, fmt.Errorf("Error updating %s EndpointSlice for Service %s/%s: %v", endpointSlice.Name, service.Namespace, service.Name, err))
|
return fmt.Errorf("failed to update %s EndpointSlice for Service %s/%s: %v", endpointSlice.Name, service.Namespace, service.Name, err)
|
||||||
} else {
|
|
||||||
r.endpointSliceTracker.Update(updatedSlice)
|
|
||||||
metrics.EndpointSliceChanges.WithLabelValues("update").Inc()
|
|
||||||
}
|
}
|
||||||
|
r.endpointSliceTracker.Update(updatedSlice)
|
||||||
|
metrics.EndpointSliceChanges.WithLabelValues("update").Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, endpointSlice := range slicesToDelete {
|
for _, endpointSlice := range slicesToDelete {
|
||||||
err := r.client.DiscoveryV1beta1().EndpointSlices(service.Namespace).Delete(context.TODO(), endpointSlice.Name, metav1.DeleteOptions{})
|
err := r.client.DiscoveryV1beta1().EndpointSlices(service.Namespace).Delete(context.TODO(), endpointSlice.Name, metav1.DeleteOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, fmt.Errorf("Error deleting %s EndpointSlice for Service %s/%s: %v", endpointSlice.Name, service.Namespace, service.Name, err))
|
return fmt.Errorf("failed to delete %s EndpointSlice for Service %s/%s: %v", endpointSlice.Name, service.Namespace, service.Name, err)
|
||||||
} else {
|
|
||||||
r.endpointSliceTracker.Delete(endpointSlice)
|
|
||||||
metrics.EndpointSliceChanges.WithLabelValues("delete").Inc()
|
|
||||||
}
|
}
|
||||||
|
r.endpointSliceTracker.Delete(endpointSlice)
|
||||||
|
metrics.EndpointSliceChanges.WithLabelValues("delete").Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
return utilerrors.NewAggregate(errs)
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// reconcileByPortMapping compares the endpoints found in existing slices with
|
// reconcileByPortMapping compares the endpoints found in existing slices with
|
||||||
|
@ -26,7 +26,6 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
||||||
|
@ -25,7 +25,6 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
@ -231,7 +230,6 @@ func (r *reconciler) finalize(endpoints *corev1.Endpoints, slices slicesByAction
|
|||||||
// be deleted.
|
// be deleted.
|
||||||
recycleSlices(&slices)
|
recycleSlices(&slices)
|
||||||
|
|
||||||
var errs []error
|
|
||||||
epsClient := r.client.DiscoveryV1beta1().EndpointSlices(endpoints.Namespace)
|
epsClient := r.client.DiscoveryV1beta1().EndpointSlices(endpoints.Namespace)
|
||||||
|
|
||||||
// Don't create more EndpointSlices if corresponding Endpoints resource is
|
// Don't create more EndpointSlices if corresponding Endpoints resource is
|
||||||
@ -244,35 +242,32 @@ func (r *reconciler) finalize(endpoints *corev1.Endpoints, slices slicesByAction
|
|||||||
if errors.HasStatusCause(err, corev1.NamespaceTerminatingCause) {
|
if errors.HasStatusCause(err, corev1.NamespaceTerminatingCause) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
errs = append(errs, fmt.Errorf("Error creating EndpointSlice for Endpoints %s/%s: %v", endpoints.Namespace, endpoints.Name, err))
|
return fmt.Errorf("failed to create EndpointSlice for Endpoints %s/%s: %v", endpoints.Namespace, endpoints.Name, err)
|
||||||
} else {
|
|
||||||
r.endpointSliceTracker.Update(createdSlice)
|
|
||||||
metrics.EndpointSliceChanges.WithLabelValues("create").Inc()
|
|
||||||
}
|
}
|
||||||
|
r.endpointSliceTracker.Update(createdSlice)
|
||||||
|
metrics.EndpointSliceChanges.WithLabelValues("create").Inc()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, endpointSlice := range slices.toUpdate {
|
for _, endpointSlice := range slices.toUpdate {
|
||||||
updatedSlice, err := epsClient.Update(context.TODO(), endpointSlice, metav1.UpdateOptions{})
|
updatedSlice, err := epsClient.Update(context.TODO(), endpointSlice, metav1.UpdateOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, fmt.Errorf("Error updating %s EndpointSlice for Endpoints %s/%s: %v", endpointSlice.Name, endpoints.Namespace, endpoints.Name, err))
|
return fmt.Errorf("failed to update %s EndpointSlice for Endpoints %s/%s: %v", endpointSlice.Name, endpoints.Namespace, endpoints.Name, err)
|
||||||
} else {
|
|
||||||
r.endpointSliceTracker.Update(updatedSlice)
|
|
||||||
metrics.EndpointSliceChanges.WithLabelValues("update").Inc()
|
|
||||||
}
|
}
|
||||||
|
r.endpointSliceTracker.Update(updatedSlice)
|
||||||
|
metrics.EndpointSliceChanges.WithLabelValues("update").Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, endpointSlice := range slices.toDelete {
|
for _, endpointSlice := range slices.toDelete {
|
||||||
err := epsClient.Delete(context.TODO(), endpointSlice.Name, metav1.DeleteOptions{})
|
err := epsClient.Delete(context.TODO(), endpointSlice.Name, metav1.DeleteOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, fmt.Errorf("Error deleting %s EndpointSlice for Endpoints %s/%s: %v", endpointSlice.Name, endpoints.Namespace, endpoints.Name, err))
|
return fmt.Errorf("failed to delete %s EndpointSlice for Endpoints %s/%s: %v", endpointSlice.Name, endpoints.Namespace, endpoints.Name, err)
|
||||||
} else {
|
|
||||||
r.endpointSliceTracker.Delete(endpointSlice)
|
|
||||||
metrics.EndpointSliceChanges.WithLabelValues("delete").Inc()
|
|
||||||
}
|
}
|
||||||
|
r.endpointSliceTracker.Delete(endpointSlice)
|
||||||
|
metrics.EndpointSliceChanges.WithLabelValues("delete").Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
return utilerrors.NewAggregate(errs)
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteEndpoints deletes any associated EndpointSlices and cleans up any
|
// deleteEndpoints deletes any associated EndpointSlices and cleans up any
|
||||||
|
Loading…
Reference in New Issue
Block a user