Skip to content

Commit

Permalink
refactor: don't bother fetching Pods
Browse files Browse the repository at this point in the history
Signed-off-by: Mike Beaumont <mjboamail@gmail.com>
  • Loading branch information
michaelbeaumont committed May 27, 2024
1 parent 06616ea commit 13cc9e7
Showing 1 changed file with 21 additions and 24 deletions.
45 changes: 21 additions & 24 deletions pkg/plugins/runtime/k8s/controllers/meshservice_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ func (r *MeshServiceReconciler) Reconcile(ctx context.Context, req kube_ctrl.Req
return kube_ctrl.Result{}, errors.Wrap(err, "unable to list EndpointSlices for headless Service")
}

servicePodEndpoints := map[kube_types.NamespacedName]struct{}{}
servicePodEndpoints := map[kube_types.NamespacedName]kube_discovery.Endpoint{}
// We need to look at our EndpointSlice to see which Pods this headless
// service points to
var created, updated int
Expand All @@ -178,7 +178,7 @@ func (r *MeshServiceReconciler) Reconcile(ctx context.Context, req kube_ctrl.Req
endpoint.TargetRef.APIVersion != "") {
continue
}
servicePodEndpoints[kube_types.NamespacedName{Name: endpoint.TargetRef.Name, Namespace: endpoint.TargetRef.Namespace}] = struct{}{}
servicePodEndpoints[kube_types.NamespacedName{Name: endpoint.TargetRef.Name, Namespace: endpoint.TargetRef.Namespace}] = endpoint
}
}

Expand All @@ -201,29 +201,18 @@ func (r *MeshServiceReconciler) Reconcile(ctx context.Context, req kube_ctrl.Req
}
}

for current := range servicePodEndpoints {
pod := kube_core.Pod{}
if err := r.Get(
ctx,
current,
&pod,
); err != nil {
if kube_apierrs.IsNotFound(err) {
continue
}
return kube_ctrl.Result{}, errors.Wrap(err, "unable to get Pod listed in EndpointSlice of headless Service")
}
for current, endpoint := range servicePodEndpoints {
// Our name is unique depending on the service identity and pod name
canonicalNameHash := k8s.NewHasher()
canonicalNameHash.Write([]byte(svc.Name))
canonicalNameHash.Write([]byte(svc.Namespace))
canonicalName := fmt.Sprintf("%s-%s", pod.Name, k8s.HashToString(canonicalNameHash))
canonicalName := fmt.Sprintf("%s-%s", current.Name, k8s.HashToString(canonicalNameHash))
op, err := r.manageMeshService(
ctx,
svc,
mesh,
r.setFromPodAndHeadlessSvc(&pod),
kube_types.NamespacedName{Namespace: pod.Namespace, Name: canonicalName},
r.setFromPodAndHeadlessSvc(endpoint),
kube_types.NamespacedName{Namespace: current.Namespace, Name: canonicalName},
)
if err != nil {
return kube_ctrl.Result{}, errors.Wrap(err, "unable to create/update MeshService for headless Service")
Expand Down Expand Up @@ -270,10 +259,10 @@ func (r *MeshServiceReconciler) setFromClusterIPSvc(ms *meshservice_k8s.MeshServ
return nil
}

func (r *MeshServiceReconciler) setFromPodAndHeadlessSvc(pod *kube_core.Pod) func(*meshservice_k8s.MeshService, *kube_core.Service) error {
func (r *MeshServiceReconciler) setFromPodAndHeadlessSvc(endpoint kube_discovery.Endpoint) func(*meshservice_k8s.MeshService, *kube_core.Service) error {
return func(ms *meshservice_k8s.MeshService, svc *kube_core.Service) error {
if ms.ObjectMeta.GetGeneration() != 0 {
if owners := ms.GetOwnerReferences(); len(owners) == 0 || owners[0].UID != pod.GetUID() {
if owners := ms.GetOwnerReferences(); len(owners) == 0 || owners[0].UID != endpoint.TargetRef.UID {
r.EventRecorder.Eventf(
svc, kube_core.EventTypeWarning, FailedToGenerateMeshServiceReason, "MeshService already exists and isn't owned by Pod",
)
Expand All @@ -282,15 +271,23 @@ func (r *MeshServiceReconciler) setFromPodAndHeadlessSvc(pod *kube_core.Pod) fun
}
ms.Spec.Selector = meshservice_api.Selector{
DataplaneRef: &meshservice_api.DataplaneRef{
Name: pod.Name,
Name: endpoint.TargetRef.Name,
},
}
ms.Status.VIPs = []meshservice_api.VIP{
{
IP: pod.Status.PodIP,
for _, address := range endpoint.Addresses {
ms.Status.VIPs = append(ms.Status.VIPs,
meshservice_api.VIP{
IP: address,
})
}
owner := kube_core.Pod{
ObjectMeta: v1.ObjectMeta{
Name: endpoint.TargetRef.Name,
Namespace: endpoint.TargetRef.Namespace,
UID: endpoint.TargetRef.UID,
},
}
if err := kube_controllerutil.SetOwnerReference(pod, ms, r.Scheme); err != nil {
if err := kube_controllerutil.SetOwnerReference(&owner, ms, r.Scheme); err != nil {
return errors.Wrap(err, "could not set owner reference")
}
return nil
Expand Down

0 comments on commit 13cc9e7

Please sign in to comment.