Fix Service reconciliation error loop (#497)

* fix service reconciliation error by adding checks for virtual service annotations

* renamed var
This commit is contained in:
Enrico Candino
2025-10-08 14:03:50 +02:00
committed by GitHub
parent 9f265c73d9
commit 7387fc1b23
2 changed files with 21 additions and 10 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ import (
"github.com/rancher/k3k/pkg/controller"
)
// newVirtualClient
// newVirtualClient creates a new Client that can be used to interact with the virtual cluster
func newVirtualClient(ctx context.Context, hostClient ctrlruntimeclient.Client, clusterName, clusterNamespace string) (ctrlruntimeclient.Client, error) {
var clusterKubeConfig v1.Secret
+20 -9
View File
@@ -41,12 +41,22 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req reconcile.Request
log := ctrl.LoggerFrom(ctx)
log.Info("ensuring service status to virtual cluster")
var hostService, virtService v1.Service
var hostService v1.Service
if err := r.HostClient.Get(ctx, req.NamespacedName, &hostService); err != nil {
return reconcile.Result{}, ctrlruntimeclient.IgnoreNotFound(err)
}
// Some services are owned by the cluster but don't have the annotations set (i.e. the kubelet svc)
// They don't exists in the virtual cluster, so we can skip them
virtualServiceName, virtualServiceNameFound := hostService.Annotations[translate.ResourceNameAnnotation]
virtualServiceNamespace, virtualServiceNamespaceFound := hostService.Annotations[translate.ResourceNamespaceAnnotation]
if !virtualServiceNameFound || !virtualServiceNamespaceFound {
log.V(1).Info(fmt.Sprintf("service %s/%s does not have virtual service annotations, skipping", hostService.Namespace, hostService.Name))
return reconcile.Result{}, nil
}
// get cluster from the object
cluster := clusterNamespacedName(&hostService)
@@ -60,17 +70,18 @@ func (r *ServiceReconciler) Reconcile(ctx context.Context, req reconcile.Request
}
virtualServiceKey := types.NamespacedName{
Name: hostService.Annotations[translate.ResourceNameAnnotation],
Namespace: hostService.Annotations[translate.ResourceNamespaceAnnotation],
Name: virtualServiceName,
Namespace: virtualServiceNamespace,
}
if err := virtualClient.Get(ctx, virtualServiceKey, &virtService); err != nil {
return reconcile.Result{}, fmt.Errorf("failed to get virt service: %v", err)
var virtualService v1.Service
if err := virtualClient.Get(ctx, virtualServiceKey, &virtualService); err != nil {
return reconcile.Result{}, fmt.Errorf("failed to get virtual service: %v", err)
}
if !equality.Semantic.DeepEqual(virtService.Status.LoadBalancer, hostService.Status.LoadBalancer) {
virtService.Status.LoadBalancer = hostService.Status.LoadBalancer
if err := virtualClient.Status().Update(ctx, &virtService); err != nil {
if !equality.Semantic.DeepEqual(virtualService.Status.LoadBalancer, hostService.Status.LoadBalancer) {
virtualService.Status.LoadBalancer = hostService.Status.LoadBalancer
if err := virtualClient.Status().Update(ctx, &virtualService); err != nil {
return reconcile.Result{}, err
}
}