Skip to content

Commit 46b8934

Browse files
committed
fix: grant more permissions to cloud node lifecycle controller
1 parent 73e4369 commit 46b8934

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

Diff for: internal/instances/instances.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func (i *Instances) InstanceExistsByProviderID(ctx context.Context, providerID s
152152
timeDiff := currTime.Sub(firstSeenTime)
153153
if inst == nil || (responseBody != nil && responseBody.StatusCode == 404) {
154154
if timeDiff < InstanceNotFoundInterval {
155-
klog.Infof("timediff: %v", timeDiff)
155+
klog.Infof("Node %v last seen: %v", providerID, timeDiff)
156156
klog.Infof("Node %v not seen for less than 2 minutes", providerID)
157157

158158
return true, nil

Diff for: internal/node/utils.go

+21-9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66

7+
"k8s.io/apimachinery/pkg/api/errors"
78
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
89
clientset "k8s.io/client-go/kubernetes"
910
cloudprovider "k8s.io/cloud-provider"
@@ -29,16 +30,22 @@ func StartCloudNodeLifecycleControllerWrapper(initContext app.ControllerInitCont
2930

3031
//nolint:gocritic // need to follow upstream function signature
3132
func startCloudNodeLifecycleController(ctx context.Context,
32-
initContext app.ControllerInitContext,
33+
_ app.ControllerInitContext,
3334
controlexContext controllermanagerapp.ControllerContext,
3435
completedConfig *config.CompletedConfig,
3536
cloud cloudprovider.Interface,
3637
) (controller.Interface, bool, error) {
38+
// Use CCM's kubeconfig to create a clientset for the custom node lifecycle controller because we need permissions
39+
// to list and delete VolumeAttachments
40+
ccmClientSet, err := clientset.NewForConfig(completedConfig.Kubeconfig)
41+
if err != nil {
42+
return nil, false, fmt.Errorf("failed to create clientset from ccm kubeconfig: %w", err)
43+
}
44+
3745
// Start the cloudNodeLifecycleController
3846
cloudNodeLifecycleController, err := NewCloudNodeLifecycleController(
3947
completedConfig.SharedInformers.Core().V1().Nodes(),
40-
// cloud node lifecycle controller uses existing cluster role from node-controller
41-
completedConfig.ClientBuilder.ClientOrDie(initContext.ClientName),
48+
ccmClientSet,
4249
cloud,
4350
completedConfig.ComponentConfig.KubeCloudShared.NodeMonitorPeriod.Duration,
4451
)
@@ -54,19 +61,24 @@ func startCloudNodeLifecycleController(ctx context.Context,
5461
}
5562

5663
func CleanUpVolumeAttachmentsForNode(ctx context.Context, kubeClient clientset.Interface, nodeName string) error {
57-
volumeAttachments, listErr := kubeClient.StorageV1().VolumeAttachments().List(ctx,
58-
metav1.ListOptions{FieldSelector: fmt.Sprintf("spec.nodeName=%s", nodeName)})
59-
64+
volumeAttachments, listErr := kubeClient.StorageV1().VolumeAttachments().List(ctx, metav1.ListOptions{})
6065
if listErr != nil {
61-
return fmt.Errorf("failed to list volume attachments for node %s: %w", nodeName, listErr)
66+
return fmt.Errorf("failed to list all volume attachments: %w", listErr)
6267
}
6368

6469
for index := range len(volumeAttachments.Items) {
6570
volumeAttachment := volumeAttachments.Items[index]
71+
if volumeAttachment.Spec.NodeName != nodeName {
72+
continue
73+
}
6674
deleteErr := kubeClient.StorageV1().VolumeAttachments().Delete(ctx, volumeAttachment.Name, metav1.DeleteOptions{})
6775
if deleteErr != nil {
68-
klog.Errorf("failed to delete volume attachment %s for node %s: %v",
69-
volumeAttachment.Name, nodeName, deleteErr)
76+
if errors.IsNotFound(deleteErr) {
77+
klog.Infof("volume attachment %s for node %s already deleted, skipping delete", volumeAttachment.Name, nodeName)
78+
} else {
79+
klog.Errorf("failed to delete volume attachment %s for node %s: %v",
80+
volumeAttachment.Name, nodeName, deleteErr)
81+
}
7082
}
7183
}
7284

0 commit comments

Comments
 (0)