Skip to content

Commit be6b64c

Browse files
committed
VirtualNode: deletion-routine refactoring
1 parent a632fee commit be6b64c

File tree

12 files changed

+414
-198
lines changed

12 files changed

+414
-198
lines changed

cmd/liqo-controller-manager/main.go

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ func main() {
227227
reqRemoteLiqoPods, err := labels.NewRequirement(consts.ManagedByLabelKey, selection.Equals, []string{consts.ManagedByShadowPodValue})
228228
utilruntime.Must(err)
229229

230+
// Create the main manager.
231+
// This manager caches only the pods that are offloaded from a remote cluster and are scheduled on this.
230232
mgr, err := ctrl.NewManager(config, ctrl.Options{
231233
MapperProvider: mapper.LiqoMapperProvider(scheme),
232234
Scheme: scheme,
@@ -257,7 +259,8 @@ func main() {
257259
utilruntime.Must(err)
258260

259261
// Create an accessory manager that cache only local offloaded pods.
260-
auxmgr, err := ctrl.NewManager(config, ctrl.Options{
262+
// This manager caches only the pods that are offloaded and scheduled on a remote cluster.
263+
auxmgrLocalPods, err := ctrl.NewManager(config, ctrl.Options{
261264
MapperProvider: mapper.LiqoMapperProvider(scheme),
262265
Scheme: scheme,
263266
MetricsBindAddress: "0", // Disable the metrics of the auxiliary manager to prevent conflicts.
@@ -275,12 +278,42 @@ func main() {
275278
klog.Errorf("Unable to create auxiliary manager: %w", err)
276279
os.Exit(1)
277280
}
278-
if err := mgr.Add(auxmgr); err != nil {
281+
282+
// Create a label selector to filter only the events for virtual kubelet pods
283+
reqVirtualKubeletPods, err := labels.NewRequirement(consts.K8sAppComponentKey, selection.Equals,
284+
[]string{vkMachinery.KubeletBaseLabels[consts.K8sAppComponentKey]})
285+
utilruntime.Must(err)
286+
287+
// Create an accessory manager that cache only local offloaded pods.
288+
// This manager caches only virtual kubelet pods.
289+
auxmgrVirtualKubeletPods, err := ctrl.NewManager(config, ctrl.Options{
290+
MapperProvider: mapper.LiqoMapperProvider(scheme),
291+
Scheme: scheme,
292+
MetricsBindAddress: "0", // Disable the metrics of the auxiliary manager to prevent conflicts.
293+
NewCache: func(config *rest.Config, opts cache.Options) (cache.Cache, error) {
294+
opts.ByObject = map[client.Object]cache.ByObject{
295+
&corev1.Pod{}: {
296+
Label: labels.NewSelector().Add(*reqVirtualKubeletPods),
297+
},
298+
}
299+
return cache.New(config, opts)
300+
},
301+
})
302+
303+
if err != nil {
304+
klog.Errorf("Unable to create auxiliary manager: %w", err)
305+
os.Exit(1)
306+
}
307+
308+
if err := mgr.Add(auxmgrLocalPods); err != nil {
279309
klog.Errorf("Unable to add the auxiliary manager to the main one: %w", err)
280310
os.Exit(1)
281311
}
282312

283-
localPodsClient := auxmgr.GetClient()
313+
if err := mgr.Add(auxmgrVirtualKubeletPods); err != nil {
314+
klog.Errorf("Unable to add the auxiliary manager to the main one: %w", err)
315+
os.Exit(1)
316+
}
284317

285318
// Register the healthiness probes.
286319
if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
@@ -307,7 +340,7 @@ func main() {
307340
os.Exit(1)
308341
}
309342

310-
if err := indexer.IndexField(ctx, auxmgr, &corev1.Pod{}, indexer.FieldNodeNameFromPod, indexer.ExtractNodeName); err != nil {
343+
if err := indexer.IndexField(ctx, auxmgrLocalPods, &corev1.Pod{}, indexer.FieldNodeNameFromPod, indexer.ExtractNodeName); err != nil {
311344
klog.Errorf("Unable to setup the indexer for the Pod nodeName field: %v", err)
312345
os.Exit(1)
313346
}
@@ -394,7 +427,8 @@ func main() {
394427
virtualNodeReconciler, err := virtualnodectrl.NewVirtualNodeReconciler(
395428
ctx,
396429
mgr.GetClient(),
397-
auxmgr.GetClient(),
430+
auxmgrLocalPods.GetClient(),
431+
auxmgrVirtualKubeletPods.GetClient(),
398432
mgr.GetScheme(),
399433
mgr.GetEventRecorderFor("virtualnode-controller"),
400434
&clusterIdentity,
@@ -485,7 +519,7 @@ func main() {
485519
podStatusReconciler := &podstatusctrl.PodStatusReconciler{
486520
Client: mgr.GetClient(),
487521
Scheme: mgr.GetScheme(),
488-
LocalPodsClient: localPodsClient,
522+
LocalPodsClient: auxmgrLocalPods.GetClient(),
489523
}
490524
if err = podStatusReconciler.SetupWithManager(mgr); err != nil {
491525
klog.Errorf("Unable to start the podstatus reconciler", err)

pkg/liqo-controller-manager/virtualnode-controller/condition.go

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,70 +15,60 @@
1515
package virtualnodectrl
1616

1717
import (
18-
"context"
19-
2018
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21-
"sigs.k8s.io/controller-runtime/pkg/client"
2219

2320
virtualkubeletv1alpha1 "github.com/liqotech/liqo/apis/virtualkubelet/v1alpha1"
2421
)
2522

26-
// VkConditionMap is a map of virtual node conditions.
27-
type VkConditionMap map[virtualkubeletv1alpha1.VirtualNodeConditionType]VkCondition
23+
// VnConditionMap is a map of virtual node conditions.
24+
type VnConditionMap map[virtualkubeletv1alpha1.VirtualNodeConditionType]VnCondition
2825

29-
// VkCondition is a virtual node condition.
30-
type VkCondition struct {
26+
// VnCondition is a virtual node condition.
27+
type VnCondition struct {
3128
Status virtualkubeletv1alpha1.VirtualNodeConditionStatusType
3229
Message string
3330
}
3431

3532
// ForgeCondition forges a virtual node condition.
3633
func ForgeCondition(
3734
virtualNode *virtualkubeletv1alpha1.VirtualNode,
38-
vkConditions VkConditionMap) (update bool) {
39-
for nameCondition, vkCondition := range vkConditions {
35+
vnConditions VnConditionMap) {
36+
for nameCondition, vnCondition := range vnConditions {
4037
for i := range virtualNode.Status.Conditions {
4138
if virtualNode.Status.Conditions[i].Type != nameCondition {
4239
continue
4340
}
44-
if virtualNode.Status.Conditions[i].Status == vkCondition.Status {
45-
return false
41+
if virtualNode.Status.Conditions[i].Status == vnCondition.Status {
42+
return
4643
}
4744
if (virtualNode.Status.Conditions[i].Status == virtualkubeletv1alpha1.RunningConditionStatusType) &&
48-
(vkCondition.Status == virtualkubeletv1alpha1.CreatingConditionStatusType) {
49-
return false
45+
(vnCondition.Status == virtualkubeletv1alpha1.CreatingConditionStatusType) {
46+
return
47+
}
48+
if (virtualNode.Status.Conditions[i].Status == virtualkubeletv1alpha1.NoneConditionStatusType) &&
49+
(vnCondition.Status == virtualkubeletv1alpha1.DrainingConditionStatusType) {
50+
return
51+
}
52+
if (virtualNode.Status.Conditions[i].Status == virtualkubeletv1alpha1.NoneConditionStatusType) &&
53+
(vnCondition.Status == virtualkubeletv1alpha1.DeletingConditionStatusType) {
54+
return
5055
}
5156
if (virtualNode.Status.Conditions[i].Status == virtualkubeletv1alpha1.DeletingConditionStatusType) &&
52-
vkCondition.Status == virtualkubeletv1alpha1.DrainingConditionStatusType {
53-
return false
57+
vnCondition.Status == virtualkubeletv1alpha1.DrainingConditionStatusType {
58+
return
5459
}
55-
virtualNode.Status.Conditions[i].Status = vkCondition.Status
60+
virtualNode.Status.Conditions[i].Status = vnCondition.Status
5661
virtualNode.Status.Conditions[i].LastTransitionTime = metav1.Now()
57-
virtualNode.Status.Conditions[i].Message = vkCondition.Message
58-
return true
62+
virtualNode.Status.Conditions[i].Message = vnCondition.Message
5963
}
6064
virtualNode.Status.Conditions = append(virtualNode.Status.Conditions,
6165
virtualkubeletv1alpha1.VirtualNodeCondition{
6266
Type: nameCondition,
63-
Status: vkCondition.Status,
67+
Status: vnCondition.Status,
6468
LastTransitionTime: metav1.Now(),
65-
Message: vkCondition.Message,
69+
Message: vnCondition.Message,
6670
})
6771
}
68-
return true
69-
}
70-
71-
// UpdateCondition updates the condition of the virtual node.
72-
func UpdateCondition(ctx context.Context, cl client.Client,
73-
virtualNode *virtualkubeletv1alpha1.VirtualNode,
74-
vkConditions VkConditionMap,
75-
) error {
76-
if ForgeCondition(virtualNode, vkConditions) {
77-
if err := cl.Status().Update(ctx, virtualNode); err != nil {
78-
return err
79-
}
80-
}
81-
return nil
8272
}
8373

8474
// GetCondition returns the condition of the virtual node.

0 commit comments

Comments
 (0)