diff --git a/cmd/acr-credential-provider/main.go b/cmd/acr-credential-provider/main.go index 6a1d0e93d4..de6ac1cb98 100644 --- a/cmd/acr-credential-provider/main.go +++ b/cmd/acr-credential-provider/main.go @@ -26,13 +26,14 @@ import ( "github.com/spf13/cobra" "k8s.io/component-base/logs" - "k8s.io/klog/v2" "sigs.k8s.io/cloud-provider-azure/pkg/credentialprovider" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/version" ) func main() { + logger := log.Background().WithName("main") rand.Seed(time.Now().UnixNano()) var RegistryMirrorStr string @@ -45,18 +46,18 @@ func main() { Version: version.Get().GitVersion, Run: func(_ *cobra.Command, args []string) { if len(args) != 1 { - klog.Errorf("Config file is not specified") + logger.Error(nil, "Config file is not specified") os.Exit(1) } acrProvider, err := credentialprovider.NewAcrProviderFromConfig(args[0], RegistryMirrorStr) if err != nil { - klog.Errorf("Failed to initialize ACR provider: %v", err) + logger.Error(err, "Failed to initialize ACR provider") os.Exit(1) } if err := NewCredentialProvider(acrProvider).Run(context.TODO()); err != nil { - klog.Errorf("Error running acr credential provider: %v", err) + logger.Error(err, "Error running acr credential provider") os.Exit(1) } }, diff --git a/cmd/cloud-controller-manager/app/controllermanager.go b/cmd/cloud-controller-manager/app/controllermanager.go index e334affd79..e5e2dcf7de 100644 --- a/cmd/cloud-controller-manager/app/controllermanager.go +++ b/cmd/cloud-controller-manager/app/controllermanager.go @@ -72,9 +72,11 @@ const ( // NewCloudControllerManagerCommand creates a *cobra.Command object with default parameters func NewCloudControllerManagerCommand() *cobra.Command { + logger := log.Background().WithName("NewCloudControllerManagerCommand") s, err := options.NewCloudControllerManagerOptions() if err != nil { - klog.Fatalf("unable to initialize command options: %v", err) + logger.Error(err, "unable to initialize command options") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } controllerAliases := names.CCMControllerAliases() @@ -89,7 +91,7 @@ func NewCloudControllerManagerCommand() *cobra.Command { c, err := s.Config(KnownControllers(), ControllersDisabledByDefault.List(), controllerAliases) if err != nil { - klog.Errorf("Run: failed to configure cloud controller manager: %v", err) + logger.Error(err, "Run: failed to configure cloud controller manager") os.Exit(1) } @@ -98,7 +100,7 @@ func NewCloudControllerManagerCommand() *cobra.Command { var err error traceProvider, err = trace.New() if err != nil { - log.Background().Error(err, "Failed to create trace provider") + logger.Error(err, "Failed to create trace provider") os.Exit(1) } @@ -107,26 +109,26 @@ func NewCloudControllerManagerCommand() *cobra.Command { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := traceProvider.Stop(ctx); err != nil { - log.Background().Error(err, "Failed to stop trace provider") + logger.Error(err, "Failed to stop trace provider") } }() trace.SetGlobalProvider(traceProvider) if err := metrics.Setup(traceProvider.DefaultMeter()); err != nil { - log.Background().Error(err, "Failed to setup cloud-provider metrics") + logger.Error(err, "Failed to setup cloud-provider metrics") os.Exit(1) } if err := armmetrics.Setup(traceProvider.DefaultMeter()); err != nil { - log.Background().Error(err, "Failed to setup ARM SDK metrics") + logger.Error(err, "Failed to setup ARM SDK metrics") os.Exit(1) } } healthHandler, err := StartHTTPServer(cmd.Context(), c.Complete(), traceProvider) if err != nil { - klog.Errorf("Run: railed to start HTTP server: %v", err) + logger.Error(err, "Run: failed to start HTTP server") os.Exit(1) } @@ -134,7 +136,7 @@ func NewCloudControllerManagerCommand() *cobra.Command { // Identity used to distinguish between multiple cloud controller manager instances id, err := os.Hostname() if err != nil { - klog.Errorf("Run: failed to get host name: %v", err) + logger.Error(err, "Run: failed to get host name") os.Exit(1) } // add a uniquifier so that two processes on the same host don't accidentally both become active @@ -151,7 +153,8 @@ func NewCloudControllerManagerCommand() *cobra.Command { c.Kubeconfig, c.ComponentConfig.Generic.LeaderElection.RenewDeadline.Duration) if err != nil { - klog.Fatalf("error creating lock: %v", err) + logger.Error(err, "error creating lock") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } // Try and become the leader and start cloud controller manager loops @@ -168,7 +171,7 @@ func NewCloudControllerManagerCommand() *cobra.Command { Callbacks: leaderelection.LeaderCallbacks{ OnStartedLeading: RunWrapper(s, c, healthHandler), OnStoppedLeading: func() { - klog.ErrorS(nil, "leaderelection lost") + logger.Error(nil, "leaderelection lost") klog.FlushAndExit(klog.ExitFlushTimeout, 1) }, }, @@ -212,10 +215,11 @@ func NewCloudControllerManagerCommand() *cobra.Command { // RunWrapper adapts the ccm boot logic to the leader elector call back function func RunWrapper(s *options.CloudControllerManagerOptions, c *cloudcontrollerconfig.Config, h *controllerhealthz.MutableHealthzHandler) func(ctx context.Context) { return func(ctx context.Context) { + logger := log.FromContextOrBackground(ctx).WithName("RunWrapper") if !c.DynamicReloadingConfig.EnableDynamicReloading { - klog.V(1).Infof("using static initialization from config file %s", c.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile) + logger.V(1).Info("using static initialization from config file", "cloudConfigFile", c.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile) if err := Run(ctx, c.Complete(), h); err != nil { - klog.Errorf("RunWrapper: failed to start cloud controller manager: %v", err) + logger.Error(err, "RunWrapper: failed to start cloud controller manager") os.Exit(1) } } @@ -223,10 +227,10 @@ func RunWrapper(s *options.CloudControllerManagerOptions, c *cloudcontrollerconf cloudConfigFile := c.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile if cloudConfigFile != "" { - klog.V(1).Infof("RunWrapper: using dynamic initialization from config file %s, starting the file watcher", cloudConfigFile) + logger.V(1).Info("using dynamic initialization from config file, starting the file watcher", "cloudConfigFile", cloudConfigFile) updateCh = dynamic.RunFileWatcherOrDie(cloudConfigFile) } else { - klog.V(1).Infof("RunWrapper: using dynamic initialization from secret %s/%s, starting the secret watcher", c.DynamicReloadingConfig.CloudConfigSecretNamespace, c.DynamicReloadingConfig.CloudConfigSecretName) + logger.V(1).Info("using dynamic initialization from secret, starting the secret watcher", "namespace", c.DynamicReloadingConfig.CloudConfigSecretNamespace, "name", c.DynamicReloadingConfig.CloudConfigSecretName) updateCh = dynamic.RunSecretWatcherOrDie(c) } @@ -235,7 +239,7 @@ func RunWrapper(s *options.CloudControllerManagerOptions, c *cloudcontrollerconf for { select { case <-updateCh: - klog.V(2).Info("RunWrapper: detected the cloud config has been updated, re-constructing the cloud controller manager") + logger.V(2).Info("detected the cloud config has been updated, re-constructing the cloud controller manager") // stop the previous goroutines cancelFunc() @@ -248,19 +252,20 @@ func RunWrapper(s *options.CloudControllerManagerOptions, c *cloudcontrollerconf // start new goroutines if needed when using config file shouldRemainStopped, err = shouldDisableCloudProvider(cloudConfigFile) if err != nil { - klog.Fatalf("RunWrapper: failed to determine if it is needed to restart all controllers: %s", err.Error()) + logger.Error(err, "failed to determine if it is needed to restart all controllers") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } if !shouldRemainStopped { - klog.Info("RunWrapper: restarting all controllers") + logger.Info("RunWrapper: restarting all controllers") cancelFunc = runAsync(s, errCh, h) } else { klog.Warningf("All controllers are stopped!") } case err := <-errCh: - klog.Errorf("RunWrapper: failed to start cloud controller manager: %v", err) + logger.Error(err, "RunWrapper: failed to start cloud controller manager") os.Exit(1) } } @@ -268,9 +273,10 @@ func RunWrapper(s *options.CloudControllerManagerOptions, c *cloudcontrollerconf } func shouldDisableCloudProvider(configFilePath string) (bool, error) { + logger := log.Background().WithName("shouldDisableCloudProvider") configBytes, err := os.ReadFile(configFilePath) if err != nil { - klog.Errorf("shouldDisableCloudProvider: failed to read %s %s", configFilePath, err.Error()) + logger.Error(err, "shouldDisableCloudProvider: failed to read", "configFilePath", configFilePath) return false, err } @@ -278,30 +284,31 @@ func shouldDisableCloudProvider(configFilePath string) (bool, error) { DisableCloudProvider bool `json:"disableCloudProvider,omitempty"` } if err = json.Unmarshal(configBytes, &c); err != nil { - klog.Errorf("shouldDisableCloudProvider: failed to unmarshal configBytes to struct: %s", err.Error()) + logger.Error(err, "shouldDisableCloudProvider: failed to unmarshal configBytes to struct") return false, err } - klog.Infof("shouldDisableCloudProvider: should disable cloud provider: %t", c.DisableCloudProvider) + logger.Info("should disable cloud provider", "disableCloudProvider", c.DisableCloudProvider) return c.DisableCloudProvider, nil } func runAsync(s *options.CloudControllerManagerOptions, errCh chan error, h *controllerhealthz.MutableHealthzHandler) context.CancelFunc { ctx, cancelFunc := context.WithCancel(context.Background()) + logger := log.FromContextOrBackground(ctx).WithName("runAsync") go func() { c, err := s.Config(KnownControllers(), ControllersDisabledByDefault.List(), names.CCMControllerAliases()) if err != nil { - klog.Errorf("RunAsync: failed to configure cloud controller manager: %v", err) + logger.Error(err, "RunAsync: failed to configure cloud controller manager") os.Exit(1) } if err := Run(ctx, c.Complete(), h); err != nil { - klog.Errorf("RunAsync: failed to run cloud controller manager: %v", err) + logger.Error(err, "RunAsync: failed to run cloud controller manager") errCh <- err } - klog.V(1).Infof("RunAsync: stopping") + logger.V(1).Info("stopping") }() return cancelFunc @@ -341,8 +348,9 @@ func StartHTTPServer(ctx context.Context, c *cloudcontrollerconfig.CompletedConf // Run runs the ExternalCMServer. This should never exit. func Run(ctx context.Context, c *cloudcontrollerconfig.CompletedConfig, h *controllerhealthz.MutableHealthzHandler) error { + logger := log.FromContextOrBackground(ctx).WithName("Run") // To help debugging, immediately log version - klog.Infof("Version: %#v", version.Get()) + logger.Info("Version", "version", version.Get()) var ( cloud cloudprovider.Interface @@ -352,24 +360,28 @@ func Run(ctx context.Context, c *cloudcontrollerconfig.CompletedConfig, h *contr if c.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile != "" { cloud, err = provider.NewCloudFromConfigFile(ctx, c.ClientBuilder, c.ComponentConfig.KubeCloudShared.CloudProvider.CloudConfigFile, true) if err != nil { - klog.Fatalf("Cloud provider azure could not be initialized: %v", err) + logger.Error(err, "Cloud provider azure could not be initialized") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } else if c.DynamicReloadingConfig.EnableDynamicReloading && c.DynamicReloadingConfig.CloudConfigSecretName != "" { cloud, err = provider.NewCloudFromSecret(ctx, c.ClientBuilder, c.DynamicReloadingConfig.CloudConfigSecretName, c.DynamicReloadingConfig.CloudConfigSecretNamespace, c.DynamicReloadingConfig.CloudConfigKey) if err != nil { - klog.Fatalf("Run: Cloud provider azure could not be initialized dynamically from secret %s/%s: %v", c.DynamicReloadingConfig.CloudConfigSecretNamespace, c.DynamicReloadingConfig.CloudConfigSecretName, err) + logger.Error(err, "Cloud provider azure could not be initialized dynamically from secret", "namespace", c.DynamicReloadingConfig.CloudConfigSecretNamespace, "name", c.DynamicReloadingConfig.CloudConfigSecretName) + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } if cloud == nil { - klog.Fatalf("cloud provider is nil, please check if the --cloud-config is set properly") + logger.Error(nil, "cloud provider is nil, please check if the --cloud-config is set properly") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } if !cloud.HasClusterID() { if c.ComponentConfig.KubeCloudShared.AllowUntaggedCloud { klog.Warning("detected a cluster without a ClusterID. A ClusterID will be required in the future. Please tag your cluster to avoid any future issues") } else { - klog.Fatalf("no ClusterID found. A ClusterID is required for the cloud provider to function properly. This check can be bypassed by setting the allow-untagged-cloud option") + logger.Error(nil, "no ClusterID found. A ClusterID is required for the cloud provider to function properly. This check can be bypassed by setting the allow-untagged-cloud option") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } @@ -377,18 +389,20 @@ func Run(ctx context.Context, c *cloudcontrollerconfig.CompletedConfig, h *contr if cz, err := configz.New(ConfigzName); err == nil { cz.Set(c.ComponentConfig) } else { - klog.Errorf("unable to register configz: %v", err) + logger.Error(err, "unable to register configz") } clientBuilder := clientbuilder.SimpleControllerClientBuilder{ ClientConfig: c.Kubeconfig, } controllerContext, err := CreateControllerContext(c, clientBuilder, ctx.Done()) if err != nil { - klog.Fatalf("error building controller context: %v", err) + logger.Error(err, "error building controller context") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } if err := startControllers(ctx, controllerContext, c, cloud, newControllerInitializers(), h); err != nil { - klog.Fatalf("error running controllers: %v", err) + logger.Error(err, "error running controllers") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } return nil @@ -397,6 +411,7 @@ func Run(ctx context.Context, c *cloudcontrollerconfig.CompletedConfig, h *contr // startControllers starts the cloud specific controller loops. func startControllers(ctx context.Context, controllerContext genericcontrollermanager.ControllerContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface, controllers map[string]initFunc, healthzHandler *controllerhealthz.MutableHealthzHandler) error { + logger := log.FromContextOrBackground(ctx).WithName("startControllers") // Initialize the cloud provider with a reference to the clientBuilder cloud.Initialize(completedConfig.ClientBuilder, ctx.Done()) // Set the informer on the user cloud object @@ -411,10 +426,10 @@ func startControllers(ctx context.Context, controllerContext genericcontrollerma continue } - klog.V(1).Infof("Starting %q", controllerName) + logger.V(1).Info("Starting controller", "controller", controllerName) ctrl, started, err := initFn(ctx, controllerContext, completedConfig, cloud) if err != nil { - klog.Errorf("Error starting %q: %s", controllerName, err.Error()) + logger.Error(err, "Error starting", "controller", controllerName) return err } if !started { @@ -430,7 +445,7 @@ func startControllers(ctx context.Context, controllerContext genericcontrollerma } } controllerChecks = append(controllerChecks, check) - klog.Infof("Started %q", controllerName) + logger.Info("Started", "controller", controllerName) time.Sleep(wait.Jitter(completedConfig.ComponentConfig.Generic.ControllerStartInterval.Duration, ControllerStartJitter)) } @@ -441,14 +456,15 @@ func startControllers(ctx context.Context, controllerContext genericcontrollerma // If apiserver is not running we should wait for some time and fail only then. This is particularly // important when we start apiserver and controller manager at the same time. if err := genericcontrollermanager.WaitForAPIServer(completedConfig.VersionedClient, 10*time.Second); err != nil { - klog.Fatalf("Failed to wait for apiserver being healthy: %v", err) + logger.Error(err, "Failed to wait for apiserver being healthy") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } - klog.V(2).Infof("startControllers: starting shared informers") + logger.V(2).Info("startControllers: starting shared informers") completedConfig.SharedInformers.Start(ctx.Done()) controllerContext.InformerFactory.Start(ctx.Done()) <-ctx.Done() - klog.V(1).Infof("startControllers: received stopping signal, exiting") + logger.V(1).Info("startControllers: received stopping signal, exiting") return nil } diff --git a/cmd/cloud-controller-manager/app/core.go b/cmd/cloud-controller-manager/app/core.go index e28700f432..ec92d46869 100644 --- a/cmd/cloud-controller-manager/app/core.go +++ b/cmd/cloud-controller-manager/app/core.go @@ -38,6 +38,7 @@ import ( cloudcontrollerconfig "sigs.k8s.io/cloud-provider-azure/cmd/cloud-controller-manager/app/config" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" nodeipamcontroller "sigs.k8s.io/cloud-provider-azure/pkg/nodeipam" nodeipamconfig "sigs.k8s.io/cloud-provider-azure/pkg/nodeipam/config" "sigs.k8s.io/cloud-provider-azure/pkg/nodeipam/ipam" @@ -83,6 +84,7 @@ func startCloudNodeLifecycleController(ctx context.Context, controllerContext ge } func startServiceController(ctx context.Context, controllerContext genericcontrollermanager.ControllerContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) (http.Handler, bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("startServiceController") // Start the service controller serviceController, err := servicecontroller.New( cloud, @@ -94,7 +96,7 @@ func startServiceController(ctx context.Context, controllerContext genericcontro ) if err != nil { // This error shouldn't fail. It lives like this as a legacy. - klog.Errorf("Failed to start service controller: %v", err) + logger.Error(err, "Failed to start service controller") return nil, false, nil } @@ -104,8 +106,9 @@ func startServiceController(ctx context.Context, controllerContext genericcontro } func startRouteController(ctx context.Context, controllerContext genericcontrollermanager.ControllerContext, completedConfig *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface) (http.Handler, bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("startRouteController") if !completedConfig.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes { - klog.Infof("Will not configure cloud provider routes, --configure-cloud-routes: %v.", completedConfig.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes) + logger.Info("Will not configure cloud provider routes", "--configure-cloud-routes", completedConfig.ComponentConfig.KubeCloudShared.ConfigureCloudRoutes) return nil, false, nil } diff --git a/cmd/cloud-controller-manager/app/dynamic/file_watcher.go b/cmd/cloud-controller-manager/app/dynamic/file_watcher.go index b612c8dc3f..0d42fff477 100644 --- a/cmd/cloud-controller-manager/app/dynamic/file_watcher.go +++ b/cmd/cloud-controller-manager/app/dynamic/file_watcher.go @@ -24,12 +24,15 @@ import ( "github.com/fsnotify/fsnotify" "k8s.io/klog/v2" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) func RunFileWatcherOrDie(path string) chan struct{} { + logger := log.Background().WithName("RunFileWatcherOrDie") watcher, err := fsnotify.NewWatcher() if err != nil { - klog.Errorf("RunFileWatcherOrDie: failed to initialize file watcher: %s", err) + logger.Error(err, "RunFileWatcherOrDie: failed to initialize file watcher") os.Exit(1) } @@ -41,12 +44,12 @@ func RunFileWatcherOrDie(path string) chan struct{} { select { case event, ok := <-watcher.Events: if !ok { - klog.Error("RunFileWatcherOrDie: events channel closed unexpectedly") + logger.Error(nil, "RunFileWatcherOrDie: events channel closed unexpectedly") _ = watcher.Close() os.Exit(1) } - klog.Infof("RunFileWatcherOrDie: found file update event: %v", event) + logger.Info("found file update event", "event", event) updateChan <- struct{}{} if strings.EqualFold(event.Name, path) && event.Op&fsnotify.Remove == fsnotify.Remove { @@ -54,12 +57,12 @@ func RunFileWatcherOrDie(path string) chan struct{} { } case err, ok := <-watcher.Errors: if !ok { - klog.Error("RunFileWatcherOrDie: errors channel closed unexpectedly") + logger.Error(nil, "RunFileWatcherOrDie: errors channel closed unexpectedly") _ = watcher.Close() os.Exit(1) } - klog.Errorf("RunFileWatcherOrDie: failed to watch file %s: %s", path, err.Error()) + logger.Error(err, "RunFileWatcherOrDie: failed to watch file", "path", path) _ = watcher.Close() os.Exit(1) } @@ -70,6 +73,7 @@ func RunFileWatcherOrDie(path string) chan struct{} { } func startWatchingOrDie(watcher *fsnotify.Watcher, path string, maxRetries int) { + logger := log.Background().WithName("startWatchingOrDie") attempt := 0 for { err := watcher.Add(path) @@ -80,7 +84,7 @@ func startWatchingOrDie(watcher *fsnotify.Watcher, path string, maxRetries int) time.Sleep(time.Second) continue } - klog.Errorf("RunFileWatcherOrDie: failed to watch %s after %d times retry", path, maxRetries) + logger.Error(err, "RunFileWatcherOrDie: failed to watch after retries", "path", path, "maxRetries", maxRetries) _ = watcher.Close() os.Exit(1) } diff --git a/cmd/cloud-controller-manager/app/dynamic/secret_watcher.go b/cmd/cloud-controller-manager/app/dynamic/secret_watcher.go index 1bab3becdf..309d52f120 100644 --- a/cmd/cloud-controller-manager/app/dynamic/secret_watcher.go +++ b/cmd/cloud-controller-manager/app/dynamic/secret_watcher.go @@ -26,10 +26,10 @@ import ( "k8s.io/client-go/informers" coreinformers "k8s.io/client-go/informers/core/v1" "k8s.io/client-go/tools/cache" - "k8s.io/klog/v2" cloudcontrollerconfig "sigs.k8s.io/cloud-provider-azure/cmd/cloud-controller-manager/app/config" "sigs.k8s.io/cloud-provider-azure/cmd/cloud-controller-manager/app/options" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) type SecretWatcher struct { @@ -50,11 +50,12 @@ func (c *SecretWatcher) Run(stopCh <-chan struct{}) error { } func RunSecretWatcherOrDie(c *cloudcontrollerconfig.Config) chan struct{} { + logger := log.Background().WithName("RunSecretWatcherOrDie") factory := informers.NewSharedInformerFactory(c.VersionedClient, options.ResyncPeriod(c)()) secretWatcher, updateCh := NewSecretWatcher(factory, c.DynamicReloadingConfig.CloudConfigSecretName, c.DynamicReloadingConfig.CloudConfigSecretNamespace) err := secretWatcher.Run(wait.NeverStop) if err != nil { - klog.Errorf("Run: failed to initialize secret watcher: %v", err) + logger.Error(err, "Run: failed to initialize secret watcher") os.Exit(1) } @@ -64,6 +65,7 @@ func RunSecretWatcherOrDie(c *cloudcontrollerconfig.Config) chan struct{} { // NewSecretWatcher creates a SecretWatcher and a signal channel to indicate // the specific secret has been updated func NewSecretWatcher(informerFactory informers.SharedInformerFactory, secretName, secretNamespace string) (*SecretWatcher, chan struct{}) { + logger := log.Background().WithName("NewSecretWatcher") secretInformer := informerFactory.Core().V1().Secrets() updateSignal := make(chan struct{}) @@ -79,7 +81,7 @@ func NewSecretWatcher(informerFactory informers.SharedInformerFactory, secretNam if strings.EqualFold(newSecret.Name, secretName) && strings.EqualFold(newSecret.Namespace, secretNamespace) { - klog.V(1).Infof("secret %s updated, sending the signal", newSecret.Name) + logger.V(1).Info("secret updated, sending the signal", "secretName", newSecret.Name) updateSignal <- struct{}{} } }, diff --git a/cmd/cloud-controller-manager/app/options/options.go b/cmd/cloud-controller-manager/app/options/options.go index c9b91b5e9a..2644eac2c2 100644 --- a/cmd/cloud-controller-manager/app/options/options.go +++ b/cmd/cloud-controller-manager/app/options/options.go @@ -48,6 +48,7 @@ import ( cloudcontrollerconfig "sigs.k8s.io/cloud-provider-azure/cmd/cloud-controller-manager/app/config" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" // add the kubernetes feature gates _ "k8s.io/controller-manager/pkg/features/register" @@ -314,11 +315,12 @@ func createRecorder(kubeClient clientset.Interface, userAgent string) record.Eve // CreateFilteredInformerFactory creates a filtered informer factory with node filtering func CreateFilteredInformerFactory(client clientset.Interface, resyncPeriod time.Duration, nodeFilterRequirements string) (informers.SharedInformerFactory, error) { + logger := log.Background().WithName("CreateFilteredInformerFactory") // Parse node label selector if nodeFilterRequirements != "" { selector, err := labels.Parse(nodeFilterRequirements) if err != nil { - klog.Errorf("Invalid label filter requirement %s, error: %v", nodeFilterRequirements, err) + logger.Error(err, "Invalid label filter requirement", "requirement", nodeFilterRequirements) return nil, err } // Create filtered informer factory diff --git a/cmd/cloud-node-manager/app/nodemanager.go b/cmd/cloud-node-manager/app/nodemanager.go index 5d7b5f0420..f75f6e3056 100644 --- a/cmd/cloud-node-manager/app/nodemanager.go +++ b/cmd/cloud-node-manager/app/nodemanager.go @@ -34,6 +34,7 @@ import ( cloudnodeconfig "sigs.k8s.io/cloud-provider-azure/cmd/cloud-node-manager/app/config" "sigs.k8s.io/cloud-provider-azure/cmd/cloud-node-manager/app/options" + "sigs.k8s.io/cloud-provider-azure/pkg/log" nodeprovider "sigs.k8s.io/cloud-provider-azure/pkg/node" "sigs.k8s.io/cloud-provider-azure/pkg/nodemanager" "sigs.k8s.io/cloud-provider-azure/pkg/version" @@ -42,9 +43,11 @@ import ( // NewCloudNodeManagerCommand creates a *cobra.Command object with default parameters func NewCloudNodeManagerCommand() *cobra.Command { + logger := log.Background().WithName("NewCloudNodeManagerCommand") s, err := options.NewCloudNodeManagerOptions() if err != nil { - klog.Fatalf("unable to initialize command options: %v", err) + logger.Error(err, "unable to initialize command options") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } cmd := &cobra.Command{ @@ -94,9 +97,10 @@ func NewCloudNodeManagerCommand() *cobra.Command { // Run runs the ExternalCMServer. This should never exit. func Run(ctx context.Context, c *cloudnodeconfig.Config) error { + logger := log.FromContextOrBackground(ctx).WithName("Run") // To help debugging, immediately log version and nodeName - klog.Infof("Version: %+v", version.Get()) - klog.Infof("NodeName: %s", c.NodeName) + logger.Info("Version", "version", version.Get()) + logger.Info("NodeName", "nodeName", c.NodeName) // Start the controller manager HTTP server var checks []healthz.HealthChecker @@ -112,7 +116,8 @@ func Run(ctx context.Context, c *cloudnodeconfig.Config) error { run := func(ctx context.Context) { if err := startControllers(ctx, c, healthzHandler); err != nil { - klog.Fatalf("error running controllers: %v", err) + logger.Error(err, "error running controllers") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } @@ -122,7 +127,8 @@ func Run(ctx context.Context, c *cloudnodeconfig.Config) error { // startControllers starts the cloud specific controller loops. func startControllers(ctx context.Context, c *cloudnodeconfig.Config, healthzHandler *controllerhealthz.MutableHealthzHandler) error { - klog.V(1).Infof("Starting cloud-node-manager...") + logger := log.FromContextOrBackground(ctx).WithName("startControllers") + logger.V(1).Info("Starting cloud-node-manager...") // Start the CloudNodeController nodeController := nodemanager.NewCloudNodeController( @@ -140,12 +146,13 @@ func startControllers(ctx context.Context, c *cloudnodeconfig.Config, healthzHan check := controllerhealthz.NamedPingChecker(c.NodeName) healthzHandler.AddHealthChecker(check) - klog.Infof("Started cloud-node-manager") + logger.Info("Started cloud-node-manager") // If apiserver is not running we should wait for some time and fail only then. This is particularly // important when we start node manager before apiserver starts. if err := genericcontrollermanager.WaitForAPIServer(c.VersionedClient, 10*time.Second); err != nil { - klog.Fatalf("Failed to wait for apiserver being healthy: %v", err) + logger.Error(err, "Failed to wait for apiserver being healthy") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } c.SharedInformers.Start(ctx.Done()) diff --git a/health-probe-proxy/main.go b/health-probe-proxy/main.go index 42fe7d2a64..9f8f14d1d1 100644 --- a/health-probe-proxy/main.go +++ b/health-probe-proxy/main.go @@ -32,6 +32,7 @@ import ( ) func main() { + logger := klog.Background().WithName("main") logs.InitLogs() defer logs.FlushLogs() @@ -43,31 +44,31 @@ func main() { targetUrl, _ := url.Parse(fmt.Sprintf("http://localhost:%s", strconv.Itoa(targetPort))) proxy := httputil.NewSingleHostReverseProxy(targetUrl) - klog.Infof("target url: %s", targetUrl) + logger.Info("Target URL", "targetURL", targetUrl) http.Handle("/", proxy) - klog.Infof("proxying from port %d to port %d", healthCheckPort, targetPort) + logger.Info("proxying between ports", "from", healthCheckPort, "to", targetPort) listener, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%s", strconv.Itoa(healthCheckPort))) if err != nil { - klog.Errorf("failed to listen on port %d: %s", targetPort, err) + logger.Error(err, "failed to listen on port", "port", targetPort) panic(err) } - klog.Infof("listening on port %d", healthCheckPort) + logger.Info("listening on port", "port", healthCheckPort) proxyListener := &proxyproto.Listener{Listener: listener} defer func(proxyListener *proxyproto.Listener) { err := proxyListener.Close() if err != nil { - klog.Errorf("failed to close proxy listener: %s", err) + logger.Error(err, "failed to close proxy listener") panic(err) } }(proxyListener) - klog.Infof("listening on port with proxy listener %d", healthCheckPort) + logger.Info("listening on port with proxy listener", "port", healthCheckPort) err = http.Serve(proxyListener, nil) if err != nil { - klog.Errorf("failed to serve: %s", err) + logger.Error(err, "failed to serve") panic(err) } } diff --git a/kubetest2-aks/deployer/build.go b/kubetest2-aks/deployer/build.go index 6edea5c088..4ef1083f6d 100644 --- a/kubetest2-aks/deployer/build.go +++ b/kubetest2-aks/deployer/build.go @@ -22,7 +22,7 @@ import ( git "github.com/go-git/go-git/v5" plumbing "github.com/go-git/go-git/v5/plumbing" - "k8s.io/klog" + "k8s.io/klog/v2" "sigs.k8s.io/kubetest2/pkg/exec" ) @@ -87,7 +87,8 @@ func (d *deployer) makeCloudProviderImages(path string) (string, error) { // makeCloudProviderImagesByPath makes CCM or CNM images with repo path. func (d *deployer) makeCloudProviderImagesByPath() (string, error) { - klog.Infof("Making Cloud provider images with repo path") + logger := klog.Background().WithName("makeCloudProviderImagesByPath") + logger.Info("Making Cloud provider images with repo path") path := d.TargetPath return d.makeCloudProviderImages(path) @@ -95,7 +96,8 @@ func (d *deployer) makeCloudProviderImagesByPath() (string, error) { // makeCloudProviderImagesByTag makes CCM or CNM images with repo refs. func (d *deployer) makeCloudProviderImagesByTag(url string) (string, error) { - klog.Infof("Making Cloud provider images with refs") + logger := klog.Background().WithName("makeCloudProviderImagesByTag") + logger.Info("Making Cloud provider images with refs") ccmPath := fmt.Sprintf("%s/cloud-provider-azure", gitClonePath) repo, err := git.PlainClone(ccmPath, false, &git.CloneOptions{ @@ -118,6 +120,7 @@ func (d *deployer) makeCloudProviderImagesByTag(url string) (string, error) { } func (d *deployer) Build() error { + logger := klog.Background().WithName("Build") err := d.verifyBuildFlags() if err != nil { return fmt.Errorf("failed to verify build flags: %v", err) @@ -134,7 +137,7 @@ func (d *deployer) Build() error { return fmt.Errorf("failed to make Cloud provider image with tag %q: %v", d.TargetTag, err) } } - klog.Infof("cloud-provider-azure image with tag %q are ready", imageTag) + logger.Info("cloud-provider-azure image are ready", "imageTag", imageTag) } return nil diff --git a/kubetest2-aks/deployer/deployer.go b/kubetest2-aks/deployer/deployer.go index 849a82e94e..06a6d27ef9 100644 --- a/kubetest2-aks/deployer/deployer.go +++ b/kubetest2-aks/deployer/deployer.go @@ -24,7 +24,7 @@ import ( "github.com/octago/sflags/gen/gpflag" "github.com/spf13/pflag" - "k8s.io/klog" + "k8s.io/klog/v2" "sigs.k8s.io/kubetest2/pkg/types" ) @@ -93,7 +93,8 @@ func (d *deployer) Version() string { func bindFlags(d *deployer) *pflag.FlagSet { flags, err := gpflag.Parse(d) if err != nil { - klog.Fatalf("unable to generate flags from deployer") + klog.ErrorS(err, "unable to generate flags from deployer") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) return nil } diff --git a/kubetest2-aks/deployer/down.go b/kubetest2-aks/deployer/down.go index 19df3b8f63..4f67e99ccc 100644 --- a/kubetest2-aks/deployer/down.go +++ b/kubetest2-aks/deployer/down.go @@ -22,11 +22,12 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources" - "k8s.io/klog" + "k8s.io/klog/v2" ) func (d *deployer) deleteResourceGroup(subscriptionID string, credential azcore.TokenCredential) error { - klog.Infof("Deleting resource group %q", d.ResourceGroupName) + logger := klog.Background().WithName("deleteResourceGroup") + logger.Info("Deleting resource group", "resourceGroup", d.ResourceGroupName) rgClient, _ := armresources.NewResourceGroupsClient(subscriptionID, credential, nil) poller, err := rgClient.BeginDelete(ctx, d.ResourceGroupName, nil) @@ -40,17 +41,20 @@ func (d *deployer) deleteResourceGroup(subscriptionID string, credential azcore. } func (d *deployer) Down() error { + logger := klog.Background().WithName("Down") // Create a credentials object. cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { - klog.Fatalf("failed to authenticate: %v", err) + klog.ErrorS(err, "failed to authenticate") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } err = d.deleteResourceGroup(subscriptionID, cred) if err != nil { - klog.Fatalf("failed to delete resource group %q: %v", d.ResourceGroupName, err) + klog.ErrorS(err, "failed to delete resource group", "resourceGroup", d.ResourceGroupName) + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } - klog.Infof("Resource group %q deleted", d.ResourceGroupName) + logger.Info("Resource group deleted", "resourceGroup", d.ResourceGroupName) return nil } diff --git a/kubetest2-aks/deployer/up.go b/kubetest2-aks/deployer/up.go index 18ef6630d1..c730b4266a 100644 --- a/kubetest2-aks/deployer/up.go +++ b/kubetest2-aks/deployer/up.go @@ -36,7 +36,7 @@ import ( armcontainerservicev2 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/klog" + "k8s.io/klog/v2" "k8s.io/utils/ptr" "sigs.k8s.io/kubetest2/pkg/exec" @@ -140,7 +140,8 @@ func init() { var err error cred, err = azidentity.NewDefaultAzureCredential(nil) if err != nil { - klog.Fatalf("failed to authenticate: %v", err) + klog.ErrorS(err, "failed to authenticate") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } }) } @@ -210,6 +211,7 @@ func (d *deployer) prepareCustomConfig() ([]byte, error) { // prepareClusterConfig generates cluster config. func (d *deployer) prepareClusterConfig(clusterID string) (*armcontainerservicev2.ManagedCluster, string, error) { + logger := klog.Background().WithName("prepareClusterConfig") configFile, err := openPath(d.ConfigPath) if err != nil { return nil, "", fmt.Errorf("failed to read cluster config file at %q: %v", d.ConfigPath, err) @@ -230,12 +232,12 @@ func (d *deployer) prepareClusterConfig(clusterID string) (*armcontainerservicev return nil, "", fmt.Errorf("failed to prepare custom config: %v", err) } - klog.Infof("Customized configurations are: %s", string(customConfig)) + logger.Info("Customized configurations", "config", string(customConfig)) encodedCustomConfig := base64.StdEncoding.EncodeToString(customConfig) clusterConfig = strings.ReplaceAll(clusterConfig, "{CUSTOM_CONFIG}", encodedCustomConfig) - klog.Infof("AKS cluster config without credential: %s", clusterConfig) + logger.Info("AKS cluster config without credential", "config", clusterConfig) mcConfig := &armcontainerservicev2.ManagedCluster{} err = json.Unmarshal([]byte(clusterConfig), mcConfig) @@ -248,10 +250,11 @@ func (d *deployer) prepareClusterConfig(clusterID string) (*armcontainerservicev } func updateAzureCredential(mcConfig *armcontainerservicev2.ManagedCluster) { - klog.Infof("Updating Azure credentials to manage cluster resource group") + logger := klog.Background().WithName("updateAzureCredential") + logger.Info("Updating Azure credentials to manage cluster resource group") if len(clientID) != 0 && len(clientSecret) != 0 { - klog.Infof("Service principal is used to manage cluster resource group") + logger.Info("Service principal is used to manage cluster resource group") // Reset `Identity` in case managed identity is defined in templates while service principal is used. mcConfig.Identity = nil mcConfig.Properties.ServicePrincipalProfile = &armcontainerservicev2.ManagedClusterServicePrincipalProfile{ @@ -262,7 +265,7 @@ func updateAzureCredential(mcConfig *armcontainerservicev2.ManagedCluster) { } // Managed identity is preferable over service principal and picked by default when creating an AKS cluster. // TODO(mainred): we can consider supporting user-assigned managed identity. - klog.Infof("System assigned managed identity is used to manage cluster resource group") + logger.Info("System assigned managed identity is used to manage cluster resource group") // Reset `ServicePrincipalProfile` in case service principal is defined in templates while managed identity is used. mcConfig.Properties.ServicePrincipalProfile = nil systemAssignedIdentity := armcontainerservicev2.ResourceIdentityTypeSystemAssigned @@ -273,7 +276,8 @@ func updateAzureCredential(mcConfig *armcontainerservicev2.ManagedCluster) { // createAKSWithCustomConfig creates an AKS cluster with custom configuration. func (d *deployer) createAKSWithCustomConfig() error { - klog.Infof("Creating the AKS cluster with custom config") + logger := klog.Background().WithName("createAKSWithCustomConfig") + logger.Info("Creating the AKS cluster with custom config") clusterID := fmt.Sprintf("/subscriptions/%s/resourcegroups/%s/providers/Microsoft.ContainerService/managedClusters/%s", subscriptionID, d.ResourceGroupName, d.ClusterName) mcConfig, encodedCustomConfig, err := d.prepareClusterConfig(clusterID) @@ -307,13 +311,14 @@ func (d *deployer) createAKSWithCustomConfig() error { return fmt.Errorf("failed to put resource: %v", err.Error()) } - klog.Infof("An AKS cluster %q in resource group %q is created", d.ClusterName, d.ResourceGroupName) + logger.Info("An AKS cluster is created", "clusterName", d.ClusterName, "resourceGroup", d.ResourceGroupName) return nil } // getAKSKubeconfig gets kubeconfig of the AKS cluster and writes it to specific path. func (d *deployer) getAKSKubeconfig() error { - klog.Infof("Retrieving AKS cluster's kubeconfig") + logger := klog.Background().WithName("getAKSKubeconfig") + logger.Info("Retrieving AKS cluster's kubeconfig") client, err := armcontainerservicev2.NewManagedClustersClient(subscriptionID, cred, nil) if err != nil { return fmt.Errorf("failed to new managed cluster client with sub ID %q: %v", subscriptionID, err) @@ -324,7 +329,7 @@ func (d *deployer) getAKSKubeconfig() error { resp, err = client.ListClusterUserCredentials(ctx, d.ResourceGroupName, d.ClusterName, nil) if err != nil { if strings.Contains(err.Error(), "404 Not Found") { - klog.Infof("failed to list cluster user credentials for 1 minute, retrying") + logger.Info("failed to list cluster user credentials for 1 minute, retrying") return false, nil } return false, fmt.Errorf("failed to list cluster user credentials with resource group name %q, cluster ID %q: %v", d.ResourceGroupName, d.ClusterName, err) @@ -349,7 +354,7 @@ func (d *deployer) getAKSKubeconfig() error { return fmt.Errorf("failed to write kubeconfig to %s", destPath) } - klog.Infof("Succeeded in getting kubeconfig of cluster %q in resource group %q", d.ClusterName, d.ResourceGroupName) + logger.Info("Succeeded in getting kubeconfig of cluster", "clusterName", d.ClusterName, "resourceGroup", d.ResourceGroupName) return nil } @@ -380,6 +385,7 @@ func (d *deployer) verifyUpFlags() error { } func (d *deployer) Up() error { + logger := klog.Background().WithName("Up") if err := d.verifyUpFlags(); err != nil { return fmt.Errorf("up flags are invalid: %v", err) } @@ -389,7 +395,7 @@ func (d *deployer) Up() error { if err != nil { return fmt.Errorf("failed to create the resource group: %v", err) } - klog.Infof("Resource group %s created", *resourceGroup.ResourceGroup.ID) + logger.Info("Resource group created", "resourceGroupID", *resourceGroup.ResourceGroup.ID) // Create the AKS cluster if err := d.createAKSWithCustomConfig(); err != nil { @@ -406,7 +412,8 @@ func (d *deployer) Up() error { func (d *deployer) IsUp() (up bool, err error) { cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { - klog.Fatalf("failed to authenticate: %v", err) + klog.ErrorS(err, "failed to authenticate") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } ctx, cancel := context.WithCancel(context.Background()) diff --git a/kubetest2-aks/go.mod b/kubetest2-aks/go.mod index 33b7f78c10..1d3414f2b8 100644 --- a/kubetest2-aks/go.mod +++ b/kubetest2-aks/go.mod @@ -12,7 +12,7 @@ require ( github.com/octago/sflags v0.3.1 github.com/spf13/pflag v1.0.6 k8s.io/apimachinery v0.33.0 - k8s.io/klog v1.0.0 + k8s.io/klog/v2 v2.130.1 k8s.io/utils v0.0.0-20241210054802-24370beab758 sigs.k8s.io/kubetest2 v0.0.0-20241216131453-22d5b1410bef ) @@ -48,5 +48,4 @@ require ( golang.org/x/sys v0.32.0 // indirect golang.org/x/text v0.24.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/klog/v2 v2.130.1 // indirect ) diff --git a/kubetest2-aks/go.sum b/kubetest2-aks/go.sum index e6adf5c5f5..e22f19fb17 100644 --- a/kubetest2-aks/go.sum +++ b/kubetest2-aks/go.sum @@ -59,7 +59,6 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.16.0 h1:k3kuOEpkc0DeY7xlL6NaaNg39xdgQbtH5mwCafHO9AQ= github.com/go-git/go-git/v5 v5.16.0/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= @@ -157,8 +156,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ= k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= diff --git a/pkg/azclient/policy/retryaftermin/retryaftermin.go b/pkg/azclient/policy/retryaftermin/retryaftermin.go index b309e73d08..6831db7e34 100644 --- a/pkg/azclient/policy/retryaftermin/retryaftermin.go +++ b/pkg/azclient/policy/retryaftermin/retryaftermin.go @@ -23,6 +23,7 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" + "k8s.io/klog/v2" ) @@ -45,6 +46,7 @@ func (p *Policy) GetMinRetryAfter() time.Duration { // Do implements the policy.Policy interface func (p *Policy) Do(req *policy.Request) (*http.Response, error) { + logger := klog.Background().WithName("Do") resp, err := req.Next() // If the request failed or the status code is >= 300, return if err != nil || resp == nil || resp.StatusCode >= 300 { @@ -54,7 +56,7 @@ func (p *Policy) Do(req *policy.Request) (*http.Response, error) { // Check if the response retry-after header is less than the minimum overrideRetryAfter := func(header http.Header, headerName string, retryAfter time.Duration) { if retryAfter < p.minRetryAfter { - klog.V(5).Infof("RetryAfterMinPolicy: retry-after value %s is less than minimum %s, removing retry-after header..", retryAfter, p.minRetryAfter) + logger.V(5).Info("RetryAfterMinPolicy: retry-after value is less than minimum, removing retry-after header", "retryAfter", retryAfter, "minimum", p.minRetryAfter) header.Del(headerName) } } @@ -76,7 +78,7 @@ func (p *Policy) Do(req *policy.Request) (*http.Response, error) { // If the retry-after value is less than the minimum, remove it overrideRetryAfter(resp.Header, headerName, retryDuration) } else { - klog.V(5).Infof("RetryAfterMinPolicy: not modifying %s header with unrecognized format: %s", headerName, retryAfter) + logger.V(5).Info("RetryAfterMinPolicy: not modifying header with unrecognized format", "headerName", headerName, "unrecognized format", retryAfter) } } } diff --git a/pkg/credentialprovider/azure_acr_helper.go b/pkg/credentialprovider/azure_acr_helper.go index d54ab32ea7..be3fc42e92 100644 --- a/pkg/credentialprovider/azure_acr_helper.go +++ b/pkg/credentialprovider/azure_acr_helper.go @@ -58,7 +58,8 @@ import ( "unicode" utilnet "k8s.io/apimachinery/pkg/util/net" - "k8s.io/klog/v2" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) const ( @@ -145,6 +146,7 @@ func performTokenExchange( directive *authDirective, tenant string, accessToken string) (string, error) { + logger := log.Background().WithName("performTokenExchange") var err error data := url.Values{ "service": []string{directive.service}, @@ -177,7 +179,7 @@ func performTokenExchange( if exchange.Header != nil { if correlationID, ok := exchange.Header["X-Ms-Correlation-Request-Id"]; ok { - klog.V(4).Infof("correlationID: %s", correlationID) + logger.V(4).Info("Got correlation ID header", "correlationID", correlationID) } } diff --git a/pkg/credentialprovider/azure_credentials.go b/pkg/credentialprovider/azure_credentials.go index aec0368b18..ab895385c7 100644 --- a/pkg/credentialprovider/azure_credentials.go +++ b/pkg/credentialprovider/azure_credentials.go @@ -26,6 +26,7 @@ import ( "sigs.k8s.io/cloud-provider-azure/pkg/azclient" "sigs.k8s.io/cloud-provider-azure/pkg/azclient/configloader" + "sigs.k8s.io/cloud-provider-azure/pkg/log" providerconfig "sigs.k8s.io/cloud-provider-azure/pkg/provider/config" "github.com/Azure/azure-sdk-for-go/sdk/azcore" @@ -33,7 +34,6 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/klog/v2" v1 "k8s.io/kubelet/pkg/apis/credentialprovider/v1" ) @@ -118,9 +118,10 @@ func NewAcrProviderFromConfig(configFile string, registryMirrorStr string) (Cred } func (a *acrProvider) GetCredentials(ctx context.Context, image string, _ []string) (*v1.CredentialProviderResponse, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetCredentials") targetloginServer, sourceloginServer := a.parseACRLoginServerFromImage(image) if targetloginServer == "" { - klog.V(2).Infof("image(%s) is not from ACR, return empty authentication", image) + logger.V(2).Info("image is not from ACR, return empty authentication", "image", image) return &v1.CredentialProviderResponse{ CacheKeyType: v1.RegistryPluginCacheKeyType, CacheDuration: &metav1.Duration{Duration: 0}, @@ -143,7 +144,7 @@ func (a *acrProvider) GetCredentials(ctx context.Context, image string, _ []stri if a.config.UseManagedIdentityExtension { username, password, err := a.getFromACR(ctx, targetloginServer) if err != nil { - klog.Errorf("error getting credentials from ACR for %s: %s", targetloginServer, err) + logger.Error(err, "error getting credentials from ACR", "targetLoginServer", targetloginServer) return nil, err } @@ -192,6 +193,7 @@ func (a *acrProvider) GetCredentials(ctx context.Context, image string, _ []stri // getFromACR gets credentials from ACR. func (a *acrProvider) getFromACR(ctx context.Context, loginServer string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getFromACR") var armAccessToken azcore.AccessToken var err error if armAccessToken, err = a.credential.GetToken(ctx, policy.TokenRequestOptions{ @@ -199,22 +201,22 @@ func (a *acrProvider) getFromACR(ctx context.Context, loginServer string) (strin fmt.Sprintf("%s/%s", AcrAudience, ".default"), }, }); err != nil { - klog.Errorf("Failed to ensure fresh service principal token: %v", err) + logger.Error(err, "Failed to ensure fresh service principal token") return "", "", err } - klog.V(4).Infof("discovering auth redirects for: %s", loginServer) + logger.V(4).Info("discovering auth redirects", "loginServer", loginServer) directive, err := receiveChallengeFromLoginServer(loginServer, "https") if err != nil { - klog.Errorf("failed to receive challenge: %s", err) + logger.Error(err, "failed to receive challenge") return "", "", err } - klog.V(4).Infof("exchanging an acr refresh_token") + logger.V(4).Info("exchanging an acr refresh_token") registryRefreshToken, err := performTokenExchange( loginServer, directive, a.config.TenantID, armAccessToken.Token) if err != nil { - klog.Errorf("failed to perform token exchange: %s", err) + logger.Error(err, "failed to perform token exchange") return "", "", err } @@ -270,6 +272,7 @@ func (a *acrProvider) processImageWithRegistryMirror(image string) (string, stri // parseRegistryMirror input format: "--registry-mirror=aaa:bbb,ccc:ddd" // output format: map[string]string{"aaa": "bbb", "ccc": "ddd"} func parseRegistryMirror(registryMirrorStr string) map[string]string { + logger := log.Background().WithName("parseRegistryMirror") registryMirror := map[string]string{} registryMirrorStr = strings.TrimSpace(registryMirrorStr) @@ -281,7 +284,7 @@ func parseRegistryMirror(registryMirrorStr string) map[string]string { for _, mapping := range strings.Split(registryMirrorStr, ",") { parts := strings.Split(mapping, ":") if len(parts) != 2 { - klog.Errorf("Invalid registry mirror format: %s", mapping) + logger.Error(nil, "Invalid registry mirror format", "mapping", mapping) continue } registryMirror[parts[0]] = parts[1] diff --git a/pkg/metrics/azure_metrics.go b/pkg/metrics/azure_metrics.go index e161c5c4b1..8f30260b46 100644 --- a/pkg/metrics/azure_metrics.go +++ b/pkg/metrics/azure_metrics.go @@ -22,9 +22,9 @@ import ( "k8s.io/component-base/metrics" "k8s.io/component-base/metrics/legacyregistry" - "k8s.io/klog/v2" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) var ( @@ -98,11 +98,12 @@ func (mc *MetricContext) ObserveOperationWithResult(isOperationSucceeded bool, l } func (mc *MetricContext) logLatency(logLevel int32, latency float64, additionalKeysAndValues ...interface{}) { + logger := log.Background().WithName("logLatency") keysAndValues := []interface{}{"latency_seconds", latency} for i, label := range metricLabels { keysAndValues = append(keysAndValues, label, mc.attributes[i]) } - klog.V(klog.Level(logLevel)).InfoS("Observed Request Latency", append(keysAndValues, additionalKeysAndValues...)...) + logger.V(int(logLevel)).Info("Observed Request Latency", append(keysAndValues, additionalKeysAndValues...)...) } // CountFailedOperation increase the number of failed operations diff --git a/pkg/node/node.go b/pkg/node/node.go index 5bd959a825..187a5c65bf 100644 --- a/pkg/node/node.go +++ b/pkg/node/node.go @@ -24,6 +24,7 @@ import ( cloudprovider "k8s.io/cloud-provider" "k8s.io/klog/v2" + "sigs.k8s.io/cloud-provider-azure/pkg/log" azureprovider "sigs.k8s.io/cloud-provider-azure/pkg/provider" "sigs.k8s.io/cloud-provider-azure/pkg/provider/config" ) @@ -35,12 +36,14 @@ type IMDSNodeProvider struct { // NewIMDSNodeProvider creates a new IMDSNodeProvider. func NewIMDSNodeProvider(ctx context.Context) *IMDSNodeProvider { + logger := log.FromContextOrBackground(ctx).WithName("NewIMDSNodeProvider") az, err := azureprovider.NewCloud(ctx, nil, &config.Config{ UseInstanceMetadata: true, VMType: "vmss", }, false) if err != nil { - klog.Fatalf("Failed to initialize Azure cloud provider: %v", err) + logger.Error(err, "Failed to initialize Azure cloud provider") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } return &IMDSNodeProvider{ diff --git a/pkg/node/nodearm.go b/pkg/node/nodearm.go index 00bf6d55c4..924a21b3fc 100644 --- a/pkg/node/nodearm.go +++ b/pkg/node/nodearm.go @@ -25,6 +25,7 @@ import ( cloudprovider "k8s.io/cloud-provider" "k8s.io/klog/v2" + "sigs.k8s.io/cloud-provider-azure/pkg/log" azureprovider "sigs.k8s.io/cloud-provider-azure/pkg/provider" ) @@ -35,11 +36,13 @@ type ARMNodeProvider struct { // NewARMNodeProvider creates a new ARMNodeProvider. func NewARMNodeProvider(ctx context.Context, cloudConfigFilePath string) *ARMNodeProvider { + logger := log.FromContextOrBackground(ctx).WithName("NewARMNodeProvider") var err error var az cloudprovider.Interface az, err = azureprovider.NewCloudFromConfigFile(ctx, nil, cloudConfigFilePath, false) if err != nil { - klog.Fatalf("Failed to initialize Azure cloud provider: %v", err) + logger.Error(err, "Failed to initialize Azure cloud provider") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } return &ARMNodeProvider{ diff --git a/pkg/nodeipam/ipam/cidr_allocator.go b/pkg/nodeipam/ipam/cidr_allocator.go index f4dfe7e8df..20aa9ca762 100644 --- a/pkg/nodeipam/ipam/cidr_allocator.go +++ b/pkg/nodeipam/ipam/cidr_allocator.go @@ -30,7 +30,8 @@ import ( informers "k8s.io/client-go/informers/core/v1" clientset "k8s.io/client-go/kubernetes" cloudprovider "k8s.io/cloud-provider" - "k8s.io/klog/v2" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // CIDRAllocatorType is the type of the allocator to use. @@ -104,6 +105,7 @@ func New(kubeClient clientset.Interface, cloud cloudprovider.Interface, nodeInfo } func listNodes(kubeClient clientset.Interface) (*corev1.NodeList, error) { + logger := log.Background().WithName("listNodes") var nodeList *corev1.NodeList // We must poll because apiserver might not be up. This error causes // controller manager to restart. @@ -114,7 +116,7 @@ func listNodes(kubeClient clientset.Interface) (*corev1.NodeList, error) { LabelSelector: labels.Everything().String(), }) if err != nil { - klog.Errorf("Failed to list all nodes: %v", err) + logger.Error(err, "Failed to list all nodes") return false, nil } return true, nil diff --git a/pkg/nodeipam/ipam/cidrset/cidr_set_test.go b/pkg/nodeipam/ipam/cidrset/cidr_set_test.go index f67825d5da..951aedc6ca 100644 --- a/pkg/nodeipam/ipam/cidrset/cidr_set_test.go +++ b/pkg/nodeipam/ipam/cidrset/cidr_set_test.go @@ -24,8 +24,9 @@ import ( "github.com/stretchr/testify/assert" + "sigs.k8s.io/cloud-provider-azure/pkg/log" + "k8s.io/component-base/metrics/testutil" - "k8s.io/klog/v2" ) const ( @@ -887,7 +888,7 @@ func TestGetBitforCIDR(t *testing.T) { description: "Get error with IPv6", }, } - + logger := log.Background().WithName("TestGetBitforCIDR") for _, tc := range cases { _, clusterCIDR, err := net.ParseCIDR(tc.clusterCIDRStr) if err != nil { @@ -905,17 +906,17 @@ func TestGetBitforCIDR(t *testing.T) { got, err := cs.getIndexForCIDR(subnetCIDR) if err == nil && tc.expectErr { - klog.Errorf("expected error but got null for %v", tc.description) + logger.Error(nil, "expected error but got null", "description", tc.description) continue } if err != nil && !tc.expectErr { - klog.Errorf("unexpected error: %v for %v", err, tc.description) + logger.Error(err, "unexpected error", "description", tc.description) continue } if got != tc.expectedBit { - klog.Errorf("expected %v, but got %v for %v", tc.expectedBit, got, tc.description) + logger.Error(nil, "expected value mismatch", "expected", tc.expectedBit, "got", got, "description", tc.description) } } } diff --git a/pkg/nodeipam/ipam/cloud_cidr_allocator.go b/pkg/nodeipam/ipam/cloud_cidr_allocator.go index c5feb75c16..561eae9b70 100644 --- a/pkg/nodeipam/ipam/cloud_cidr_allocator.go +++ b/pkg/nodeipam/ipam/cloud_cidr_allocator.go @@ -39,6 +39,7 @@ import ( netutils "k8s.io/utils/net" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/nodeipam/ipam/cidrset" providerazure "sigs.k8s.io/cloud-provider-azure/pkg/provider" nodeutil "sigs.k8s.io/cloud-provider-azure/pkg/util/controller/node" @@ -88,14 +89,16 @@ func NewCloudCIDRAllocator( allocatorParams CIDRAllocatorParams, nodeList *v1.NodeList, ) (CIDRAllocator, error) { + logger := log.Background().WithName("NewCloudCIDRAllocator") if client == nil { - klog.Fatalf("kubeClient is nil when starting NodeController") + logger.Error(nil, "kubeClient is nil when starting NodeController") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } eventBroadcaster := record.NewBroadcaster() recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cidrAllocator"}) eventBroadcaster.StartStructuredLogging(0) - klog.V(0).Infof("Sending events to api server.") + logger.V(0).Info("Sending events to api server.") eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: client.CoreV1().Events("")}) az, ok := cloud.(*providerazure.Cloud) @@ -149,13 +152,13 @@ func NewCloudCIDRAllocator( if allocatorParams.ServiceCIDR != nil { filterOutServiceRange(ca.clusterCIDRs, ca.cidrSets, allocatorParams.ServiceCIDR) } else { - klog.V(0).Info("No Service CIDR provided. Skipping filtering out service addresses.") + logger.V(0).Info("No Service CIDR provided. Skipping filtering out service addresses.") } if allocatorParams.SecondaryServiceCIDR != nil { filterOutServiceRange(ca.clusterCIDRs, ca.cidrSets, allocatorParams.SecondaryServiceCIDR) } else { - klog.V(0).Info("No Secondary Service CIDR provided. Skipping filtering out secondary service addresses.") + logger.V(0).Info("No Secondary Service CIDR provided. Skipping filtering out secondary service addresses.") } // mark the CIDRs on the existing nodes as used @@ -163,10 +166,10 @@ func NewCloudCIDRAllocator( for _, node := range nodeList.Items { node := node if len(node.Spec.PodCIDRs) == 0 { - klog.V(4).Infof("Node %v has no CIDR, ignoring", node.Name) + logger.V(4).Info("Node has no CIDR, ignoring", "nodeName", node.Name) continue } - klog.V(4).Infof("Node %v has CIDR %s, occupying it in CIDR map", node.Name, node.Spec.PodCIDR) + logger.V(4).Info("Node has CIDR, occupying it in CIDR map", "nodeName", node.Name, "podCIDR", node.Spec.PodCIDR) if err := ca.occupyCIDRs(&node); err != nil { // This will happen if: // 1. We find garbage in the podCIDRs field. Retrying is useless. @@ -195,7 +198,7 @@ func NewCloudCIDRAllocator( DeleteFunc: nodeutil.CreateDeleteNodeHandler(ca.ReleaseCIDR), }) - klog.V(0).Infof("Using cloud CIDR allocator (provider: %v)", cloud.ProviderName()) + logger.V(0).Info("Using cloud CIDR allocator", "provider", cloud.ProviderName()) return ca, nil } @@ -264,10 +267,11 @@ func (ca *cloudCIDRAllocator) updateNodeSubnetMaskSizes(ctx context.Context, nod } func (ca *cloudCIDRAllocator) Run(ctx context.Context) { + logger := log.FromContextOrBackground(ctx).WithName("Run") defer utilruntime.HandleCrash() - klog.Infof("Starting cloud CIDR allocator") - defer klog.Infof("Shutting down cloud CIDR allocator") + logger.Info("Starting cloud CIDR allocator") + defer logger.Info("Shutting down cloud CIDR allocator") if !cache.WaitForNamedCacheSync("cidrallocator", ctx.Done(), ca.nodesSynced) { return @@ -350,17 +354,19 @@ func (ca *cloudCIDRAllocator) occupyCIDRs(node *v1.Node) error { // function you have to make sure to update nodesInProcessing properly with the // disposition of the node when the work is done. func (ca *cloudCIDRAllocator) AllocateOrOccupyCIDR(node *v1.Node) error { + ctx := context.Background() + logger := log.FromContextOrBackground(ctx).WithName("AllocateOrOccupyCIDR") if node == nil || node.Spec.ProviderID == "" { return nil } if !ca.insertNodeToProcessing(node.Name) { - klog.V(2).InfoS("Node is already in a process of CIDR assignment", "node", klog.KObj(node)) + logger.V(2).Info("Node is already in a process of CIDR assignment", "node", klog.KObj(node)) return nil } - err := ca.updateNodeSubnetMaskSizes(context.Background(), node.Name, node.Spec.ProviderID) + err := ca.updateNodeSubnetMaskSizes(ctx, node.Name, node.Spec.ProviderID) if err != nil { - klog.Errorf("AllocateOrOccupyCIDR(%s): failed to update node subnet mask sizes: %v", node.Name, err) + logger.Error(err, "failed to update node subnet mask sizes", "node", node.Name) return err } ca.updateMaxSubnetMaskSizes() @@ -397,13 +403,14 @@ func (ca *cloudCIDRAllocator) AllocateOrOccupyCIDR(node *v1.Node) error { allocated.allocatedCIDRs[i] = podCIDR } - klog.V(4).Infof("Putting node %s into the work queue", node.Name) + logger.V(4).Info("Putting node into the work queue", "nodeName", node.Name) ca.nodeUpdateChannel <- allocated return nil } // updateCIDRsAllocation assigns CIDR to Node and sends an update to the API server. func (ca *cloudCIDRAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) error { + logger := log.Background().WithName("updateCIDRsAllocation") var err error var node *v1.Node defer ca.removeNodeFromProcessing(data.nodeName) @@ -413,7 +420,7 @@ func (ca *cloudCIDRAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) erro if apierrors.IsNotFound(err) { return nil // node no longer available, skip processing } - klog.Errorf("Failed while getting node %v for updating Node.Spec.PodCIDR: %s", data.nodeName, err) + logger.Error(err, "Failed while getting node for updating Node.Spec.PodCIDR", "node", data.nodeName) return err } @@ -429,17 +436,17 @@ func (ca *cloudCIDRAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) erro } } if match { - klog.V(4).Infof("Node %v already has allocated CIDR %v. It matches the proposed one.", node.Name, data.allocatedCIDRs) + logger.V(4).Info("Node already has allocated CIDR. It matches the proposed one.", "nodeName", node.Name, "allocatedCIDRs", data.allocatedCIDRs) return nil } } // node has cidrs, release the reserved if len(node.Spec.PodCIDRs) != 0 { - klog.Errorf("Node %v already has a CIDR allocated %v. Releasing the new one.", node.Name, node.Spec.PodCIDRs) + logger.Error(nil, "Node already has a CIDR allocated. Releasing the new one.", "node", node.Name, "existingPodCIDRs", node.Spec.PodCIDRs) for idx, cidr := range data.allocatedCIDRs { if releaseErr := ca.cidrSets[idx].Release(cidr); releaseErr != nil { - klog.Errorf("Error when releasing CIDR idx:%v value: %v err:%v", idx, cidr, releaseErr) + logger.Error(releaseErr, "Error when releasing CIDR", "idx", idx, "value", cidr) } } return nil @@ -452,16 +459,16 @@ func (ca *cloudCIDRAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) erro } } // failed release back to the pool - klog.Errorf("Failed to update node %v PodCIDR to %v after multiple attempts: %v", node.Name, cidrsString, err) + logger.Error(err, "Failed to update node PodCIDR after multiple attempts", "node", node.Name, "cidrs", cidrsString) nodeutil.RecordNodeStatusChange(ca.recorder, node, "CIDRAssignmentFailed") // We accept the fact that we may leak CIDRs here. This is safer than releasing // them in case when we don't know if request went through. // NodeController restart will return all falsely allocated CIDRs to the pool. if !apierrors.IsServerTimeout(err) { - klog.Errorf("CIDR assignment for node %v failed: %v. Releasing allocated CIDR", node.Name, err) + logger.Error(err, "CIDR assignment for node failed. Releasing allocated CIDR", "node", node.Name) for idx, cidr := range data.allocatedCIDRs { if releaseErr := ca.cidrSets[idx].Release(cidr); releaseErr != nil { - klog.Errorf("Error releasing allocated CIDR for node %v: %v", node.Name, releaseErr) + logger.Error(releaseErr, "Error releasing allocated CIDR for node", "node", node.Name) } } } @@ -474,13 +481,14 @@ func (ca *cloudCIDRAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) erro LastTransitionTime: metav1.Now(), }) if err != nil { - klog.Errorf("Error setting route status for node %v: %v", node.Name, err) + logger.Error(err, "Error setting route status for node", "node", node.Name) } return err } func (ca *cloudCIDRAllocator) ReleaseCIDR(node *v1.Node) error { + logger := log.Background().WithName("ReleaseCIDR") if node == nil || len(node.Spec.PodCIDRs) == 0 { return nil } @@ -495,7 +503,7 @@ func (ca *cloudCIDRAllocator) ReleaseCIDR(node *v1.Node) error { return fmt.Errorf("node:%s has an allocated cidr: %v at index:%v that does not exist in cluster cidrs configuration", node.Name, cidr, i) } - klog.V(4).Infof("release CIDR %s for node:%v", cidr, node.Name) + logger.V(4).Info("release CIDR for node", "cidr", cidr, "nodeName", node.Name) if err = ca.cidrSets[i].Release(podCIDR); err != nil { return fmt.Errorf("error when releasing CIDR %v: %w", cidr, err) } diff --git a/pkg/nodeipam/ipam/range_allocator.go b/pkg/nodeipam/ipam/range_allocator.go index f5fa8c5b87..c62bbda2e0 100644 --- a/pkg/nodeipam/ipam/range_allocator.go +++ b/pkg/nodeipam/ipam/range_allocator.go @@ -37,6 +37,7 @@ import ( "k8s.io/client-go/tools/record" "k8s.io/klog/v2" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/nodeipam/ipam/cidrset" nodeutil "sigs.k8s.io/cloud-provider-azure/pkg/util/controller/node" utilnode "sigs.k8s.io/cloud-provider-azure/pkg/util/node" @@ -74,14 +75,16 @@ type rangeAllocator struct { // Caller must ensure that ClusterCIDRs are semantically correct e.g (1 for non DualStack, 2 for DualStack etc..) // can initialize its CIDR map. NodeList is only nil in testing. func NewCIDRRangeAllocator(client clientset.Interface, nodeInformer informers.NodeInformer, allocatorParams CIDRAllocatorParams, nodeList *v1.NodeList) (CIDRAllocator, error) { + logger := log.Background().WithName("NewCIDRRangeAllocator") if client == nil { - klog.Fatalf("kubeClient is nil when starting NodeController") + logger.Error(nil, "kubeClient is nil when starting NodeController") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } eventBroadcaster := record.NewBroadcaster() recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cidrAllocator"}) eventBroadcaster.StartStructuredLogging(0) - klog.V(0).Infof("Sending events to api server.") + logger.V(0).Info("Sending events to api server.") eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: client.CoreV1().Events("")}) // create a cidrSet for each cidr we operate on @@ -109,22 +112,22 @@ func NewCIDRRangeAllocator(client clientset.Interface, nodeInformer informers.No if allocatorParams.ServiceCIDR != nil { filterOutServiceRange(ra.clusterCIDRs, ra.cidrSets, allocatorParams.ServiceCIDR) } else { - klog.V(0).Info("No Service CIDR provided. Skipping filtering out service addresses.") + logger.V(0).Info("No Service CIDR provided. Skipping filtering out service addresses.") } if allocatorParams.SecondaryServiceCIDR != nil { filterOutServiceRange(ra.clusterCIDRs, ra.cidrSets, allocatorParams.SecondaryServiceCIDR) } else { - klog.V(0).Info("No Secondary Service CIDR provided. Skipping filtering out secondary service addresses.") + logger.V(0).Info("No Secondary Service CIDR provided. Skipping filtering out secondary service addresses.") } if nodeList != nil { for i, node := range nodeList.Items { if len(node.Spec.PodCIDRs) == 0 { - klog.V(4).Infof("Node %v has no CIDR, ignoring", node.Name) + logger.V(4).Info("Node has no CIDR, ignoring", "nodeName", node.Name) continue } - klog.V(4).Infof("Node %v has CIDR %s, occupying it in CIDR map", node.Name, node.Spec.PodCIDR) + logger.V(4).Info("Node has CIDR, occupying it in CIDR map", "nodeName", node.Name, "podCIDR", node.Spec.PodCIDR) if err := ra.occupyCIDRs(&nodeList.Items[i]); err != nil { // This will happen if: // 1. We find garbage in the podCIDRs field. Retrying is useless. @@ -173,10 +176,11 @@ func NewCIDRRangeAllocator(client clientset.Interface, nodeInformer informers.No } func (r *rangeAllocator) Run(ctx context.Context) { + logger := log.FromContextOrBackground(ctx).WithName("Run") defer utilruntime.HandleCrash() - klog.Infof("Starting range CIDR allocator") - defer klog.Infof("Shutting down range CIDR allocator") + logger.Info("Starting range CIDR allocator") + defer logger.Info("Shutting down range CIDR allocator") if !cache.WaitForNamedCacheSync("cidrallocator", ctx.Done(), r.nodesSynced) { return @@ -252,11 +256,12 @@ func (r *rangeAllocator) occupyCIDRs(node *v1.Node) error { // function you have to make sure to update nodesInProcessing properly with the // disposition of the node when the work is done. func (r *rangeAllocator) AllocateOrOccupyCIDR(node *v1.Node) error { + logger := log.Background().WithName("AllocateOrOccupyCIDR") if node == nil { return nil } if !r.insertNodeToProcessing(node.Name) { - klog.V(2).Infof("Node %v is already in a process of CIDR assignment.", node.Name) + logger.V(2).Info("Node is already in a process of CIDR assignment.", "nodeName", node.Name) return nil } @@ -277,13 +282,14 @@ func (r *rangeAllocator) AllocateOrOccupyCIDR(node *v1.Node) error { } // queue the assignment - klog.V(4).Infof("Putting node %s with CIDR %v into the work queue", node.Name, allocated.allocatedCIDRs) + logger.V(4).Info("Putting node with CIDR into the work queue", "nodeName", node.Name, "allocatedCIDRs", allocated.allocatedCIDRs) r.nodeCIDRUpdateChannel <- allocated return nil } // ReleaseCIDR marks node.podCIDRs[...] as unused in our tracked cidrSets func (r *rangeAllocator) ReleaseCIDR(node *v1.Node) error { + logger := log.Background().WithName("ReleaseCIDR") if node == nil || len(node.Spec.PodCIDRs) == 0 { return nil } @@ -301,7 +307,7 @@ func (r *rangeAllocator) ReleaseCIDR(node *v1.Node) error { return fmt.Errorf("node:%s has an allocated cidr: %v at index:%v that does not exist in cluster cidrs configuration", node.Name, cidr, idx) } - klog.V(4).Infof("release CIDR %s for node:%v", cidr, node.Name) + logger.V(4).Info("release CIDR for node", "cidr", cidr, "nodeName", node.Name) if err = r.cidrSets[idx].Release(podCIDR); err != nil { return fmt.Errorf("error when releasing CIDR %v: %w", cidr, err) } @@ -312,6 +318,7 @@ func (r *rangeAllocator) ReleaseCIDR(node *v1.Node) error { // Marks all CIDRs with subNetMaskSize that belongs to serviceCIDR as used across all cidrs // so that they won't be assignable. func filterOutServiceRange(clusterCIDRs []*net.IPNet, cidrSets []*cidrset.CidrSet, serviceCIDR *net.IPNet) { + logger := log.Background().WithName("filterOutServiceRange") // Checks if service CIDR has a nonempty intersection with cluster // CIDR. It is the case if either clusterCIDR contains serviceCIDR with // clusterCIDR's Mask applied (this means that clusterCIDR contains @@ -325,12 +332,13 @@ func filterOutServiceRange(clusterCIDRs []*net.IPNet, cidrSets []*cidrset.CidrSe // at this point, len(cidrSet) == len(clusterCidr) if err := cidrSets[idx].Occupy(serviceCIDR); err != nil { - klog.Errorf("Error filtering out service cidr out cluster cidr:%v (index:%v) %v: %v", cidr, idx, serviceCIDR, err) + logger.Error(err, "Error filtering out service cidr out cluster cidr", "cidr", cidr, "index", idx, "serviceCIDR", serviceCIDR) } } } func (r *rangeAllocator) allocatePodCIDRs() ([]*net.IPNet, error) { + logger := log.Background().WithName("allocatePodCIDRs") allocatedCIDRs := make([]*net.IPNet, len(r.cidrSets)) for idx := range r.cidrSets { podCIDR, err := r.cidrSets[idx].AllocateNext() @@ -338,7 +346,7 @@ func (r *rangeAllocator) allocatePodCIDRs() ([]*net.IPNet, error) { for i := 0; i < idx; i++ { if releaseErr := r.cidrSets[idx].Release(allocatedCIDRs[i]); releaseErr != nil { // continue releasing the rest - klog.Errorf("Error releasing allocated CIDR at index %d for node: %v", i, releaseErr) + logger.Error(releaseErr, "Error releasing allocated CIDR for node", "index", i) } } return nil, fmt.Errorf("failed to allocate cidr from cluster cidr at idx:%v: %w", idx, err) @@ -350,6 +358,7 @@ func (r *rangeAllocator) allocatePodCIDRs() ([]*net.IPNet, error) { // updateCIDRsAllocation assigns CIDR to Node and sends an update to the API server. func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRetry nodeReservedCIDRs, err error) { + logger := log.Background().WithName("updateCIDRsAllocation") var node *v1.Node defer func() { @@ -365,7 +374,7 @@ func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRe klog.Warningf("Failed to get node %s: not found", data.nodeName) return data, nil } - klog.Errorf("Failed while getting node %v for updating Node.Spec.PodCIDRs: %v", data.nodeName, err) + logger.Error(err, "Failed while getting node for updating Node.Spec.PodCIDRs", "node", data.nodeName) return data, err } @@ -392,17 +401,17 @@ func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRe } } if match { - klog.V(4).Infof("Node %v already has allocated CIDR %v. It matches the proposed one.", node.Name, data.allocatedCIDRs) + logger.V(4).Info("Node already has allocated CIDR. It matches the proposed one.", "nodeName", node.Name, "allocatedCIDRs", data.allocatedCIDRs) return data, nil } } // node has cidrs, release the reserved if len(node.Spec.PodCIDRs) != 0 { - klog.Errorf("Node %v already has a CIDR allocated %v. Releasing the new one.", node.Name, node.Spec.PodCIDRs) + logger.Error(nil, "Node already has a CIDR allocated. Releasing the new one.", "node", node.Name, "existingPodCIDRs", node.Spec.PodCIDRs) for idx, cidr := range data.allocatedCIDRs { if releaseErr := r.cidrSets[idx].Release(cidr); releaseErr != nil { - klog.Errorf("Error when releasing CIDR idx:%v value: %v err:%v", idx, cidr, releaseErr) + logger.Error(releaseErr, "Error when releasing CIDR", "idx", idx, "value", cidr) } } return data, nil @@ -415,16 +424,16 @@ func (r *rangeAllocator) updateCIDRsAllocation(data nodeReservedCIDRs) (dataToRe } } // failed release back to the pool - klog.Errorf("Failed to update node %v PodCIDR to %v after multiple attempts: %v", node.Name, cidrsString, err) + logger.Error(err, "Failed to update node PodCIDR after multiple attempts", "node", node.Name, "cidrs", cidrsString) nodeutil.RecordNodeStatusChange(r.recorder, node, "CIDRAssignmentFailed") // We accept the fact that we may leak CIDRs here. This is safer than releasing // them in case when we don't know if request went through. // NodeController restart will return all falsely allocated CIDRs to the pool. if !apierrors.IsServerTimeout(err) { - klog.Errorf("CIDR assignment for node %v failed: %v. Releasing allocated CIDR", node.Name, err) + logger.Error(err, "CIDR assignment for node failed. Releasing allocated CIDR", "node", node.Name) for idx, cidr := range data.allocatedCIDRs { if releaseErr := r.cidrSets[idx].Release(cidr); releaseErr != nil { - klog.Errorf("Error releasing allocated CIDR for node %v: %v", node.Name, releaseErr) + logger.Error(releaseErr, "Error releasing allocated CIDR for node", "node", node.Name) } } data.allocatedCIDRs = nil diff --git a/pkg/nodeipam/node_ipam_controller.go b/pkg/nodeipam/node_ipam_controller.go index 0830f12388..19d988705f 100644 --- a/pkg/nodeipam/node_ipam_controller.go +++ b/pkg/nodeipam/node_ipam_controller.go @@ -35,6 +35,7 @@ import ( "k8s.io/component-base/metrics/legacyregistry" "k8s.io/klog/v2" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/nodeipam/ipam" ) @@ -119,14 +120,16 @@ func NewNodeIpamController( nodeCIDRMaskSizes []int, allocatorType ipam.CIDRAllocatorType) (*Controller, error) { + logger := log.Background().WithName("NewNodeIpamController") if kubeClient == nil { - klog.Fatalf("kubeClient is nil when starting Controller") + logger.Error(nil, "kubeClient is nil when starting Controller") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartStructuredLogging(0) - klog.Infof("Sending events to api server.") + logger.Info("Sending events to api server") eventBroadcaster.StartRecordingToSink( &v1core.EventSinkImpl{ Interface: kubeClient.CoreV1().Events(""), @@ -139,7 +142,8 @@ func NewNodeIpamController( // Cloud CIDR allocator does not rely on clusterCIDR or nodeCIDRMaskSize for allocation. if allocatorType != ipam.CloudAllocatorType { if len(clusterCIDRs) == 0 { - klog.Fatal("Controller: Must specify --cluster-cidr if --allocate-node-cidrs is set") + logger.Error(nil, "Controller: Must specify --cluster-cidr if --allocate-node-cidrs is set") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } // TODO: (khenidak) IPv6DualStack beta: @@ -150,7 +154,8 @@ func NewNodeIpamController( for idx, cidr := range clusterCIDRs { mask := cidr.Mask if maskSize, _ := mask.Size(); maskSize > nodeCIDRMaskSizes[idx] { - klog.Fatal("Controller: Invalid --cluster-cidr, mask size of cluster CIDR must be less than or equal to --node-cidr-mask-size configured for CIDR family") + logger.Error(nil, "Controller: Invalid --cluster-cidr, mask size of cluster CIDR must be less than or equal to --node-cidr-mask-size configured for CIDR family") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } } @@ -188,10 +193,11 @@ func NewNodeIpamController( // Run starts an asynchronous loop that monitors the status of cluster nodes. func (nc *Controller) Run(ctx context.Context) { + logger := log.FromContextOrBackground(ctx).WithName("Run") defer utilruntime.HandleCrash() - klog.Infof("Starting ipam controller") - defer klog.Infof("Shutting down ipam controller") + logger.Info("Starting ipam controller") + defer logger.Info("Shutting down ipam controller") if !cache.WaitForNamedCacheSync("node", ctx.Done(), nc.nodeInformerSynced) { return diff --git a/pkg/nodemanager/nodemanager.go b/pkg/nodemanager/nodemanager.go index e256ebadd9..bc1a856bdb 100644 --- a/pkg/nodemanager/nodemanager.go +++ b/pkg/nodemanager/nodemanager.go @@ -47,6 +47,7 @@ import ( "k8s.io/klog/v2" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // NodeProvider defines the interfaces for node provider. @@ -139,15 +140,15 @@ func NewCloudNodeController( nodeProvider NodeProvider, nodeStatusUpdateFrequency time.Duration, waitForRoutes, enableBetaTopologyLabels bool) *CloudNodeController { - + logger := log.Background().WithName("NewCloudNodeController") eventBroadcaster := record.NewBroadcaster() recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cloud-node-controller"}) eventBroadcaster.StartLogging(klog.Infof) if kubeClient != nil { - klog.V(0).Infof("Sending events to api server.") + logger.V(0).Info("Sending events to api server.") eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")}) } else { - klog.V(0).Infof("No api server defined - no events will be sent to API server.") + logger.V(0).Info("No api server defined - no events will be sent to API server.") } cnc := &CloudNodeController{ @@ -192,6 +193,7 @@ func (cnc *CloudNodeController) Run(ctx context.Context) { // UpdateNodeStatus updates the node status, such as node addresses func (cnc *CloudNodeController) UpdateNodeStatus(ctx context.Context) { + logger := log.FromContextOrBackground(ctx).WithName("UpdateNodeStatus") node, err := cnc.nodeInformer.Lister().Get(cnc.nodeName) if err != nil { // If node not found, just ignore it. @@ -199,18 +201,18 @@ func (cnc *CloudNodeController) UpdateNodeStatus(ctx context.Context) { return } - klog.Errorf("Error getting node %q from informer, err: %v", cnc.nodeName, err) + logger.Error(err, "Error getting node from informer", "node", cnc.nodeName) return } err = cnc.updateNodeAddress(ctx, node) if err != nil { - klog.Errorf("Error reconciling node address for node %q, err: %v", node.Name, err) + logger.Error(err, "Error reconciling node address for node", "node", node.Name) } err = cnc.reconcileNodeLabels(node) if err != nil { - klog.Errorf("Error reconciling node labels for node %q, err: %v", node.Name, err) + logger.Error(err, "Error reconciling node labels for node", "node", node.Name) } } @@ -256,10 +258,11 @@ func (cnc *CloudNodeController) reconcileNodeLabels(node *v1.Node) error { // UpdateNodeAddress updates the nodeAddress of a single node func (cnc *CloudNodeController) updateNodeAddress(ctx context.Context, node *v1.Node) error { + logger := log.FromContextOrBackground(ctx).WithName("updateNodeAddress") // Do not process nodes that are still tainted cloudTaint := GetCloudTaint(node.Spec.Taints) if cloudTaint != nil { - klog.V(5).Infof("This node %s is still tainted. Will not process.", node.Name) + logger.V(5).Info("This node is still tainted. Will not process.", "nodeName", node.Name) return nil } @@ -269,7 +272,7 @@ func (cnc *CloudNodeController) updateNodeAddress(ctx context.Context, node *v1. // Continue to update node address when not sure the node is not exists klog.Warningf("ensureNodeExistsByProviderID (node %s) reported an error (%v), continue to update its address", node.Name, err) } else if !exists { - klog.V(4).Infof("The node %s is no longer present according to the cloud provider, do not process.", node.Name) + logger.V(4).Info("The node is no longer present according to the cloud provider, do not process.", "nodeName", node.Name) return nil } @@ -279,7 +282,7 @@ func (cnc *CloudNodeController) updateNodeAddress(ctx context.Context, node *v1. } if len(nodeAddresses) == 0 { - klog.V(5).Infof("Skipping node address update for node %q since cloud provider did not return any", node.Name) + logger.V(5).Info("Skipping node address update since cloud provider did not return any", "nodeName", node.Name) return nil } @@ -365,7 +368,8 @@ func (cnc *CloudNodeController) AddCloudNode(ctx context.Context, obj interface{ // This processes nodes that were added into the cluster, and cloud initialize them if appropriate func (cnc *CloudNodeController) initializeNode(ctx context.Context, node *v1.Node) { - klog.Infof("Initializing node %s with cloud provider", node.Name) + logger := log.FromContextOrBackground(ctx).WithName("initializeNode") + logger.Info("Initializing node with cloud provider", "node", node.Name) curNode, err := cnc.kubeClient.CoreV1().Nodes().Get(ctx, node.Name, metav1.GetOptions{}) if err != nil { utilruntime.HandleError(fmt.Errorf("failed to get node %s: %w", node.Name, err)) @@ -428,7 +432,7 @@ func (cnc *CloudNodeController) initializeNode(ctx context.Context, node *v1.Nod return err } - klog.Infof("Successfully initialized node %s with cloud provider", node.Name) + logger.Info("Successfully initialized node with cloud provider", "node", node.Name) return nil }) if err != nil { @@ -509,7 +513,8 @@ func (cnc *CloudNodeController) getNodeModifiersFromCloudProvider(ctx context.Co // addCloudNodeLabel creates a nodeModifier that adds a label to a node. func addCloudNodeLabel(key, value string) func(*v1.Node) { - klog.V(2).Infof("Adding node label from cloud provider: %s=%s", key, value) + logger := log.Background().WithName("addCloudNodeLabel") + logger.V(2).Info("Adding node label from cloud provider", "key", key, "value", value) return func(node *v1.Node) { if node.Labels == nil { node.Labels = map[string]string{} @@ -652,19 +657,19 @@ func (cnc *CloudNodeController) getPlatformSubFaultDomain(ctx context.Context) ( } func (cnc *CloudNodeController) updateNetworkingCondition(node *v1.Node, networkReady bool) error { + logger := log.Background().WithName("updateNetworkingCondition") _, condition := nodeutil.GetNodeCondition(&(node.Status), v1.NodeNetworkUnavailable) if networkReady && condition != nil && condition.Status == v1.ConditionFalse { - klog.V(4).Infof("set node %v with NodeNetworkUnavailable=false was canceled because it is already set", node.Name) + logger.V(4).Info("set node with NodeNetworkUnavailable=false was canceled because it is already set", "nodeName", node.Name) return nil } if !networkReady && condition != nil && condition.Status == v1.ConditionTrue { - klog.V(4).Infof("set node %v with NodeNetworkUnavailable=true was canceled because it is already set", node.Name) + logger.V(4).Info("set node with NodeNetworkUnavailable=true was canceled because it is already set", "nodeName", node.Name) return nil } - klog.V(2).Infof("Patching node status %v with %v previous condition was:%+v", node.Name, networkReady, condition) - + logger.V(2).Info("Patching node status", "nodeName", node.Name, "networkReady", networkReady, "previousCondition", condition) // either condition is not there, or has a value != to what we need // start setting it err := clientretry.RetryOnConflict(updateNetworkConditionBackoff, func() error { @@ -690,13 +695,13 @@ func (cnc *CloudNodeController) updateNetworkingCondition(node *v1.Node, network }) } if err != nil { - klog.V(4).Infof("Error updating node %s, retrying: %v", types.NodeName(node.Name), err) + logger.V(4).Info("Error updating node, retrying", "nodeName", types.NodeName(node.Name), "error", err) } return err }) if err != nil { - klog.Errorf("Error updating node %s: %v", node.Name, err) + logger.Error(err, "Error updating node", "node", node.Name) } return err diff --git a/pkg/provider/azure.go b/pkg/provider/azure.go index 6dec5d5822..c2b94f8170 100644 --- a/pkg/provider/azure.go +++ b/pkg/provider/azure.go @@ -44,6 +44,7 @@ import ( "sigs.k8s.io/cloud-provider-azure/pkg/azclient/configloader" azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/provider/config" azureconfig "sigs.k8s.io/cloud-provider-azure/pkg/provider/config" "sigs.k8s.io/cloud-provider-azure/pkg/provider/privatelinkservice" @@ -194,6 +195,7 @@ func NewCloud(ctx context.Context, clientBuilder cloudprovider.ControllerClientB } func NewCloudFromConfigFile(ctx context.Context, clientBuilder cloudprovider.ControllerClientBuilder, configFilePath string, calFromCCM bool) (cloudprovider.Interface, error) { + logger := log.FromContextOrBackground(ctx).WithName("NewCloudFromConfigFile") var ( cloud cloudprovider.Interface err error @@ -204,14 +206,15 @@ func NewCloudFromConfigFile(ctx context.Context, clientBuilder cloudprovider.Con var configFile *os.File configFile, err = os.Open(configFilePath) if err != nil { - klog.Fatalf("Couldn't open cloud provider configuration %s: %#v", - configFilePath, err) + logger.Error(err, "Couldn't open cloud provider configuration", "configFilePath", configFilePath) + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } defer configFile.Close() configValue, err = config.ParseConfig(configFile) if err != nil { - klog.Fatalf("Failed to parse Azure cloud provider config: %v", err) + logger.Error(err, "Failed to parse Azure cloud provider config") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } cloud, err = NewCloud(ctx, clientBuilder, configValue, calFromCCM && configFilePath != "") @@ -255,6 +258,7 @@ var ( // InitializeCloudFromConfig initializes the Cloud from config. func (az *Cloud) InitializeCloudFromConfig(ctx context.Context, config *config.Config, _, callFromCCM bool) error { + logger := log.FromContextOrBackground(ctx).WithName("InitializeCloudFromConfig") if config == nil { // should not reach here return fmt.Errorf("InitializeCloudFromConfig: cannot initialize from nil config") @@ -398,7 +402,7 @@ func (az *Cloud) InitializeCloudFromConfig(ctx context.Context, config *config.C return fmt.Errorf("useInstanceMetadata must be enabled without Azure credentials") } - klog.V(2).Infof("Azure cloud provider is starting without credentials") + logger.V(2).Info("Azure cloud provider is starting without credentials") } if az.ARMClientConfig.UserAgent == "" { @@ -419,7 +423,7 @@ func (az *Cloud) InitializeCloudFromConfig(ctx context.Context, config *config.C if err != nil { return err } - klog.InfoS("Setting up ARM client factory for network resources", "subscriptionID", networkSubscriptionID) + logger.Info("Setting up ARM client factory for network resources", "subscriptionID", networkSubscriptionID) az.ComputeClientFactory, err = newARMClientFactory(&azclient.ClientFactoryConfig{ SubscriptionID: az.SubscriptionID, @@ -427,7 +431,7 @@ func (az *Cloud) InitializeCloudFromConfig(ctx context.Context, config *config.C if err != nil { return err } - klog.InfoS("Setting up ARM client factory for compute resources", "subscriptionID", az.SubscriptionID) + logger.Info("Setting up ARM client factory for compute resources", "subscriptionID", az.SubscriptionID) } networkClientFactory := az.NetworkClientFactory @@ -497,7 +501,7 @@ func (az *Cloud) InitializeCloudFromConfig(ctx context.Context, config *config.C // wait for the success first time of syncing zones err = az.syncRegionZonesMap(ctx) if err != nil { - klog.Errorf("InitializeCloudFromConfig: failed to sync regional zones map for the first time: %s", err.Error()) + logger.Error(err, "Failed to sync regional zones map for the first time") return err } @@ -539,8 +543,9 @@ func (az *Cloud) checkEnableMultipleStandardLoadBalancers() error { } func (az *Cloud) initCaches() (err error) { + logger := log.Background().WithName("initCaches") if az.Config.DisableAPICallCache { - klog.Infof("API call cache is disabled, ignore logs about cache operations") + logger.Info("API call cache is disabled, ignore logs about cache operations") } az.vmCache, err = az.newVMCache() @@ -585,6 +590,7 @@ func (az *Cloud) setLBDefaults(config *azureconfig.Config) error { } func (az *Cloud) setCloudProviderBackoffDefaults(config *azureconfig.Config) wait.Backoff { + logger := log.Background().WithName("setCloudProviderBackoffDefaults") // Conditionally configure resource request backoff resourceRequestBackoff := wait.Backoff{ Steps: 1, @@ -611,11 +617,11 @@ func (az *Cloud) setCloudProviderBackoffDefaults(config *azureconfig.Config) wai Duration: time.Duration(config.CloudProviderBackoffDuration) * time.Second, Jitter: config.CloudProviderBackoffJitter, } - klog.V(2).Infof("Azure cloudprovider using try backoff: retries=%d, exponent=%f, duration=%d, jitter=%f", - config.CloudProviderBackoffRetries, - config.CloudProviderBackoffExponent, - config.CloudProviderBackoffDuration, - config.CloudProviderBackoffJitter) + logger.V(2).Info("Azure cloudprovider using try backoff", + "retries", config.CloudProviderBackoffRetries, + "exponent", config.CloudProviderBackoffExponent, + "duration", config.CloudProviderBackoffDuration, + "jitter", config.CloudProviderBackoffJitter) } else { // CloudProviderBackoffRetries will be set to 1 by default as the requirements of Azure SDK. config.CloudProviderBackoffRetries = 1 @@ -684,7 +690,8 @@ func (az *Cloud) ProviderName() string { // SetInformers sets informers for Azure cloud provider. func (az *Cloud) SetInformers(informerFactory informers.SharedInformerFactory) { - klog.Infof("Setting up informers for Azure cloud provider") + logger := log.Background().WithName("SetInformers") + logger.Info("Setting up informers for Azure cloud provider") nodeInformer := informerFactory.Core().V1().Nodes().Informer() _, _ = nodeInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { @@ -705,18 +712,18 @@ func (az *Cloud) SetInformers(informerFactory informers.SharedInformerFactory) { if !isNode { deletedState, ok := obj.(cache.DeletedFinalStateUnknown) if !ok { - klog.Errorf("Received unexpected object: %v", obj) + logger.Error(nil, "Received unexpected object", "obj", obj) return } node, ok = deletedState.Obj.(*v1.Node) if !ok { - klog.Errorf("DeletedFinalStateUnknown contained non-Node object: %v", deletedState.Obj) + logger.Error(nil, "DeletedFinalStateUnknown contained non-Node object", "obj", deletedState.Obj) return } } az.updateNodeCaches(node, nil) - klog.V(4).Infof("Removing node %s from VMSet cache.", node.Name) + logger.V(4).Info("Removing node from VMSet cache", "node", node.Name) _ = az.VMSet.DeleteCacheForNode(context.Background(), node.Name) }, }) @@ -730,6 +737,7 @@ func (az *Cloud) SetInformers(informerFactory informers.SharedInformerFactory) { // updateNodeCaches updates local cache for node's zones and external resource groups. func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) { + logger := log.Background().WithName("updateNodeCaches") az.nodeCachesLock.Lock() defer az.nodeCachesLock.Unlock() @@ -755,8 +763,7 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) { managed, ok := prevNode.ObjectMeta.Labels[consts.ManagedByAzureLabel] isNodeManagedByCloudProvider := !ok || !strings.EqualFold(managed, consts.NotManagedByAzureLabelValue) - klog.Infof("managed=%v, ok=%v, isNodeManagedByCloudProvider=%v", - managed, ok, isNodeManagedByCloudProvider) + logger.Info("node management status", "managed", managed, "ok", ok, "isNodeManagedByCloudProvider", isNodeManagedByCloudProvider) // Remove from unmanagedNodes cache if !isNodeManagedByCloudProvider { @@ -765,7 +772,7 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) { // Remove from nodePrivateIPs cache. for _, address := range getNodePrivateIPAddresses(prevNode) { - klog.V(6).Infof("removing IP address %s of the node %s", address, prevNode.Name) + logger.V(6).Info("removing IP address of the node", "address", address, "node", prevNode.Name) az.nodePrivateIPs[prevNode.Name].Delete(address) delete(az.nodePrivateIPToNodeNameMap, address) } @@ -807,11 +814,11 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) { switch { case !isNodeManagedByCloudProvider: az.excludeLoadBalancerNodes.Insert(newNode.ObjectMeta.Name) - klog.V(6).Infof("excluding Node %q from LoadBalancer because it is not managed by cloud provider", newNode.ObjectMeta.Name) + logger.V(6).Info("excluding Node from LoadBalancer because it is not managed by cloud provider", "node", newNode.ObjectMeta.Name) case hasExcludeBalancerLabel: az.excludeLoadBalancerNodes.Insert(newNode.ObjectMeta.Name) - klog.V(6).Infof("excluding Node %q from LoadBalancer because it has exclude-from-external-load-balancers label", newNode.ObjectMeta.Name) + logger.V(6).Info("excluding Node from LoadBalancer because it has exclude-from-external-load-balancers label", "node", newNode.ObjectMeta.Name) default: // Nodes not falling into the three cases above are valid backends and @@ -825,7 +832,7 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) { az.nodePrivateIPToNodeNameMap = make(map[string]string) } - klog.V(6).Infof("adding IP address %s of the node %s", address, newNode.Name) + logger.V(6).Info("adding IP address of the node", "address", address, "node", newNode.Name) az.nodePrivateIPs[strings.ToLower(newNode.Name)] = utilsets.SafeInsert(az.nodePrivateIPs[strings.ToLower(newNode.Name)], address) az.nodePrivateIPToNodeNameMap[address] = newNode.Name } @@ -834,6 +841,7 @@ func (az *Cloud) updateNodeCaches(prevNode, newNode *v1.Node) { // updateNodeTaint updates node out-of-service taint func (az *Cloud) updateNodeTaint(node *v1.Node) { + logger := log.Background().WithName("updateNodeTaint") if node == nil { klog.Warningf("node is nil, skip updating node out-of-service taint (should not happen)") return @@ -845,18 +853,18 @@ func (az *Cloud) updateNodeTaint(node *v1.Node) { if isNodeReady(node) { if err := cloudnodeutil.RemoveTaintOffNode(az.KubeClient, node.Name, node, nodeOutOfServiceTaint); err != nil { - klog.Errorf("failed to remove taint %s from the node %s", v1.TaintNodeOutOfService, node.Name) + logger.Error(err, "failed to remove taint from the node", "taint", v1.TaintNodeOutOfService, "node", node.Name) } } else { // node shutdown taint is added when cloud provider determines instance is shutdown if !taints.TaintExists(node.Spec.Taints, nodeOutOfServiceTaint) && taints.TaintExists(node.Spec.Taints, nodeShutdownTaint) { - klog.V(2).Infof("adding %s taint to node %s", v1.TaintNodeOutOfService, node.Name) + logger.V(2).Info("adding taint to node", "taint", v1.TaintNodeOutOfService, "node", node.Name) if err := cloudnodeutil.AddOrUpdateTaintOnNode(az.KubeClient, node.Name, nodeOutOfServiceTaint); err != nil { - klog.Errorf("failed to add taint %s to the node %s", v1.TaintNodeOutOfService, node.Name) + logger.Error(err, "failed to add taint to the node", "taint", v1.TaintNodeOutOfService, "node", node.Name) } } else { - klog.V(2).Infof("node %s is not ready but either shutdown taint is missing or out-of-service taint is already added, skip adding node out-of-service taint", node.Name) + logger.V(2).Info("node is not ready but either shutdown taint is missing or out-of-service taint is already added, skip adding node out-of-service taint", "node", node.Name) } } } diff --git a/pkg/provider/azure_controller_common.go b/pkg/provider/azure_controller_common.go index c2c7b9e5ae..5863465965 100644 --- a/pkg/provider/azure_controller_common.go +++ b/pkg/provider/azure_controller_common.go @@ -26,9 +26,9 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6" - "k8s.io/klog/v2" "sigs.k8s.io/cloud-provider-azure/pkg/azclient" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) const ( @@ -55,6 +55,7 @@ type ExtendedLocation struct { } func FilterNonExistingDisks(ctx context.Context, clientFactory azclient.ClientFactory, unfilteredDisks []*armcompute.DataDisk) []*armcompute.DataDisk { + logger := log.FromContextOrBackground(ctx).WithName("FilterNonExistingDisks") filteredDisks := []*armcompute.DataDisk{} for _, disk := range unfilteredDisks { filter := false @@ -62,12 +63,12 @@ func FilterNonExistingDisks(ctx context.Context, clientFactory azclient.ClientFa diSKURI := *disk.ManagedDisk.ID exist, err := checkDiskExists(ctx, clientFactory, diSKURI) if err != nil { - klog.Errorf("checkDiskExists(%s) failed with error: %v", diSKURI, err) + logger.Error(err, "checkDiskExists failed", "diskURI", diSKURI) } else { // only filter disk when checkDiskExists returns filter = !exist if filter { - klog.Errorf("disk(%s) does not exist, removed from data disk list", diSKURI) + logger.Error(nil, "disk does not exist, removed from data disk list", "diskURI", diSKURI) } } } diff --git a/pkg/provider/azure_controller_standard.go b/pkg/provider/azure_controller_standard.go index f4a69d3744..0d5b6287d4 100644 --- a/pkg/provider/azure_controller_standard.go +++ b/pkg/provider/azure_controller_standard.go @@ -30,11 +30,13 @@ import ( "k8s.io/utils/ptr" azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" ) // AttachDisk attaches a disk to vm func (as *availabilitySet) AttachDisk(ctx context.Context, nodeName types.NodeName, diskMap map[string]*AttachDiskOptions) error { + logger := log.FromContextOrBackground(ctx).WithName("AttachDisk") vm, err := as.getVirtualMachine(ctx, nodeName, azcache.CacheReadTypeDefault) if err != nil { return err @@ -63,7 +65,7 @@ func (as *availabilitySet) AttachDisk(ctx context.Context, nodeName types.NodeNa } } if attached { - klog.V(2).Infof("azureDisk - disk(%s) already attached to node(%s) on LUN(%d)", diskURI, nodeName, opt.Lun) + logger.V(2).Info("azureDisk - disk already attached to node on LUN", "diskURI", diskURI, "nodeName", nodeName, "LUN", opt.Lun) continue } @@ -99,20 +101,20 @@ func (as *availabilitySet) AttachDisk(ctx context.Context, nodeName types.NodeNa }, Location: vm.Location, } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - attach disk list(%v)", nodeResourceGroup, vmName, diskMap) + logger.V(2).Info("azureDisk - update: vm - attach disk list", "resourceGroup", nodeResourceGroup, "vmName", vmName, "diskMap", diskMap) result, rerr := as.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM) if rerr != nil { - klog.Errorf("azureDisk - attach disk list(%v) on rg(%s) vm(%s) failed, err: %+v", diskMap, nodeResourceGroup, vmName, rerr) + logger.Error(rerr, "azureDisk - attach disk list failed", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) if exists, err := errutils.CheckResourceExistsFromAzcoreError(rerr); !exists && err == nil { - klog.Errorf("azureDisk - begin to filterNonExistingDisks(%v) on rg(%s) vm(%s)", diskMap, nodeResourceGroup, vmName) + logger.Error(err, "azureDisk - begin to filterNonExistingDisks", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) disks := FilterNonExistingDisks(ctx, as.ComputeClientFactory, newVM.Properties.StorageProfile.DataDisks) newVM.Properties.StorageProfile.DataDisks = disks result, rerr = as.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM) } } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - attach disk list(%v) returned with %v", nodeResourceGroup, vmName, diskMap, err) + logger.V(2).Info("azureDisk - update: vm - attach disk list returned", "resourceGroup", nodeResourceGroup, "vmName", vmName, "diskMap", diskMap, "error", err) if rerr == nil && result != nil { as.updateCache(vmName, result) @@ -122,18 +124,20 @@ func (as *availabilitySet) AttachDisk(ctx context.Context, nodeName types.NodeNa return rerr } -func (as *availabilitySet) DeleteCacheForNode(_ context.Context, nodeName string) error { +func (as *availabilitySet) DeleteCacheForNode(ctx context.Context, nodeName string) error { + logger := log.FromContextOrBackground(ctx).WithName("DeleteCacheForNode") err := as.vmCache.Delete(nodeName) if err == nil { - klog.V(2).Infof("DeleteCacheForNode(%s) successfully", nodeName) + logger.V(2).Info("DeleteCacheForNode successfully", "nodeName", nodeName) } else { - klog.Errorf("DeleteCacheForNode(%s) failed with %v", nodeName, err) + logger.Error(err, "DeleteCacheForNode failed", "node", nodeName) } return err } // DetachDisk detaches a disk from VM func (as *availabilitySet) DetachDisk(ctx context.Context, nodeName types.NodeName, diskMap map[string]string, forceDetach bool) error { + logger := log.FromContextOrBackground(ctx).WithName("DetachDisk") vm, err := as.getVirtualMachine(ctx, nodeName, azcache.CacheReadTypeDefault) if err != nil { // if host doesn't exist, no need to detach @@ -157,7 +161,7 @@ func (as *availabilitySet) DetachDisk(ctx context.Context, nodeName types.NodeNa (disk.Vhd != nil && disk.Vhd.URI != nil && diskURI != "" && strings.EqualFold(*disk.Vhd.URI, diskURI)) || (disk.ManagedDisk != nil && diskURI != "" && strings.EqualFold(*disk.ManagedDisk.ID, diskURI)) { // found the disk - klog.V(2).Infof("azureDisk - detach disk: name %s uri %s", diskName, diskURI) + logger.V(2).Info("azureDisk - detach disk", "diskName", diskName, "diskURI", diskURI) disks[i].ToBeDetached = ptr.To(true) if forceDetach { disks[i].DetachOption = to.Ptr(armcompute.DiskDetachOptionTypesForceDetach) @@ -191,21 +195,21 @@ func (as *availabilitySet) DetachDisk(ctx context.Context, nodeName types.NodeNa }, Location: vm.Location, } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) node(%s)- detach disk list(%s)", nodeResourceGroup, vmName, nodeName, diskMap) + logger.V(2).Info("azureDisk - update: vm node - detach disk list", "resourceGroup", nodeResourceGroup, "vmName", vmName, "nodeName", nodeName, "diskMap", diskMap) result, err := as.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM) if err != nil { - klog.Errorf("azureDisk - detach disk list(%s) on rg(%s) vm(%s) failed, err: %v", diskMap, nodeResourceGroup, vmName, err) + logger.Error(err, "azureDisk - detach disk list failed", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) var exists bool if exists, err = errutils.CheckResourceExistsFromAzcoreError(err); !exists && err == nil { - klog.Errorf("azureDisk - begin to filterNonExistingDisks(%v) on rg(%s) vm(%s)", diskMap, nodeResourceGroup, vmName) + logger.Error(err, "azureDisk - begin to filterNonExistingDisks", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) disks := FilterNonExistingDisks(ctx, as.ComputeClientFactory, vm.Properties.StorageProfile.DataDisks) newVM.Properties.StorageProfile.DataDisks = disks result, err = as.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM) } } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk list(%s) returned with %v", nodeResourceGroup, vmName, diskMap, err) + logger.V(2).Info("azureDisk - update: vm - detach disk list returned with error", "resourceGroup", nodeResourceGroup, "vmName", vmName, "diskMap", diskMap, "error", err) if err == nil && result != nil { as.updateCache(vmName, result) @@ -240,16 +244,17 @@ func (as *availabilitySet) UpdateVM(ctx context.Context, nodeName types.NodeName } func (as *availabilitySet) updateCache(nodeName string, vm *armcompute.VirtualMachine) { + logger := log.Background().WithName("updateCache") if nodeName == "" { - klog.Errorf("updateCache(%s) failed with empty nodeName", nodeName) + logger.Error(nil, "updateCache failed with empty nodeName", "nodeName", nodeName) return } if vm == nil || vm.Properties == nil { - klog.Errorf("updateCache(%s) failed with nil vm or vm.Properties", nodeName) + logger.Error(nil, "updateCache failed with nil vm or vm.Properties", "nodeName", nodeName) return } as.vmCache.Update(nodeName, vm) - klog.V(2).Infof("updateCache(%s) successfully", nodeName) + logger.V(2).Info("updateCache successfully", "nodeName", nodeName) } // GetDataDisks gets a list of data disks attached to the node. diff --git a/pkg/provider/azure_controller_vmss.go b/pkg/provider/azure_controller_vmss.go index d5b12f2ea7..fde257bc53 100644 --- a/pkg/provider/azure_controller_vmss.go +++ b/pkg/provider/azure_controller_vmss.go @@ -30,11 +30,13 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" ) // AttachDisk attaches a disk to vm func (ss *ScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, diskMap map[string]*AttachDiskOptions) error { + logger := log.FromContextOrBackground(ctx).WithName("AttachDisk") vmName := mapNodeNameToVMName(nodeName) vm, err := ss.getVmssVM(ctx, vmName, azcache.CacheReadTypeDefault) if err != nil { @@ -69,7 +71,7 @@ func (ss *ScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, dis } } if attached { - klog.V(2).Infof("azureDisk - disk(%s) already attached to node(%s) on LUN(%d)", diskURI, nodeName, opt.Lun) + logger.V(2).Info("azureDisk - disk already attached to node on LUN", "diskURI", diskURI, "nodeName", nodeName, "LUN", opt.Lun) continue } @@ -105,23 +107,23 @@ func (ss *ScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, dis }, } - klog.V(2).Infof("azureDisk - update: rg(%s) vm(%s) - attach disk list(%+v)", nodeResourceGroup, nodeName, diskMap) + logger.V(2).Info("azureDisk - update: rg vm - attach disk list", "resourceGroup", nodeResourceGroup, "nodeName", nodeName, "diskMap", diskMap) result, rerr := ss.ComputeClientFactory.GetVirtualMachineScaleSetVMClient().Update(ctx, nodeResourceGroup, vm.VMSSName, vm.InstanceID, *newVM) if rerr != nil { - klog.Errorf("azureDisk - attach disk list(%+v) on rg(%s) vm(%s) failed, err: %v", diskMap, nodeResourceGroup, nodeName, rerr) + logger.Error(rerr, "azureDisk - attach disk list failed", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "nodeName", nodeName) if exists, err := errutils.CheckResourceExistsFromAzcoreError(rerr); !exists && !strings.Contains(rerr.Error(), consts.ParentResourceNotFoundMessageCode) && err == nil { - klog.Errorf("azureDisk - begin to filterNonExistingDisks(%v) on rg(%s) vm(%s)", diskMap, nodeResourceGroup, nodeName) + logger.Error(err, "azureDisk - begin to filterNonExistingDisks", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "nodeName", nodeName) disks := FilterNonExistingDisks(ctx, ss.ComputeClientFactory, newVM.Properties.StorageProfile.DataDisks) newVM.Properties.StorageProfile.DataDisks = disks result, rerr = ss.ComputeClientFactory.GetVirtualMachineScaleSetVMClient().Update(ctx, nodeResourceGroup, vm.VMSSName, vm.InstanceID, *newVM) } } - klog.V(2).Infof("azureDisk - update: rg(%s) vm(%s) - attach disk list(%+v) returned with %v", nodeResourceGroup, nodeName, diskMap, rerr) + logger.V(2).Info("azureDisk - update: rg vm - attach disk list returned with error", "resourceGroup", nodeResourceGroup, "nodeName", nodeName, "diskMap", diskMap, "error", rerr) if rerr == nil && result != nil && result.Properties != nil { if err := ss.updateCache(ctx, vmName, nodeResourceGroup, vm.VMSSName, vm.InstanceID, result); err != nil { - klog.Errorf("updateCache(%s, %s, %s, %s) failed with error: %v", vmName, nodeResourceGroup, vm.VMSSName, vm.InstanceID, err) + logger.Error(err, "updateCache failed", "vmName", vmName, "resourceGroup", nodeResourceGroup, "vmssName", vm.VMSSName, "instanceID", vm.InstanceID) } } else { _ = ss.DeleteCacheForNode(ctx, vmName) @@ -131,6 +133,7 @@ func (ss *ScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, dis // DetachDisk detaches a disk from VM func (ss *ScaleSet) DetachDisk(ctx context.Context, nodeName types.NodeName, diskMap map[string]string, forceDetach bool) error { + logger := log.FromContextOrBackground(ctx).WithName("DetachDisk") vmName := mapNodeNameToVMName(nodeName) vm, err := ss.getVmssVM(ctx, vmName, azcache.CacheReadTypeDefault) if err != nil { @@ -158,7 +161,7 @@ func (ss *ScaleSet) DetachDisk(ctx context.Context, nodeName types.NodeName, dis (disk.Vhd != nil && disk.Vhd.URI != nil && diskURI != "" && strings.EqualFold(*disk.Vhd.URI, diskURI)) || (disk.ManagedDisk != nil && diskURI != "" && strings.EqualFold(*disk.ManagedDisk.ID, diskURI)) { // found the disk - klog.V(2).Infof("azureDisk - detach disk: name %s uri %s", diskName, diskURI) + logger.V(2).Info("azureDisk - detach disk", "diskName", diskName, "diskURI", diskURI) disks[i].ToBeDetached = ptr.To(true) if forceDetach { disks[i].DetachOption = to.Ptr(armcompute.DiskDetachOptionTypesForceDetach) @@ -192,23 +195,23 @@ func (ss *ScaleSet) DetachDisk(ctx context.Context, nodeName types.NodeName, dis }, } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk list(%s)", nodeResourceGroup, nodeName, diskMap) + logger.V(2).Info("azureDisk - update: vm - detach disk list", "resourceGroup", nodeResourceGroup, "nodeName", nodeName, "diskMap", diskMap) result, rerr := ss.ComputeClientFactory.GetVirtualMachineScaleSetVMClient().Update(ctx, nodeResourceGroup, vm.VMSSName, vm.InstanceID, *newVM) if rerr != nil { - klog.Errorf("azureDisk - detach disk list(%+v) on rg(%s) vm(%s) failed, err: %v", diskMap, nodeResourceGroup, nodeName, rerr) + logger.Error(rerr, "azureDisk - detach disk list failed", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "nodeName", nodeName) if exists, err := errutils.CheckResourceExistsFromAzcoreError(rerr); !exists && !strings.Contains(rerr.Error(), consts.ParentResourceNotFoundMessageCode) && err == nil { - klog.Errorf("azureDisk - begin to filterNonExistingDisks(%v) on rg(%s) vm(%s)", diskMap, nodeResourceGroup, nodeName) + logger.Error(err, "azureDisk - begin to filterNonExistingDisks", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "nodeName", nodeName) disks := FilterNonExistingDisks(ctx, ss.ComputeClientFactory, newVM.Properties.StorageProfile.DataDisks) newVM.Properties.StorageProfile.DataDisks = disks result, rerr = ss.ComputeClientFactory.GetVirtualMachineScaleSetVMClient().Update(ctx, nodeResourceGroup, vm.VMSSName, vm.InstanceID, *newVM) } } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk(%v) returned with %v", nodeResourceGroup, nodeName, diskMap, err) + logger.V(2).Info("azureDisk - update: vm - detach disk returned with error", "resourceGroup", nodeResourceGroup, "nodeName", nodeName, "diskMap", diskMap, "error", err) if rerr == nil && result != nil && result.Properties != nil { if err := ss.updateCache(ctx, vmName, nodeResourceGroup, vm.VMSSName, vm.InstanceID, result); err != nil { - klog.Errorf("updateCache(%s, %s, %s, %s) failed with error: %v", vmName, nodeResourceGroup, vm.VMSSName, vm.InstanceID, err) + logger.Error(err, "updateCache failed", "vmName", vmName, "resourceGroup", nodeResourceGroup, "vmssName", vm.VMSSName, "instanceID", vm.InstanceID) } } else { _ = ss.DeleteCacheForNode(ctx, vmName) diff --git a/pkg/provider/azure_controller_vmssflex.go b/pkg/provider/azure_controller_vmssflex.go index 553d776953..4e5b35c6cd 100644 --- a/pkg/provider/azure_controller_vmssflex.go +++ b/pkg/provider/azure_controller_vmssflex.go @@ -34,10 +34,12 @@ import ( "k8s.io/utils/ptr" azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // AttachDisk attaches a disk to vm func (fs *FlexScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, diskMap map[string]*AttachDiskOptions) error { + logger := log.FromContextOrBackground(ctx).WithName("AttachDisk") vmName := mapNodeNameToVMName(nodeName) vm, err := fs.getVmssFlexVM(ctx, vmName, azcache.CacheReadTypeDefault) if err != nil { @@ -66,7 +68,7 @@ func (fs *FlexScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, } } if attached { - klog.V(2).Infof("azureDisk - disk(%s) already attached to node(%s) on LUN(%d)", diskURI, nodeName, opt.Lun) + logger.V(2).Info("azureDisk - disk already attached to node on LUN", "diskURI", diskURI, "nodeName", nodeName, "LUN", opt.Lun) continue } @@ -103,24 +105,24 @@ func (fs *FlexScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, Location: vm.Location, } - klog.V(2).Infof("azureDisk - update: rg(%s) vm(%s) - attach disk list(%+v)", nodeResourceGroup, vmName, diskMap) + logger.V(2).Info("azureDisk - update: rg vm - attach disk list", "resourceGroup", nodeResourceGroup, "vmName", vmName, "diskMap", diskMap) result, err := fs.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, *vm.Name, newVM) var rerr *azcore.ResponseError if err != nil && errors.As(err, &rerr) { - klog.Errorf("azureDisk - attach disk list(%+v) on rg(%s) vm(%s) failed, err: %v", diskMap, nodeResourceGroup, vmName, rerr) + logger.Error(rerr, "azureDisk - attach disk list failed", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) if rerr.StatusCode == http.StatusNotFound { - klog.Errorf("azureDisk - begin to filterNonExistingDisks(%v) on rg(%s) vm(%s)", diskMap, nodeResourceGroup, vmName) + logger.Error(rerr, "azureDisk - begin to filterNonExistingDisks", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) disks := FilterNonExistingDisks(ctx, fs.ComputeClientFactory, newVM.Properties.StorageProfile.DataDisks) newVM.Properties.StorageProfile.DataDisks = disks result, err = fs.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, *vm.Name, newVM) } } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - attach disk list(%+v) returned with %v", nodeResourceGroup, vmName, diskMap, rerr) + logger.V(2).Info("azureDisk - update: vm - attach disk list returned with error", "resourceGroup", nodeResourceGroup, "vmName", vmName, "diskMap", diskMap, "error", rerr) if err == nil && result != nil { if rerr := fs.updateCache(ctx, vmName, result); rerr != nil { - klog.Errorf("updateCache(%s) failed with error: %v", vmName, rerr) + logger.Error(rerr, "updateCache failed", "vmName", vmName) } } else { _ = fs.DeleteCacheForNode(ctx, vmName) @@ -130,6 +132,7 @@ func (fs *FlexScaleSet) AttachDisk(ctx context.Context, nodeName types.NodeName, // DetachDisk detaches a disk from VM func (fs *FlexScaleSet) DetachDisk(ctx context.Context, nodeName types.NodeName, diskMap map[string]string, forceDetach bool) error { + logger := log.FromContextOrBackground(ctx).WithName("DetachDisk") vmName := mapNodeNameToVMName(nodeName) vm, err := fs.getVmssFlexVM(ctx, vmName, azcache.CacheReadTypeDefault) if err != nil { @@ -153,7 +156,7 @@ func (fs *FlexScaleSet) DetachDisk(ctx context.Context, nodeName types.NodeName, (disk.Vhd != nil && disk.Vhd.URI != nil && diskURI != "" && strings.EqualFold(*disk.Vhd.URI, diskURI)) || (disk.ManagedDisk != nil && diskURI != "" && strings.EqualFold(*disk.ManagedDisk.ID, diskURI)) { // found the disk - klog.V(2).Infof("azureDisk - detach disk: name %s uri %s", diskName, diskURI) + logger.V(2).Info("azureDisk - detach disk", "diskName", diskName, "diskURI", diskURI) disks[i].ToBeDetached = ptr.To(true) if forceDetach { disks[i].DetachOption = to.Ptr(armcompute.DiskDetachOptionTypesForceDetach) @@ -188,15 +191,15 @@ func (fs *FlexScaleSet) DetachDisk(ctx context.Context, nodeName types.NodeName, Location: vm.Location, } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) node(%s)- detach disk list(%s)", nodeResourceGroup, vmName, nodeName, diskMap) + logger.V(2).Info("azureDisk - update: vm node - detach disk list", "resourceGroup", nodeResourceGroup, "vmName", vmName, "nodeName", nodeName, "diskMap", diskMap) result, err := fs.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, *vm.Name, newVM) if err != nil { - klog.Errorf("azureDisk - detach disk list(%s) on rg(%s) vm(%s) failed, err: %v", diskMap, nodeResourceGroup, vmName, err) + logger.Error(err, "azureDisk - detach disk list failed", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) var rerr *azcore.ResponseError if errors.As(err, &rerr) { if rerr.StatusCode == http.StatusNotFound { - klog.Errorf("azureDisk - begin to filterNonExistingDisks(%v) on rg(%s) vm(%s)", diskMap, nodeResourceGroup, vmName) + logger.Error(rerr, "azureDisk - begin to filterNonExistingDisks", "diskMap", diskMap, "resourceGroup", nodeResourceGroup, "vmName", vmName) disks := FilterNonExistingDisks(ctx, fs.ComputeClientFactory, vm.Properties.StorageProfile.DataDisks) newVM.Properties.StorageProfile.DataDisks = disks result, err = fs.ComputeClientFactory.GetVirtualMachineClient().CreateOrUpdate(ctx, nodeResourceGroup, *vm.Name, newVM) @@ -204,11 +207,11 @@ func (fs *FlexScaleSet) DetachDisk(ctx context.Context, nodeName types.NodeName, } } - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk list(%s) returned with %v", nodeResourceGroup, vmName, diskMap, err) + logger.V(2).Info("azureDisk - update: vm - detach disk list returned with error", "resourceGroup", nodeResourceGroup, "vmName", vmName, "diskMap", diskMap, "error", err) if err == nil && result != nil { if rerr := fs.updateCache(ctx, vmName, result); rerr != nil { - klog.Errorf("updateCache(%s) failed with error: %v", vmName, rerr) + logger.Error(rerr, "updateCache failed", "vmName", vmName) } } else { _ = fs.DeleteCacheForNode(ctx, vmName) @@ -235,6 +238,7 @@ func (fs *FlexScaleSet) UpdateVM(ctx context.Context, nodeName types.NodeName) e } func (fs *FlexScaleSet) updateCache(ctx context.Context, nodeName string, vm *armcompute.VirtualMachine) error { + logger := log.FromContextOrBackground(ctx).WithName("updateCache") if nodeName == "" { return fmt.Errorf("nodeName is empty") } @@ -267,7 +271,7 @@ func (fs *FlexScaleSet) updateCache(ctx context.Context, nodeName string, vm *ar fs.vmssFlexVMNameToVmssID.Store(strings.ToLower(*vm.Properties.OSProfile.ComputerName), vmssFlexID) fs.vmssFlexVMNameToNodeName.Store(*vm.Name, strings.ToLower(*vm.Properties.OSProfile.ComputerName)) - klog.V(2).Infof("updateCache(%s) for vmssFlexID(%s) successfully", nodeName, vmssFlexID) + logger.V(2).Info("updateCache for vmssFlexID successfully", "nodeName", nodeName, "vmssFlexID", vmssFlexID) return nil } diff --git a/pkg/provider/azure_instance_metadata.go b/pkg/provider/azure_instance_metadata.go index 239e95a81f..d7d8396b44 100644 --- a/pkg/provider/azure_instance_metadata.go +++ b/pkg/provider/azure_instance_metadata.go @@ -26,10 +26,9 @@ import ( "strings" "time" - "k8s.io/klog/v2" - azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // NetworkMetadata contains metadata about an instance's network @@ -150,7 +149,8 @@ func fillNetInterfacePublicIPs(publicIPs []PublicIPMetadata, netInterface *Netwo } } -func (ims *InstanceMetadataService) getMetadata(_ context.Context, key string) (interface{}, error) { +func (ims *InstanceMetadataService) getMetadata(ctx context.Context, key string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("getMetadata") instanceMetadata, err := ims.getInstanceMetadata(key) if err != nil { return nil, err @@ -168,7 +168,7 @@ func (ims *InstanceMetadataService) getMetadata(_ context.Context, key string) ( if err != nil || loadBalancerMetadata == nil || loadBalancerMetadata.LoadBalancer == nil { // Log a warning since loadbalancer metadata may not be available when the VM // is not in standard LoadBalancer backend address pool. - klog.V(4).Infof("Warning: failed to get loadbalancer metadata: %v", err) + logger.V(4).Info("Warning: failed to get loadbalancer metadata", "error", err) return instanceMetadata, nil } @@ -277,10 +277,11 @@ func (ims *InstanceMetadataService) GetMetadata(ctx context.Context, crt azcache // GetPlatformSubFaultDomain returns the PlatformSubFaultDomain from IMDS if set. func (az *Cloud) GetPlatformSubFaultDomain(ctx context.Context) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetPlatformSubFaultDomain") if az.UseInstanceMetadata { metadata, err := az.Metadata.GetMetadata(ctx, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("GetPlatformSubFaultDomain: failed to GetMetadata: %s", err.Error()) + logger.Error(err, "failed to GetMetadata") return "", err } if metadata.Compute == nil { diff --git a/pkg/provider/azure_instances_v1.go b/pkg/provider/azure_instances_v1.go index bba63cd855..0cfd895c45 100644 --- a/pkg/provider/azure_instances_v1.go +++ b/pkg/provider/azure_instances_v1.go @@ -26,10 +26,10 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" cloudprovider "k8s.io/cloud-provider" - "k8s.io/klog/v2" azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) var _ cloudprovider.Instances = (*Cloud)(nil) @@ -45,9 +45,10 @@ var ( ) func (az *Cloud) addressGetter(ctx context.Context, nodeName types.NodeName) ([]v1.NodeAddress, error) { + logger := log.FromContextOrBackground(ctx).WithName("addressGetter") ip, publicIP, err := az.getIPForMachine(ctx, nodeName) if err != nil { - klog.V(2).Infof("NodeAddresses(%s) abort backoff: %v", nodeName, err) + logger.V(2).Info("NodeAddresses abort backoff", "nodeName", nodeName, "error", err) return nil, err } @@ -66,13 +67,14 @@ func (az *Cloud) addressGetter(ctx context.Context, nodeName types.NodeName) ([] // NodeAddresses returns the addresses of the specified instance. func (az *Cloud) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.NodeAddress, error) { + logger := log.FromContextOrBackground(ctx).WithName("NodeAddresses") // Returns nil for unmanaged nodes because azure cloud provider couldn't fetch information for them. unmanaged, err := az.IsNodeUnmanaged(string(name)) if err != nil { return nil, err } if unmanaged { - klog.V(4).Infof("NodeAddresses: omitting unmanaged node %q", name) + logger.V(4).Info("omitting unmanaged node", "nodeName", name) return nil, nil } @@ -156,13 +158,14 @@ func (az *Cloud) getLocalInstanceNodeAddresses(netInterfaces []*NetworkInterface // This method will not be called from the node that is requesting this ID. i.e. metadata service // and other local methods cannot be used here func (az *Cloud) NodeAddressesByProviderID(ctx context.Context, providerID string) ([]v1.NodeAddress, error) { + logger := log.FromContextOrBackground(ctx).WithName("NodeAddressesByProviderID") if providerID == "" { return nil, errNodeNotInitialized } // Returns nil for unmanaged nodes because azure cloud provider couldn't fetch information for them. if az.IsNodeUnmanagedByProviderID(providerID) { - klog.V(4).Infof("NodeAddressesByProviderID: omitting unmanaged node %q", providerID) + logger.V(4).Info("omitting unmanaged node", "providerID", providerID) return nil, nil } @@ -182,13 +185,14 @@ func (az *Cloud) NodeAddressesByProviderID(ctx context.Context, providerID strin // InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. // If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (az *Cloud) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceExistsByProviderID") if providerID == "" { return false, errNodeNotInitialized } // Returns true for unmanaged nodes because azure cloud provider always assumes them exists. if az.IsNodeUnmanagedByProviderID(providerID) { - klog.V(4).Infof("InstanceExistsByProviderID: assuming unmanaged node %q exists", providerID) + logger.V(4).Info("assuming unmanaged node exists", "providerID", providerID) return true, nil } @@ -218,6 +222,7 @@ func (az *Cloud) InstanceExistsByProviderID(ctx context.Context, providerID stri // InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes func (az *Cloud) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceShutdownByProviderID") if providerID == "" { return false, nil } @@ -245,7 +250,7 @@ func (az *Cloud) InstanceShutdownByProviderID(ctx context.Context, providerID st return false, err } - klog.V(3).Infof("InstanceShutdownByProviderID gets power status %q for node %q", powerStatus, nodeName) + logger.V(3).Info("gets power status for node", "powerStatus", powerStatus, "nodeName", nodeName) provisioningState, err := az.VMSet.GetProvisioningStateByNodeName(ctx, string(nodeName)) if err != nil { @@ -256,7 +261,7 @@ func (az *Cloud) InstanceShutdownByProviderID(ctx context.Context, providerID st return false, err } - klog.V(3).Infof("InstanceShutdownByProviderID gets provisioning state %q for node %q", provisioningState, nodeName) + logger.V(3).Info("gets provisioning state for node", "provisioningState", provisioningState, "nodeName", nodeName) status := strings.ToLower(powerStatus) provisioningSucceeded := strings.EqualFold(strings.ToLower(provisioningState), strings.ToLower(string(consts.ProvisioningStateSucceeded))) @@ -288,6 +293,7 @@ func (az *Cloud) isCurrentInstance(name types.NodeName, metadataVMName string) ( // InstanceID returns the cloud provider ID of the specified instance. // Note that if the instance does not exist or is no longer running, we must return ("", cloudprovider.InstanceNotFound) func (az *Cloud) InstanceID(ctx context.Context, name types.NodeName) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceID") nodeName := mapNodeNameToVMName(name) unmanaged, err := az.IsNodeUnmanaged(nodeName) if err != nil { @@ -295,7 +301,7 @@ func (az *Cloud) InstanceID(ctx context.Context, name types.NodeName) (string, e } if unmanaged { // InstanceID is same with nodeName for unmanaged nodes. - klog.V(4).Infof("InstanceID: getting ID %q for unmanaged node %q", name, name) + logger.V(4).Info("getting ID for unmanaged node", "id", name, "unmanaged", name) return nodeName, nil } @@ -350,13 +356,14 @@ func (az *Cloud) getLocalInstanceProviderID(metadata *InstanceMetadata, _ string // This method will not be called from the node that is requesting this ID. i.e. metadata service // and other local methods cannot be used here func (az *Cloud) InstanceTypeByProviderID(ctx context.Context, providerID string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceTypeByProviderID") if providerID == "" { return "", errNodeNotInitialized } // Returns "" for unmanaged nodes because azure cloud provider couldn't fetch information for them. if az.IsNodeUnmanagedByProviderID(providerID) { - klog.V(4).Infof("InstanceTypeByProviderID: omitting unmanaged node %q", providerID) + logger.V(4).Info("omitting unmanaged node", "providerID", providerID) return "", nil } @@ -378,13 +385,14 @@ func (az *Cloud) InstanceTypeByProviderID(ctx context.Context, providerID string // (Implementer Note): This is used by kubelet. Kubelet will label the node. Real log from kubelet: // Adding node label from cloud provider: beta.kubernetes.io/instance-type=[value] func (az *Cloud) InstanceType(ctx context.Context, name types.NodeName) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceType") // Returns "" for unmanaged nodes because azure cloud provider couldn't fetch information for them. unmanaged, err := az.IsNodeUnmanaged(string(name)) if err != nil { return "", err } if unmanaged { - klog.V(4).Infof("InstanceType: omitting unmanaged node %q", name) + logger.V(4).Info("omitting unmanaged node", "nodeName", name) return "", nil } diff --git a/pkg/provider/azure_instances_v2.go b/pkg/provider/azure_instances_v2.go index 38b08663b4..ab0b225dbe 100644 --- a/pkg/provider/azure_instances_v2.go +++ b/pkg/provider/azure_instances_v2.go @@ -23,7 +23,8 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" cloudprovider "k8s.io/cloud-provider" - "k8s.io/klog/v2" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) var _ cloudprovider.InstancesV2 = (*Cloud)(nil) @@ -31,6 +32,7 @@ var _ cloudprovider.InstancesV2 = (*Cloud)(nil) // InstanceExists returns true if the instance for the given node exists according to the cloud provider. // Use the node.name or node.spec.providerID field to find the node in the cloud provider. func (az *Cloud) InstanceExists(ctx context.Context, node *v1.Node) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceExists") if node == nil { return false, nil } @@ -39,7 +41,7 @@ func (az *Cloud) InstanceExists(ctx context.Context, node *v1.Node) (bool, error return false, err } if unmanaged { - klog.V(4).Infof("InstanceExists: omitting unmanaged node %q", node.Name) + logger.V(4).Info("omitting unmanaged node", "nodeName", node.Name) return true, nil } @@ -52,7 +54,7 @@ func (az *Cloud) InstanceExists(ctx context.Context, node *v1.Node) (bool, error return false, nil } - klog.Errorf("InstanceExists: failed to get the provider ID by node name %s: %v", node.Name, err) + logger.Error(err, "InstanceExists: failed to get the provider ID by node name", "node", node.Name) return false, err } } @@ -63,6 +65,7 @@ func (az *Cloud) InstanceExists(ctx context.Context, node *v1.Node) (bool, error // InstanceShutdown returns true if the instance is shutdown according to the cloud provider. // Use the node.name or node.spec.providerID field to find the node in the cloud provider. func (az *Cloud) InstanceShutdown(ctx context.Context, node *v1.Node) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceShutdown") if node == nil { return false, nil } @@ -71,7 +74,7 @@ func (az *Cloud) InstanceShutdown(ctx context.Context, node *v1.Node) (bool, err return false, err } if unmanaged { - klog.V(4).Infof("InstanceShutdown: omitting unmanaged node %q", node.Name) + logger.V(4).Info("omitting unmanaged node", "nodeName", node.Name) return false, nil } providerID := node.Spec.ProviderID @@ -84,7 +87,7 @@ func (az *Cloud) InstanceShutdown(ctx context.Context, node *v1.Node) (bool, err return false, nil } - klog.Errorf("InstanceShutdown: failed to get the provider ID by node name %s: %v", node.Name, err) + logger.Error(err, "InstanceShutdown: failed to get the provider ID by node name", "node", node.Name) return false, err } } @@ -96,6 +99,7 @@ func (az *Cloud) InstanceShutdown(ctx context.Context, node *v1.Node) (bool, err // translated into specific fields in the Node object on registration. // Use the node.name or node.spec.providerID field to find the node in the cloud provider. func (az *Cloud) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudprovider.InstanceMetadata, error) { + logger := log.FromContextOrBackground(ctx).WithName("InstanceMetadata") meta := cloudprovider.InstanceMetadata{} if node == nil { return &meta, nil @@ -105,7 +109,7 @@ func (az *Cloud) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudpro return &meta, err } if unmanaged { - klog.V(4).Infof("InstanceMetadata: omitting unmanaged node %q", node.Name) + logger.V(4).Info("omitting unmanaged node", "nodeName", node.Name) return &meta, nil } @@ -114,7 +118,7 @@ func (az *Cloud) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudpro } else { providerID, err := cloudprovider.GetInstanceProviderID(ctx, az, types.NodeName(node.Name)) if err != nil { - klog.Errorf("InstanceMetadata: failed to get the provider ID by node name %s: %v", node.Name, err) + logger.Error(err, "InstanceMetadata: failed to get the provider ID by node name", "node", node.Name) return nil, err } meta.ProviderID = providerID @@ -122,21 +126,21 @@ func (az *Cloud) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloudpro instanceType, err := az.InstanceType(ctx, types.NodeName(node.Name)) if err != nil { - klog.Errorf("InstanceMetadata: failed to get the instance type of %s: %v", node.Name, err) + logger.Error(err, "InstanceMetadata: failed to get the instance type", "node", node.Name) return &cloudprovider.InstanceMetadata{}, err } meta.InstanceType = instanceType nodeAddresses, err := az.NodeAddresses(ctx, types.NodeName(node.Name)) if err != nil { - klog.Errorf("InstanceMetadata: failed to get the node address of %s: %v", node.Name, err) + logger.Error(err, "InstanceMetadata: failed to get the node address", "node", node.Name) return &cloudprovider.InstanceMetadata{}, err } meta.NodeAddresses = nodeAddresses zone, err := az.GetZoneByNodeName(ctx, types.NodeName(node.Name)) if err != nil { - klog.Errorf("InstanceMetadata: failed to get the node zone of %s: %v", node.Name, err) + logger.Error(err, "InstanceMetadata: failed to get the node zone", "node", node.Name) return &cloudprovider.InstanceMetadata{}, err } meta.Zone = zone.FailureDomain diff --git a/pkg/provider/azure_interface_repo.go b/pkg/provider/azure_interface_repo.go index dd731392af..0e69df0353 100644 --- a/pkg/provider/azure_interface_repo.go +++ b/pkg/provider/azure_interface_repo.go @@ -21,15 +21,17 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6" v1 "k8s.io/api/core/v1" - "k8s.io/klog/v2" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // CreateOrUpdateInterface invokes az.ComputeClientFactory.GetInterfaceClient().CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateInterface(ctx context.Context, service *v1.Service, nic *armnetwork.Interface) error { + logger := log.FromContextOrBackground(ctx).WithName("CreateOrUpdateInterface") _, rerr := az.ComputeClientFactory.GetInterfaceClient().CreateOrUpdate(ctx, az.ResourceGroup, *nic.Name, *nic) - klog.V(10).Infof("InterfacesClient.CreateOrUpdate(%s): end", *nic.Name) + logger.V(10).Info("InterfacesClient.CreateOrUpdate: end", "nicName", *nic.Name) if rerr != nil { - klog.Errorf("InterfacesClient.CreateOrUpdate(%s) failed: %s", *nic.Name, rerr.Error()) + logger.Error(rerr, "InterfacesClient.CreateOrUpdate failed", "nicName", *nic.Name) az.Event(service, v1.EventTypeWarning, "CreateOrUpdateInterface", rerr.Error()) return rerr } diff --git a/pkg/provider/azure_loadbalancer.go b/pkg/provider/azure_loadbalancer.go index 900d352ecb..ea6c478c21 100644 --- a/pkg/provider/azure_loadbalancer.go +++ b/pkg/provider/azure_loadbalancer.go @@ -532,12 +532,13 @@ func (az *Cloud) getLoadBalancerResourceGroup() string { // according to the mode annotation on the service. This could be happened when the LB selection mode of an // existing service is changed to another VMSS/VMAS. func (az *Cloud) shouldChangeLoadBalancer(service *v1.Service, currLBName, clusterName, expectedLBName string) bool { + logger := log.Background().WithName("shouldChangeLoadBalancer") // The load balancer can be changed in two cases: // 1. Using multiple standard load balancers. // 2. Migrate from multiple standard load balancers to single standard load balancer. if az.UseStandardLoadBalancer() { if !strings.EqualFold(currLBName, expectedLBName) { - klog.V(2).Infof("shouldChangeLoadBalancer(%s, %s, %s): change the LB to another one %s", service.Name, currLBName, clusterName, expectedLBName) + logger.V(2).Info("change the LB to another one", "service", service.Name, "currLBName", currLBName, "clusterName", clusterName, "expectedLBName", expectedLBName) return true } return false @@ -556,7 +557,7 @@ func (az *Cloud) shouldChangeLoadBalancer(service *v1.Service, currLBName, clust if strings.EqualFold(lbName, vmSetName) { if !strings.EqualFold(lbName, clusterName) && strings.EqualFold(az.VMSet.GetPrimaryVMSetName(), vmSetName) { - klog.V(2).Infof("shouldChangeLoadBalancer(%s, %s, %s): change the LB to another one", service.Name, currLBName, clusterName) + logger.V(2).Info("change the LB to another one", "service", service.Name, "currLBName", currLBName, "clusterName", clusterName) return true } return false @@ -567,7 +568,7 @@ func (az *Cloud) shouldChangeLoadBalancer(service *v1.Service, currLBName, clust // if the VMSS/VMAS of the current LB is different from the mode, change the LB // to another one - klog.V(2).Infof("shouldChangeLoadBalancer(%s, %s, %s): change the LB to another one", service.Name, currLBName, clusterName) + logger.V(2).Info("change the LB to another one", "service", service.Name, "currLBName", currLBName, "clusterName", clusterName) return true } @@ -575,6 +576,7 @@ func (az *Cloud) shouldChangeLoadBalancer(service *v1.Service, currLBName, clust // and delete the load balancer if there is no ip config on it. It returns the name of the deleted load balancer // and it will be used in reconcileLoadBalancer to remove the load balancer from the list. func (az *Cloud) removeFrontendIPConfigurationFromLoadBalancer(ctx context.Context, lb *armnetwork.LoadBalancer, existingLBs []*armnetwork.LoadBalancer, fips []*armnetwork.FrontendIPConfiguration, clusterName string, service *v1.Service) (string, bool /* deleted PLS */, error) { + logger := log.FromContextOrBackground(ctx).WithName("removeFrontendIPConfigurationFromLoadBalancer") if lb == nil || lb.Properties == nil || lb.Properties.FrontendIPConfigurations == nil { return "", false, nil } @@ -622,7 +624,7 @@ func (az *Cloud) removeFrontendIPConfigurationFromLoadBalancer(ctx context.Conte err error ) if deleted, err = az.reconcilePrivateLinkService(ctx, clusterName, service, fip, false /* wantPLS */); err != nil { - klog.Errorf("removeFrontendIPConfigurationFromLoadBalancer(%s, %s, %s, %s): failed to clean up PLS: %v", ptr.Deref(lb.Name, ""), ptr.Deref(fip.Name, ""), clusterName, service.Name, err) + logger.Error(err, "failed to clean up PLS", "lbName", ptr.Deref(lb.Name, ""), "fipName", ptr.Deref(fip.Name, ""), "clusterName", clusterName, "serviceName", service.Name) return "", false, err } if deleted { @@ -638,20 +640,19 @@ func (az *Cloud) removeFrontendIPConfigurationFromLoadBalancer(ctx context.Conte for _, fip := range fips { fipNames = append(fipNames, ptr.Deref(fip.Name, "")) } - logPrefix := fmt.Sprintf("removeFrontendIPConfigurationFromLoadBalancer(%s, %q, %s, %s)", ptr.Deref(lb.Name, ""), fipNames, clusterName, service.Name) if len(fipConfigs) == 0 { - klog.V(2).Infof("%s: deleting load balancer because there is no remaining frontend IP configurations", logPrefix) + logger.V(2).Info("deleting load balancer because there is no remaining frontend IP configurations", "lbName", ptr.Deref(lb.Name, ""), "fipNames", fipNames, "clusterName", clusterName, "serviceName", service.Name) err := az.cleanOrphanedLoadBalancer(ctx, lb, existingLBs, service, clusterName) if err != nil { - klog.Errorf("%s: failed to cleanupOrphanedLoadBalancer: %v", logPrefix, err) + logger.Error(err, "failed to cleanupOrphanedLoadBalancer", "lbName", ptr.Deref(lb.Name, ""), "fipNames", fipNames, "clusterName", clusterName, "serviceName", service.Name) return "", false, err } deletedLBName = ptr.Deref(lb.Name, "") } else { - klog.V(2).Infof("%s: updating the load balancer", logPrefix) + logger.V(2).Info("updating the load balancer", "lbName", ptr.Deref(lb.Name, ""), "fipNames", fipNames, "clusterName", clusterName, "serviceName", service.Name) err := az.CreateOrUpdateLB(ctx, service, *lb) if err != nil { - klog.Errorf("%s: failed to CreateOrUpdateLB: %v", logPrefix, err) + logger.Error(err, "failed to CreateOrUpdateLB", "lbName", ptr.Deref(lb.Name, ""), "fipNames", fipNames, "clusterName", clusterName, "serviceName", service.Name) return "", false, err } _ = az.lbCache.Delete(ptr.Deref(lb.Name, "")) @@ -660,6 +661,7 @@ func (az *Cloud) removeFrontendIPConfigurationFromLoadBalancer(ctx context.Conte } func (az *Cloud) cleanOrphanedLoadBalancer(ctx context.Context, lb *armnetwork.LoadBalancer, existingLBs []*armnetwork.LoadBalancer, service *v1.Service, clusterName string) error { + logger := log.FromContextOrBackground(ctx).WithName("cleanOrphanedLoadBalancer") lbName := ptr.Deref(lb.Name, "") serviceName := getServiceName(service) isBackendPoolPreConfigured := az.isBackendPoolPreConfigured(service) @@ -673,7 +675,7 @@ func (az *Cloud) cleanOrphanedLoadBalancer(ctx context.Context, lb *armnetwork.L lbBackendPoolIDsToDelete = append(lbBackendPoolIDsToDelete, lbBackendPoolIDs[consts.IPVersionIPv6]) } if isBackendPoolPreConfigured { - klog.V(2).Infof("cleanOrphanedLoadBalancer(%s, %s, %s): ignore cleanup of dirty lb because the lb is pre-configured", lbName, serviceName, clusterName) + logger.V(2).Info("ignore cleanup of dirty lb because the lb is pre-configured", "lbName", lbName, "serviceName", serviceName, "clusterName", clusterName) } else { foundLB := false for _, existingLB := range existingLBs { @@ -683,13 +685,13 @@ func (az *Cloud) cleanOrphanedLoadBalancer(ctx context.Context, lb *armnetwork.L } } if !foundLB { - klog.V(2).Infof("cleanOrphanedLoadBalancer: the LB %s doesn't exist, will not delete it", ptr.Deref(lb.Name, "")) + logger.V(2).Info("cleanOrphanedLoadBalancer: the LB doesn't exist, will not delete it", "lbName", ptr.Deref(lb.Name, "")) return nil } // When FrontendIPConfigurations is empty, we need to delete the Azure load balancer resource itself, // because an Azure load balancer cannot have an empty FrontendIPConfigurations collection - klog.V(2).Infof("cleanOrphanedLoadBalancer(%s, %s, %s): deleting the LB since there are no remaining frontendIPConfigurations", lbName, serviceName, clusterName) + logger.V(2).Info("deleting the LB since there are no remaining frontendIPConfigurations", "lbName", lbName, "serviceName", serviceName, "clusterName", clusterName) // Remove backend pools from vmSets. This is required for virtual machine scale sets before removing the LB. if _, ok := az.VMSet.(*availabilitySet); ok { @@ -698,7 +700,7 @@ func (az *Cloud) cleanOrphanedLoadBalancer(ctx context.Context, lb *armnetwork.L } if deleteErr := az.safeDeleteLoadBalancer(ctx, *lb, clusterName, service); deleteErr != nil { - klog.Warningf("cleanOrphanedLoadBalancer(%s, %s, %s): failed to DeleteLB: %v", lbName, serviceName, clusterName, deleteErr) + logger.Error(deleteErr, "failed to DeleteLB", "lbName", lbName, "serviceName", serviceName, "clusterName", clusterName) rgName, vmssName, parseErr := errutils.GetVMSSMetadataByRawError(deleteErr) if parseErr != nil { @@ -722,22 +724,23 @@ func (az *Cloud) cleanOrphanedLoadBalancer(ctx context.Context, lb *armnetwork.L vmssNamesMap := map[string]bool{vmssName: true} if err := az.VMSet.EnsureBackendPoolDeletedFromVMSets(ctx, vmssNamesMap, lbBackendPoolIDsToDelete); err != nil { - klog.Errorf("cleanOrphanedLoadBalancer(%s, %s, %s): failed to EnsureBackendPoolDeletedFromVMSets: %v", lbName, serviceName, clusterName, err) + logger.Error(err, "failed to EnsureBackendPoolDeletedFromVMSets", "lbName", lbName, "serviceName", serviceName, "clusterName", clusterName) return err } if deleteErr := az.DeleteLB(ctx, service, lbName); deleteErr != nil { - klog.Errorf("cleanOrphanedLoadBalancer(%s, %s, %s): failed delete lb for the second time, stop retrying: %v", lbName, serviceName, clusterName, deleteErr) + logger.Error(deleteErr, "failed delete lb for the second time, stop retrying", "lbName", lbName, "serviceName", serviceName, "clusterName", clusterName) return deleteErr } } - klog.V(10).Infof("cleanOrphanedLoadBalancer(%s, %s, %s): az.DeleteLB finished", lbName, serviceName, clusterName) + logger.V(10).Info("az.DeleteLB finished", "lbName", lbName, "serviceName", serviceName, "clusterName", clusterName) } return nil } // safeDeleteLoadBalancer deletes the load balancer after decoupling it from the vmSet func (az *Cloud) safeDeleteLoadBalancer(ctx context.Context, lb armnetwork.LoadBalancer, clusterName string, service *v1.Service) error { + logger := log.FromContextOrBackground(ctx).WithName("safeDeleteLoadBalancer") vmSetName := az.mapLoadBalancerNameToVMSet(ptr.Deref(lb.Name, ""), clusterName) lbBackendPoolIDsToDelete := []string{} if lb.Properties != nil && lb.Properties.BackendAddressPools != nil { @@ -749,7 +752,7 @@ func (az *Cloud) safeDeleteLoadBalancer(ctx context.Context, lb armnetwork.LoadB return fmt.Errorf("safeDeleteLoadBalancer: failed to EnsureBackendPoolDeleted: %w", err) } - klog.V(2).Infof("safeDeleteLoadBalancer: deleting LB %s", ptr.Deref(lb.Name, "")) + logger.V(2).Info("deleting LB", "lbName", ptr.Deref(lb.Name, "")) if rerr := az.DeleteLB(ctx, service, ptr.Deref(lb.Name, "")); rerr != nil { return rerr } @@ -825,7 +828,13 @@ func (az *Cloud) getServiceLoadBalancer( // service is not on this load balancer continue } - logger.V(4).Info(fmt.Sprintf("getServiceLoadBalancer(%s, %s, %v): current lb IPs: %q", service.Name, clusterName, wantLb, lbIPsPrimaryPIPs)) + logger.V(4).Info( + "Current service load balancer state", + "service", service.Name, + "clusterName", clusterName, + "wantLB", wantLb, + "currentLBIPs", lbIPsPrimaryPIPs, + ) // select another load balancer instead of returning // the current one if the change is needed @@ -937,15 +946,16 @@ func (az *Cloud) getServiceLoadBalancer( // then selects the first one (sorted based on name). // Note: this function is only useful for basic LB clusters. func (az *Cloud) selectLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, existingLBs []*armnetwork.LoadBalancer, nodes []*v1.Node) (selectedLB *armnetwork.LoadBalancer, existsLb bool, err error) { + logger := log.FromContextOrBackground(ctx).WithName("selectLoadBalancer") isInternal := requiresInternalLoadBalancer(service) serviceName := getServiceName(service) - klog.V(2).Infof("selectLoadBalancer for service (%s): isInternal(%v) - start", serviceName, isInternal) + logger.V(2).Info("start", "serviceName", serviceName, "isInternal", isInternal) vmSetNames, err := az.VMSet.GetVMSetNames(ctx, service, nodes) if err != nil { - klog.Errorf("az.selectLoadBalancer: cluster(%s) service(%s) isInternal(%t) - az.GetVMSetNames failed, err=(%v)", clusterName, serviceName, isInternal, err) + logger.Error(err, "az.selectLoadBalancer: az.GetVMSetNames failed", "clusterName", clusterName, "serviceName", serviceName, "isInternal", isInternal) return nil, false, err } - klog.V(2).Infof("selectLoadBalancer: cluster(%s) service(%s) isInternal(%t) - vmSetNames %v", clusterName, serviceName, isInternal, vmSetNames) + logger.V(2).Info("retrieved VM set names", "clusterName", clusterName, "serviceName", serviceName, "isInternal", isInternal, "vmSetNames", vmSetNames) mapExistingLBs := map[string]*armnetwork.LoadBalancer{} for _, lb := range existingLBs { @@ -997,13 +1007,26 @@ func (az *Cloud) selectLoadBalancer(ctx context.Context, clusterName string, ser if selectedLB == nil { err = fmt.Errorf("selectLoadBalancer: cluster(%s) service(%s) isInternal(%t) - unable to find load balancer for selected VM sets %v", clusterName, serviceName, isInternal, vmSetNames) - klog.Error(err) + logger.Error( + err, "unable to find load balancer for selected VM sets", + "cluster", clusterName, + "service", serviceName, + "isInternal", isInternal, + "vmSetNames", vmSetNames, + ) return nil, false, err } // validate if the selected LB has not exceeded the MaximumLoadBalancerRuleCount if az.Config.MaximumLoadBalancerRuleCount != 0 && selectedLBRuleCount >= az.Config.MaximumLoadBalancerRuleCount { err = fmt.Errorf("selectLoadBalancer: cluster(%s) service(%s) isInternal(%t) - all available load balancers have exceeded maximum rule limit %d, vmSetNames (%v)", clusterName, serviceName, isInternal, selectedLBRuleCount, vmSetNames) - klog.Error(err) + logger.Error( + err, "all available load balancers have exceeded maximum rule limit", + "cluster", clusterName, + "service", serviceName, + "isInternal", isInternal, + "maxRuleLimit", az.MaximumLoadBalancerRuleCount, + "vmSetNames", vmSetNames, + ) return selectedLB, existsLb, err } @@ -1015,12 +1038,13 @@ func (az *Cloud) selectLoadBalancer(ctx context.Context, clusterName string, ser // and the second one as additional one. With DualStack support, the second IP may be // the IP of another IP family so the new logic returns two variables. func (az *Cloud) getServiceLoadBalancerStatus(ctx context.Context, service *v1.Service, lb *armnetwork.LoadBalancer) (status *v1.LoadBalancerStatus, lbIPsPrimaryPIPs []string, fipConfigs []*armnetwork.FrontendIPConfiguration, err error) { + logger := log.FromContextOrBackground(ctx).WithName("getServiceLoadBalancerStatus") if lb == nil { - klog.V(10).Info("getServiceLoadBalancerStatus: lb is nil") + logger.V(10).Info("lb is nil") return nil, nil, nil, nil } if lb.Properties == nil || len(lb.Properties.FrontendIPConfigurations) == 0 { - klog.V(10).Info("getServiceLoadBalancerStatus: lb.Properties.FrontendIPConfigurations is nil") + logger.V(10).Info("lb.Properties.FrontendIPConfigurations is nil") return nil, nil, nil, nil } @@ -1031,7 +1055,7 @@ func (az *Cloud) getServiceLoadBalancerStatus(ctx context.Context, service *v1.S ipConfiguration := lb.Properties.FrontendIPConfigurations[i] owns, isPrimaryService, _ := az.serviceOwnsFrontendIP(ctx, ipConfiguration, service) if owns { - klog.V(2).Infof("get(%s): lb(%s) - found frontend IP config, primary service: %v", serviceName, ptr.Deref(lb.Name, ""), isPrimaryService) + logger.V(2).Info("found frontend IP config", "serviceName", serviceName, "lbName", ptr.Deref(lb.Name, ""), "isPrimaryService", isPrimaryService) var lbIP *string if isInternal { @@ -1057,7 +1081,7 @@ func (az *Cloud) getServiceLoadBalancerStatus(ctx context.Context, service *v1.S } } - klog.V(2).Infof("getServiceLoadBalancerStatus gets ingress IP %q from frontendIPConfiguration %q for service %q", ptr.Deref(lbIP, ""), ptr.Deref(ipConfiguration.Name, ""), serviceName) + logger.V(2).Info("gets ingress IP from frontendIPConfiguration for service", "ingressIP", ptr.Deref(lbIP, ""), "frontendIPConfiguration", ptr.Deref(ipConfiguration.Name, ""), "serviceName", serviceName) lbIngresses = append(lbIngresses, v1.LoadBalancerIngress{IP: ptr.Deref(lbIP, "")}) lbIPsPrimaryPIPs = append(lbIPsPrimaryPIPs, ptr.Deref(lbIP, "")) @@ -1143,6 +1167,7 @@ func updateServiceLoadBalancerIPs(service *v1.Service, serviceIPs []string) *v1. } func (az *Cloud) ensurePublicIPExists(ctx context.Context, service *v1.Service, pipName string, domainNameLabel, clusterName string, shouldPIPExisted, foundDNSLabelAnnotation, isIPv6 bool) (*armnetwork.PublicIPAddress, error) { + logger := log.FromContextOrBackground(ctx).WithName("ensurePublicIPExists") pipResourceGroup := az.getPublicIPAddressResourceGroup(service) pip, existsPip, err := az.getPublicIPAddress(ctx, pipResourceGroup, pipName, azcache.CacheReadTypeDefault) if err != nil { @@ -1184,12 +1209,11 @@ func (az *Cloud) ensurePublicIPExists(ctx context.Context, service *v1.Service, // return if pip exist and dns label is the same if strings.EqualFold(getDomainNameLabel(pip), domainNameLabel) { if existingServiceName := getServiceFromPIPDNSTags(pip.Tags); existingServiceName != "" && strings.EqualFold(existingServiceName, serviceName) { - klog.V(6).Infof("ensurePublicIPExists for service(%s): pip(%s) - "+ - "the service is using the DNS label on the public IP", serviceName, pipName) + logger.V(6).Info("the service is using the DNS label on the public IP", "serviceName", serviceName, "pipName", pipName) var err error if changed { - klog.V(2).Infof("ensurePublicIPExists: updating the PIP %s for the incoming service %s", pipName, serviceName) + logger.V(2).Info("updating the PIP for the incoming service", "pipName", pipName, "serviceName", serviceName) err = az.CreateOrUpdatePIP(service, pipResourceGroup, pip) if err != nil { return nil, err @@ -1204,7 +1228,7 @@ func (az *Cloud) ensurePublicIPExists(ctx context.Context, service *v1.Service, } } - klog.V(2).Infof("ensurePublicIPExists for service(%s): pip(%s) - updating", serviceName, ptr.Deref(pip.Name, "")) + logger.V(2).Info("updating", "serviceName", serviceName, "pipName", ptr.Deref(pip.Name, "")) if pip.Properties == nil { pip.Properties = &armnetwork.PublicIPAddressPropertiesFormat{ PublicIPAllocationMethod: to.Ptr(armnetwork.IPAllocationMethodStatic), @@ -1223,7 +1247,7 @@ func (az *Cloud) ensurePublicIPExists(ctx context.Context, service *v1.Service, Location: ptr.To(az.Location), } if az.HasExtendedLocation() { - klog.V(2).Infof("Using extended location with name %s, and type %s for PIP", az.ExtendedLocationName, az.ExtendedLocationType) + logger.V(2).Info("Using extended location for PIP", "name", az.ExtendedLocationName, "type", az.ExtendedLocationType) var typ *armnetwork.ExtendedLocationTypes if getExtendedLocationTypeFromString(az.ExtendedLocationType) == armnetwork.ExtendedLocationTypesEdgeZone { typ = to.Ptr(armnetwork.ExtendedLocationTypesEdgeZone) @@ -1267,7 +1291,7 @@ func (az *Cloud) ensurePublicIPExists(ctx context.Context, service *v1.Service, } } } - klog.V(2).Infof("ensurePublicIPExists for service(%s): pip(%s) - creating", serviceName, *pip.Name) + logger.V(2).Info("creating", "serviceName", serviceName, "pipName", *pip.Name) } if !isUserAssignedPIP && az.ensurePIPTagged(service, pip) { changed = true @@ -1292,14 +1316,14 @@ func (az *Cloud) ensurePublicIPExists(ctx context.Context, service *v1.Service, } if changed { - klog.V(2).Infof("CreateOrUpdatePIP(%s, %q): start", pipResourceGroup, *pip.Name) + logger.V(2).Info("CreateOrUpdatePIP: start", "pipResourceGroup", pipResourceGroup, "pipName", *pip.Name) err = az.CreateOrUpdatePIP(service, pipResourceGroup, pip) if err != nil { - klog.V(2).Infof("ensure(%s) abort backoff: pip(%s)", serviceName, *pip.Name) + logger.V(2).Info("ensure service abort backoff: pip", "serviceName", serviceName, "pipName", *pip.Name) return nil, err } - klog.V(10).Infof("CreateOrUpdatePIP(%s, %q): end", pipResourceGroup, *pip.Name) + logger.V(10).Info("CreateOrUpdatePIP: end", "pipResourceGroup", pipResourceGroup, "pipName", *pip.Name) } pip, rerr := az.NetworkClientFactory.GetPublicIPAddressClient().Get(ctx, pipResourceGroup, *pip.Name, nil) @@ -1310,13 +1334,14 @@ func (az *Cloud) ensurePublicIPExists(ctx context.Context, service *v1.Service, } func (az *Cloud) reconcileIPSettings(pip *armnetwork.PublicIPAddress, service *v1.Service, isIPv6 bool) bool { + logger := log.Background().WithName("reconcileIPSettings") var changed bool serviceName := getServiceName(service) if isIPv6 { if !strings.EqualFold(string(*pip.Properties.PublicIPAddressVersion), string(armnetwork.IPVersionIPv6)) { pip.Properties.PublicIPAddressVersion = to.Ptr(armnetwork.IPVersionIPv6) - klog.V(2).Infof("service(%s): pip(%s) - should be created as IPv6", serviceName, *pip.Name) + logger.V(2).Info("should be created as IPv6", "serviceName", serviceName, "pipName", *pip.Name) changed = true } @@ -1333,7 +1358,7 @@ func (az *Cloud) reconcileIPSettings(pip *armnetwork.PublicIPAddress, service *v } else { if !strings.EqualFold(string(*pip.Properties.PublicIPAddressVersion), string(armnetwork.IPVersionIPv4)) { pip.Properties.PublicIPAddressVersion = to.Ptr(armnetwork.IPVersionIPv4) - klog.V(2).Infof("service(%s): pip(%s) - should be created as IPv4", serviceName, *pip.Name) + logger.V(2).Info("should be created as IPv4", "serviceName", serviceName, "pipName", *pip.Name) changed = true } } @@ -1346,6 +1371,7 @@ func reconcileDNSSettings( domainNameLabel, serviceName, pipName string, isUserAssignedPIP bool, ) (bool, error) { + logger := log.Background().WithName("reconcileDNSSettings") var changed bool if existingServiceName := getServiceFromPIPDNSTags(pip.Tags); existingServiceName != "" && !strings.EqualFold(existingServiceName, serviceName) { @@ -1360,7 +1386,7 @@ func reconcileDNSSettings( } else { if pip.Properties.DNSSettings == nil || pip.Properties.DNSSettings.DomainNameLabel == nil { - klog.V(6).Infof("ensurePublicIPExists for service(%s): pip(%s) - no existing DNS label on the public IP, create one", serviceName, pipName) + logger.V(6).Info("ensurePublicIPExists - no existing DNS label on the public IP, create one", "serviceName", serviceName, "pipName", pipName) pip.Properties.DNSSettings = &armnetwork.PublicIPAddressDNSSettings{ DomainNameLabel: &domainNameLabel, } @@ -1730,6 +1756,7 @@ func (az *Cloud) reconcileMultipleStandardLoadBalancerConfigurations( existingLBs []*armnetwork.LoadBalancer, nodes []*v1.Node, ) (err error) { + logger := log.FromContextOrBackground(ctx).WithName("reconcileMultipleStandardLoadBalancerConfigurations") if !az.UseMultipleStandardLoadBalancers() { return nil } @@ -1756,7 +1783,7 @@ func (az *Cloud) reconcileMultipleStandardLoadBalancerConfigurations( svcs, err := az.KubeClient.CoreV1().Services("").List(ctx, metav1.ListOptions{}) if err != nil { - klog.Errorf("reconcileMultipleStandardLoadBalancerConfigurations: failed to list all load balancer services: %V", err) + logger.Error(err, "failed to list all load balancer services") return fmt.Errorf("failed to list all load balancer services: %w", err) } rulePrefixToSVCNameMap := make(map[string]string) @@ -1766,7 +1793,7 @@ func (az *Cloud) reconcileMultipleStandardLoadBalancerConfigurations( prefix := az.GetLoadBalancerName(ctx, "", &svc) svcName := getServiceName(&svc) rulePrefixToSVCNameMap[strings.ToLower(prefix)] = svcName - klog.V(2).Infof("reconcileMultipleStandardLoadBalancerConfigurations: found service %q with prefix %q", svcName, prefix) + logger.V(2).Info("found service with prefix", "service", svcName, "prefix", prefix) } } @@ -1782,16 +1809,13 @@ func (az *Cloud) reconcileMultipleStandardLoadBalancerConfigurations( } svcName, ok := rulePrefixToSVCNameMap[strings.ToLower(rulePrefix)] if ok { - klog.V(2).Infof( - "reconcileMultipleStandardLoadBalancerConfigurations: found load balancer %q with rule %q of service %q", - lbName, ruleName, svcName, - ) + logger.V(2).Info("found load balancer with rule of service", "load balancer", lbName, "rule", ruleName, "service", svcName) for i := range az.MultipleStandardLoadBalancerConfigurations { if strings.EqualFold(trimSuffixIgnoreCase(lbName, consts.InternalLoadBalancerNameSuffix), az.MultipleStandardLoadBalancerConfigurations[i].Name) { az.multipleStandardLoadBalancersActiveServicesLock.Lock() az.MultipleStandardLoadBalancerConfigurations[i].ActiveServices = utilsets.SafeInsert(az.MultipleStandardLoadBalancerConfigurations[i].ActiveServices, svcName) az.multipleStandardLoadBalancersActiveServicesLock.Unlock() - klog.V(2).Infof("reconcileMultipleStandardLoadBalancerConfigurations: service(%s) is active on lb(%s)", svcName, lbName) + logger.V(2).Info("service is active on lb", "service", svcName, "load balancer", lbName) } } } @@ -1807,9 +1831,10 @@ func (az *Cloud) reconcileMultipleStandardLoadBalancerConfigurations( // This entails adding rules/probes for expected Ports and removing stale rules/ports. // nodes only used if wantLb is true func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, nodes []*v1.Node, wantLb bool) (*armnetwork.LoadBalancer, bool /*needRetry*/, error) { + logger := log.FromContextOrBackground(ctx).WithName("reconcileLoadBalancer") isBackendPoolPreConfigured := az.isBackendPoolPreConfigured(service) serviceName := getServiceName(service) - klog.V(2).Infof("reconcileLoadBalancer for service(%s) - wantLb(%t): started", serviceName, wantLb) + logger.V(2).Info("started", "serviceName", serviceName, "wantLb", wantLb) existingLBs, err := az.ListManagedLBs(ctx, service, nodes, clusterName) if err != nil { @@ -1817,7 +1842,7 @@ func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, } if existingLBs, err = az.cleanupBasicLoadBalancer(ctx, clusterName, service, existingLBs); err != nil { - klog.ErrorS(err, "reconcileLoadBalancer: failed to check and remove outdated basic load balancers", "service", serviceName) + logger.Error(err, "failed to check and remove outdated basic load balancers", "service", serviceName) return nil, false, err } @@ -1827,23 +1852,23 @@ func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, if !az.UseMultipleStandardLoadBalancers() || !isLocalService(service) { existingLBs, err = az.cleanupLocalServiceBackendPool(ctx, service, nodes, existingLBs, clusterName) if err != nil { - klog.Errorf("reconcileLoadBalancer: failed to cleanup local service backend pool for service %q, error: %s", serviceName, err.Error()) + logger.Error(err, "failed to cleanup local service backend pool for service", "service", serviceName) return nil, false, err } } if err := az.reconcileMultipleStandardLoadBalancerConfigurations(ctx, existingLBs, service, clusterName, existingLBs, nodes); err != nil { - klog.Errorf("reconcileLoadBalancer: failed to reconcile multiple standard load balancer configurations: %s", err.Error()) + logger.Error(err, "failed to reconcile multiple standard load balancer configurations") return nil, false, err } lb, newLBs, lbStatus, _, _, deletedPLS, err := az.getServiceLoadBalancer(ctx, service, clusterName, nodes, wantLb, existingLBs) if err != nil { - klog.Errorf("reconcileLoadBalancer: failed to get load balancer for service %q, error: %v", serviceName, err) + logger.Error(err, "failed to get load balancer for service", "service", serviceName) return nil, false, err } if deletedPLS { - klog.V(2).InfoS("reconcileLoadBalancer: PLS is deleted and the LB ETag has changed, need to retry", "service", serviceName) + logger.V(2).Info("PLS is deleted and the LB ETag has changed, need to retry", "service", serviceName) return lb, true, nil } existingLBs = newLBs @@ -1851,8 +1876,7 @@ func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, lbName := *lb.Name lbResourceGroup := az.getLoadBalancerResourceGroup() lbBackendPoolIDs := az.getBackendPoolIDsForService(service, clusterName, lbName) - klog.V(2).Infof("reconcileLoadBalancer for service(%s): lb(%s/%s) wantLb(%t) resolved load balancer name", - serviceName, lbResourceGroup, lbName, wantLb) + logger.V(2).Info("resolved load balancer name", "service", serviceName, "lbResourceGroup", lbResourceGroup, "lbName", lbName, "wantLb", wantLb) lbFrontendIPConfigNames := az.getFrontendIPConfigNames(service) lbFrontendIPConfigIDs := map[bool]string{ consts.IPVersionIPv4: az.getFrontendIPConfigID(lbName, lbFrontendIPConfigNames[consts.IPVersionIPv4]), @@ -1961,12 +1985,11 @@ func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, fipConfigToDel := toDeleteConfigs[i] deletedPLS, err = az.reconcilePrivateLinkService(ctx, clusterName, service, fipConfigToDel, false /* wantPLS */) if err != nil { - klog.Errorf( - "reconcileLoadBalancer for service(%s): lb(%s) - failed to clean up PrivateLinkService for frontEnd(%s): %v", - serviceName, - lbName, - ptr.Deref(fipConfigToDel.Name, ""), - err, + logger.Error( + err, "failed to clean up PrivateLinkService for frontEnd", + "service", serviceName, + "lbName", lbName, + "frontEndConfig", ptr.Deref(fipConfigToDel.Name, ""), ) } if deletedPLS { @@ -1974,7 +1997,7 @@ func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, } } if needRetry { - klog.V(2).InfoS("reconcileLoadBalancer: PLS is deleted and the LB ETag has changed, need to retry", "service", serviceName) + logger.V(2).Info("PLS is deleted and the LB ETag has changed, need to retry", "service", serviceName) return lb, true, nil } } @@ -1982,21 +2005,21 @@ func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, if lb.Properties == nil || len(lb.Properties.FrontendIPConfigurations) == 0 { err := az.cleanOrphanedLoadBalancer(ctx, lb, existingLBs, service, clusterName) if err != nil { - klog.Errorf("reconcileLoadBalancer for service(%s): lb(%s) - failed to cleanOrphanedLoadBalancer: %v", serviceName, lbName, err) + logger.Error(err, "failed to cleanOrphanedLoadBalancer", "service", serviceName, "lbName", lbName) return nil, false, err } } else { - klog.V(2).Infof("reconcileLoadBalancer: reconcileLoadBalancer for service(%s): lb(%s) - updating", serviceName, lbName) + logger.V(2).Info("updating", "service", serviceName, "load balancer", lbName) err := az.CreateOrUpdateLB(ctx, service, *lb) if err != nil { - klog.Errorf("reconcileLoadBalancer for service(%s) abort backoff: lb(%s) - updating: %s", serviceName, lbName, err.Error()) + logger.Error(err, "abort backoff - updating", "service", serviceName, "lbName", lbName) return nil, false, err } // Refresh updated lb which will be used later in other places. newLB, exist, err := az.getAzureLoadBalancer(ctx, lbName, azcache.CacheReadTypeForceRefresh) if err != nil { - klog.Errorf("reconcileLoadBalancer for service(%s): getAzureLoadBalancer(%s) failed: %v", serviceName, lbName, err) + logger.Error(err, "getAzureLoadBalancer failed", "service", serviceName, "lbName", lbName) return nil, false, err } if !exist { @@ -2042,7 +2065,7 @@ func (az *Cloud) reconcileLoadBalancer(ctx context.Context, clusterName string, az.reconcileMultipleStandardLoadBalancerConfigurationStatus(wantLb, serviceName, lbName) } - klog.V(2).Infof("reconcileLoadBalancer for service(%s): lb(%s) finished", serviceName, lbName) + logger.V(2).Info("finished", "serviceName", serviceName, "lbName", lbName) return lb, false, nil } @@ -2113,9 +2136,10 @@ func removeLBFromList(lbs *[]*armnetwork.LoadBalancer, lbName string) { // removeNodeFromLBConfig searches for the occurrence of the given node in the lb configs and removes it func (az *Cloud) removeNodeFromLBConfig(nodeNameToLBConfigIDXMap map[string]int, nodeName string) { + logger := log.Background().WithName("removeNodeFromLBConfig") if idx, ok := nodeNameToLBConfigIDXMap[nodeName]; ok { currentLBConfigName := az.MultipleStandardLoadBalancerConfigurations[idx].Name - klog.V(4).Infof("reconcileMultipleStandardLoadBalancerBackendNodes: remove node(%s) on lb(%s)", nodeName, currentLBConfigName) + logger.V(4).Info("reconcileMultipleStandardLoadBalancerBackendNodes: remove node on lb", "node", nodeName, "lb", currentLBConfigName) az.multipleStandardLoadBalancersActiveNodesLock.Lock() az.MultipleStandardLoadBalancerConfigurations[idx].ActiveNodes.Delete(strings.ToLower(nodeName)) az.multipleStandardLoadBalancersActiveNodesLock.Unlock() @@ -2125,7 +2149,7 @@ func (az *Cloud) removeNodeFromLBConfig(nodeNameToLBConfigIDXMap map[string]int, // removeDeletedNodesFromLoadBalancerConfigurations removes the deleted nodes // that do not exist in nodes list from the load balancer configurations func (az *Cloud) removeDeletedNodesFromLoadBalancerConfigurations(nodes []*v1.Node) map[string]int { - logger := klog.Background().WithName("removeDeletedNodesFromLoadBalancerConfigurations") + logger := log.Background().WithName("removeDeletedNodesFromLoadBalancerConfigurations") nodeNamesSet := utilsets.NewString() for _, node := range nodes { nodeNamesSet.Insert(node.Name) @@ -2162,6 +2186,7 @@ func (az *Cloud) accommodateNodesByPrimaryVMSet( nodes []*v1.Node, nodeNameToLBConfigIDXMap map[string]int, ) error { + logger := log.FromContextOrBackground(ctx).WithName("accommodateNodesByPrimaryVMSet") for _, node := range nodes { if _, ok := az.nodesWithCorrectLoadBalancerByPrimaryVMSet.Load(strings.ToLower(node.Name)); ok { continue @@ -2170,7 +2195,7 @@ func (az *Cloud) accommodateNodesByPrimaryVMSet( // TODO(niqi): reduce the API calls for VMAS and standalone VMs vmSetName, err := az.VMSet.GetNodeVMSetName(ctx, node) if err != nil { - klog.Errorf("accommodateNodesByPrimaryVMSet: failed to get vmSetName for node(%s): %s", node.Name, err.Error()) + logger.Error(err, "failed to get vmSetName for node", "node", node.Name) return err } for i := range az.MultipleStandardLoadBalancerConfigurations { @@ -2178,13 +2203,13 @@ func (az *Cloud) accommodateNodesByPrimaryVMSet( if strings.EqualFold(multiSLBConfig.PrimaryVMSet, vmSetName) { foundPrimaryLB := isLBInList(lbs, multiSLBConfig.Name) if !foundPrimaryLB && !strings.EqualFold(trimSuffixIgnoreCase(lbName, consts.InternalLoadBalancerNameSuffix), multiSLBConfig.Name) { - klog.V(4).Infof("accommodateNodesByPrimaryVMSet: node(%s) should be on lb(%s) because of primary vmSet (%s), but the lb is not found and will not be created this time, will ignore the primaryVMSet", node.Name, multiSLBConfig.Name, vmSetName) + logger.V(4).Info("node should be on lb because of primary vmSet, but the lb is not found and will not be created this time, will ignore the primaryVMSet", "node", node.Name, "lb", multiSLBConfig.Name, "vmSetName", vmSetName) continue } az.nodesWithCorrectLoadBalancerByPrimaryVMSet.Store(strings.ToLower(node.Name), struct{}{}) if !multiSLBConfig.ActiveNodes.Has(node.Name) { - klog.V(4).Infof("accommodateNodesByPrimaryVMSet: node(%s) should be on lb(%s) because of primary vmSet (%s)", node.Name, multiSLBConfig.Name, vmSetName) + logger.V(4).Info("node should be on lb because of primary vmSet", "node", node.Name, "lb", multiSLBConfig.Name, "vmSetName", vmSetName) az.removeNodeFromLBConfig(nodeNameToLBConfigIDXMap, node.Name) @@ -2298,7 +2323,7 @@ func (az *Cloud) accommodateNodesByNodeSelector( continue } - klog.V(4).Infof("accommodateNodesByNodeSelector: node(%s) should be on lb(%s) it is the eligible LB with fewest number of nodes", node.Name, az.MultipleStandardLoadBalancerConfigurations[minNodesIDX].Name) + logger.V(4).Info("node should be on lb as it is the eligible LB with fewest number of nodes", "node", node.Name, "lb", az.MultipleStandardLoadBalancerConfigurations[minNodesIDX].Name) az.multipleStandardLoadBalancersActiveNodesLock.Lock() az.MultipleStandardLoadBalancerConfigurations[minNodesIDX].ActiveNodes = utilsets.SafeInsert(az.MultipleStandardLoadBalancerConfigurations[minNodesIDX].ActiveNodes, node.Name) az.multipleStandardLoadBalancersActiveNodesLock.Unlock() @@ -2406,16 +2431,17 @@ func (az *Cloud) recordExistingNodesOnLoadBalancers(clusterName string, lbs []*a } func (az *Cloud) reconcileMultipleStandardLoadBalancerConfigurationStatus(wantLb bool, svcName, lbName string) { + logger := log.Background().WithName("reconcileMultipleStandardLoadBalancerConfigurationStatus") lbName = trimSuffixIgnoreCase(lbName, consts.InternalLoadBalancerNameSuffix) for i := range az.MultipleStandardLoadBalancerConfigurations { if strings.EqualFold(lbName, az.MultipleStandardLoadBalancerConfigurations[i].Name) { az.multipleStandardLoadBalancersActiveServicesLock.Lock() if wantLb { - klog.V(4).Infof("reconcileMultipleStandardLoadBalancerConfigurationStatus: service(%s) is active on lb(%s)", svcName, lbName) + logger.V(4).Info("service is active on lb", "service", svcName, "lb", lbName) az.MultipleStandardLoadBalancerConfigurations[i].ActiveServices = utilsets.SafeInsert(az.MultipleStandardLoadBalancerConfigurations[i].ActiveServices, svcName) } else { - klog.V(4).Infof("reconcileMultipleStandardLoadBalancerConfigurationStatus: service(%s) is not active on lb(%s) any more", svcName, lbName) + logger.V(4).Info("service is not active on lb any more", "service", svcName, "lb", lbName) az.MultipleStandardLoadBalancerConfigurations[i].ActiveServices.Delete(svcName) } az.multipleStandardLoadBalancersActiveServicesLock.Unlock() @@ -2425,6 +2451,7 @@ func (az *Cloud) reconcileMultipleStandardLoadBalancerConfigurationStatus(wantLb } func (az *Cloud) reconcileLBProbes(lb *armnetwork.LoadBalancer, service *v1.Service, serviceName string, wantLb bool, expectedProbes []*armnetwork.Probe) bool { + logger := log.Background().WithName("reconcileLBProbes") expectedProbes, _ = az.keepSharedProbe(service, *lb, expectedProbes, wantLb) // remove unwanted probes @@ -2436,15 +2463,15 @@ func (az *Cloud) reconcileLBProbes(lb *armnetwork.LoadBalancer, service *v1.Serv for i := len(updatedProbes) - 1; i >= 0; i-- { existingProbe := updatedProbes[i] if az.serviceOwnsRule(service, *existingProbe.Name) { - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb probe(%s) - considering evicting", serviceName, wantLb, *existingProbe.Name) + logger.V(10).Info("considering evicting", "service", serviceName, "wantLb", wantLb, "probeName", *existingProbe.Name) keepProbe := false if findProbe(expectedProbes, existingProbe) { - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb probe(%s) - keeping", serviceName, wantLb, *existingProbe.Name) + logger.V(10).Info("keeping", "service", serviceName, "wantLb", wantLb, "probeName", *existingProbe.Name) keepProbe = true } if !keepProbe { updatedProbes = append(updatedProbes[:i], updatedProbes[i+1:]...) - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): lb probe(%s) - dropping", serviceName, wantLb, *existingProbe.Name) + logger.V(2).Info("dropping", "service", serviceName, "wantLb", wantLb, "probeName", *existingProbe.Name) dirtyProbes = true } } @@ -2453,24 +2480,25 @@ func (az *Cloud) reconcileLBProbes(lb *armnetwork.LoadBalancer, service *v1.Serv for _, expectedProbe := range expectedProbes { foundProbe := false if findProbe(updatedProbes, expectedProbe) { - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb probe(%s) - already exists", serviceName, wantLb, *expectedProbe.Name) + logger.V(10).Info("already exists", "service", serviceName, "wantLb", wantLb, "probeName", *expectedProbe.Name) foundProbe = true } if !foundProbe { - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb probe(%s) - adding", serviceName, wantLb, *expectedProbe.Name) + logger.V(10).Info("adding", "service", serviceName, "wantLb", wantLb, "probeName", *expectedProbe.Name) updatedProbes = append(updatedProbes, expectedProbe) dirtyProbes = true } } if dirtyProbes { probesJSON, _ := json.Marshal(expectedProbes) - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): lb probes updated: %s", serviceName, wantLb, string(probesJSON)) + logger.V(2).Info("updated", "service", serviceName, "wantLb", wantLb, "probes", string(probesJSON)) lb.Properties.Probes = updatedProbes } return dirtyProbes } func (az *Cloud) reconcileLBRules(lb *armnetwork.LoadBalancer, service *v1.Service, serviceName string, wantLb bool, expectedRules []*armnetwork.LoadBalancingRule) bool { + logger := log.Background().WithName("reconcileLBRules") // update rules dirtyRules := false var updatedRules []*armnetwork.LoadBalancingRule @@ -2483,13 +2511,13 @@ func (az *Cloud) reconcileLBRules(lb *armnetwork.LoadBalancer, service *v1.Servi existingRule := updatedRules[i] if az.serviceOwnsRule(service, *existingRule.Name) { keepRule := false - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb rule(%s) - considering evicting", serviceName, wantLb, *existingRule.Name) + logger.V(10).Info("considering evicting", "service", serviceName, "wantLb", wantLb, "rule", *existingRule.Name) if findRule(expectedRules, existingRule, wantLb) { - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb rule(%s) - keeping", serviceName, wantLb, *existingRule.Name) + logger.V(10).Info("keeping", "service", serviceName, "wantLb", wantLb, "rule", *existingRule.Name) keepRule = true } if !keepRule { - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): lb rule(%s) - dropping", serviceName, wantLb, *existingRule.Name) + logger.V(2).Info("dropping", "service", serviceName, "wantLb", wantLb, "rule", *existingRule.Name) updatedRules = append(updatedRules[:i], updatedRules[i+1:]...) dirtyRules = true } @@ -2499,18 +2527,18 @@ func (az *Cloud) reconcileLBRules(lb *armnetwork.LoadBalancer, service *v1.Servi for _, expectedRule := range expectedRules { foundRule := false if findRule(updatedRules, expectedRule, wantLb) { - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb rule(%s) - already exists", serviceName, wantLb, *expectedRule.Name) + logger.V(10).Info("already exists", "service", serviceName, "wantLb", wantLb, "rule", *expectedRule.Name) foundRule = true } if !foundRule { - klog.V(10).Infof("reconcileLoadBalancer for service (%s)(%t): lb rule(%s) adding", serviceName, wantLb, *expectedRule.Name) + logger.V(10).Info("adding", "service", serviceName, "wantLb", wantLb, "rule", *expectedRule.Name) updatedRules = append(updatedRules, expectedRule) dirtyRules = true } } if dirtyRules { ruleJSON, _ := json.Marshal(expectedRules) - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): lb rules updated: %s", serviceName, wantLb, string(ruleJSON)) + logger.V(2).Info("updated", "service", serviceName, "wantLb", wantLb, "rules", string(ruleJSON)) lb.Properties.LoadBalancingRules = updatedRules } return dirtyRules @@ -2525,6 +2553,7 @@ func (az *Cloud) reconcileFrontendIPConfigs( wantLb bool, lbFrontendIPConfigNames map[bool]string, ) ([]*armnetwork.FrontendIPConfiguration, []*armnetwork.FrontendIPConfiguration, bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("reconcileFrontendIPConfigs") var err error lbName := *lb.Name serviceName := getServiceName(service) @@ -2557,9 +2586,9 @@ func (az *Cloud) reconcileFrontendIPConfigs( var configNameToBeDeleted string if newConfigs[i].Name != nil { configNameToBeDeleted = *newConfigs[i].Name - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): lb frontendconfig(%s) - dropping", serviceName, wantLb, configNameToBeDeleted) + logger.V(2).Info("dropping", "service", serviceName, "wantLb", wantLb, "configNameToBeDeleted", configNameToBeDeleted) } else { - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): nil name of lb frontendconfig", serviceName, wantLb) + logger.V(2).Info("nil name", "service", serviceName, "wantLb", wantLb) } toDeleteConfigs = append(toDeleteConfigs, newConfigs[i]) @@ -2601,10 +2630,10 @@ func (az *Cloud) reconcileFrontendIPConfigs( config := newConfigs[i] isServiceOwnsFrontendIP, _, fipIPVersion := az.serviceOwnsFrontendIP(ctx, config, service) if !isServiceOwnsFrontendIP { - klog.V(4).Infof("reconcileFrontendIPConfigs for service (%s): the frontend IP configuration %s does not belong to the service", serviceName, ptr.Deref(config.Name, "")) + logger.V(4).Info("the frontend IP configuration does not belong to the service", "service", serviceName, "config", ptr.Deref(config.Name, "")) continue } - klog.V(4).Infof("reconcileFrontendIPConfigs for service (%s): checking owned frontend IP configuration %s", serviceName, ptr.Deref(config.Name, "")) + logger.V(4).Info("checking owned frontend IP configuration", "service", serviceName, "config", ptr.Deref(config.Name, "")) var isIPv6 bool var err error if fipIPVersion != nil { @@ -2620,7 +2649,7 @@ func (az *Cloud) reconcileFrontendIPConfigs( return nil, toDeleteConfigs, false, err } if isFipChanged { - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): lb frontendconfig(%s) - dropping", serviceName, wantLb, *config.Name) + logger.V(2).Info("dropping", "service", serviceName, "wantLb", wantLb, "config", *config.Name) toDeleteConfigs = append(toDeleteConfigs, newConfigs[i]) newConfigs = append(newConfigs[:i], newConfigs[i+1:]...) dirtyConfigs = true @@ -2637,8 +2666,7 @@ func (az *Cloud) reconcileFrontendIPConfigs( } addNewFIPOfService := func(isIPv6 bool) error { - klog.V(4).Infof("ensure(%s): lb(%s) - creating a new frontend IP config %q (isIPv6=%t)", - serviceName, lbName, lbFrontendIPConfigNames[isIPv6], isIPv6) + logger.V(4).Info("creating a new frontend IP config", "ensure service", serviceName, "lb", lbName, "config", lbFrontendIPConfigNames[isIPv6], "isIPv6", isIPv6) // construct FrontendIPConfigurationPropertiesFormat var fipConfigurationProperties *armnetwork.FrontendIPConfigurationPropertiesFormat @@ -2664,20 +2692,20 @@ func (az *Cloud) reconcileFrontendIPConfigs( return privateIP != "" } if loadBalancerIP != "" { - klog.V(4).Infof("reconcileFrontendIPConfigs for service (%s): use loadBalancerIP %q from Service spec", serviceName, loadBalancerIP) + logger.V(4).Info("use loadBalancerIP from Service spec", "service", serviceName, "loadBalancerIP", loadBalancerIP) configProperties.PrivateIPAllocationMethod = to.Ptr(armnetwork.IPAllocationMethodStatic) configProperties.PrivateIPAddress = &loadBalancerIP } else if status != nil && len(status.Ingress) > 0 && ingressIPInSubnet(status.Ingress) { - klog.V(4).Infof("reconcileFrontendIPConfigs for service (%s): keep the original private IP %s", serviceName, privateIP) + logger.V(4).Info("keep the original private IP", "service", serviceName, "privateIP", privateIP) configProperties.PrivateIPAllocationMethod = to.Ptr(armnetwork.IPAllocationMethodStatic) configProperties.PrivateIPAddress = ptr.To(privateIP) } else if len(service.Status.LoadBalancer.Ingress) > 0 && ingressIPInSubnet(service.Status.LoadBalancer.Ingress) { - klog.V(4).Infof("reconcileFrontendIPConfigs for service (%s): keep the original private IP %s from service.status.loadbalacner.ingress", serviceName, privateIP) + logger.V(4).Info("keep the original private IP from service.status.loadbalacner.ingress", "service", serviceName, "privateIP", privateIP) configProperties.PrivateIPAllocationMethod = to.Ptr(armnetwork.IPAllocationMethodStatic) configProperties.PrivateIPAddress = ptr.To(privateIP) } else { // We'll need to call GetLoadBalancer later to retrieve allocated IP. - klog.V(4).Infof("reconcileFrontendIPConfigs for service (%s): dynamically allocate the private IP", serviceName) + logger.V(4).Info("dynamically allocate the private IP", "service", serviceName) configProperties.PrivateIPAllocationMethod = to.Ptr(armnetwork.IPAllocationMethodDynamic) } @@ -2705,12 +2733,12 @@ func (az *Cloud) reconcileFrontendIPConfigs( if isInternal { if err := az.getFrontendZones(ctx, newConfig, previousZone, isFipChanged, serviceName, lbFrontendIPConfigNames[isIPv6]); err != nil { - klog.Errorf("reconcileLoadBalancer for service (%s)(%t): failed to getFrontendZones: %s", serviceName, wantLb, err.Error()) + logger.Error(err, "failed to getFrontendZones", "service", serviceName, "wantLb", wantLb) return err } } newConfigs = append(newConfigs, newConfig) - klog.V(2).Infof("reconcileLoadBalancer for service (%s)(%t): lb frontendconfig(%s) - adding", serviceName, wantLb, lbFrontendIPConfigNames[isIPv6]) + logger.V(2).Info("lb frontendconfig - adding", "service", serviceName, "wantLb", wantLb, "config", lbFrontendIPConfigNames[isIPv6]) dirtyConfigs = true return nil } @@ -2742,6 +2770,7 @@ func (az *Cloud) getFrontendZones( isFipChanged bool, serviceName, lbFrontendIPConfigName string, ) error { + logger := log.FromContextOrBackground(ctx).WithName("getFrontendZones") if !isFipChanged { // fetch zone information from API for new frontends // only add zone information for new internal frontend IP configurations for standard load balancer not deployed to an edge zone. location := az.Location @@ -2754,10 +2783,10 @@ func (az *Cloud) getFrontendZones( } } else { if previousZone == nil { // keep the existing zone information for existing frontends - klog.V(2).Infof("getFrontendZones for service (%s): lb frontendconfig(%s): setting zone to nil", serviceName, lbFrontendIPConfigName) + logger.V(2).Info("setting zone to nil", "service", serviceName, "lbFrontendIPConfig", lbFrontendIPConfigName) } else { zoneStr := strings.Join(lo.FromSlicePtr(previousZone), ",") - klog.V(2).Infof("getFrontendZones for service (%s): lb frontendconfig(%s): setting zone to %s", serviceName, lbFrontendIPConfigName, zoneStr) + logger.V(2).Info("setting zone", "service", serviceName, "lbFrontendIPConfig", lbFrontendIPConfigName, "zone", zoneStr) } fipConfig.Zones = previousZone } @@ -2875,6 +2904,7 @@ func (az *Cloud) getExpectedLBRules( lbName string, isIPv6 bool, ) ([]*armnetwork.Probe, []*armnetwork.LoadBalancingRule, error) { + logger := log.Background().WithName("getExpectedLBRules") var expectedRules []*armnetwork.LoadBalancingRule var expectedProbes []*armnetwork.Probe @@ -2917,7 +2947,7 @@ func (az *Cloud) getExpectedLBRules( consts.IsK8sServiceHasHAModeEnabled(service) { lbRuleName := az.getloadbalancerHAmodeRuleName(service, isIPv6) - klog.V(2).Infof("getExpectedLBRules lb name (%s) rule name (%s)", lbName, lbRuleName) + logger.V(2).Info("getExpectedLBRules", "lbName", lbName, "ruleName", lbRuleName) props, err := az.getExpectedHAModeLoadBalancingRuleProperties(service, lbFrontendIPConfigID, lbBackendPoolID) if err != nil { @@ -2929,7 +2959,7 @@ func (az *Cloud) getExpectedLBRules( for _, port := range service.Spec.Ports { portprobe, err := az.buildHealthProbeRulesForPort(service, port, lbRuleName, nil, false) if err != nil { - klog.V(2).ErrorS(err, "error occurred when buildHealthProbeRulesForPort", "service", service.Name, "namespace", service.Namespace, + logger.V(2).Error(err, "error occurred when buildHealthProbeRulesForPort", "service", service.Name, "namespace", service.Namespace, "rule-name", lbRuleName, "port", port.Port) // ignore error because we only need one correct rule } @@ -2958,15 +2988,15 @@ func (az *Cloud) getExpectedLBRules( for _, port := range service.Spec.Ports { lbRuleName := az.getLoadBalancerRuleName(service, port.Protocol, port.Port, isIPv6) - klog.V(2).Infof("getExpectedLBRules lb name (%s) rule name (%s)", lbName, lbRuleName) + logger.V(2).Info("getExpectedLBRules", "lbName", lbName, "ruleName", lbRuleName) isNoLBRuleRequired, err := consts.IsLBRuleOnK8sServicePortDisabled(service.Annotations, port.Port) if err != nil { err := fmt.Errorf("failed to parse annotation %s: %w", consts.BuildAnnotationKeyForPort(port.Port, consts.PortAnnotationNoLBRule), err) - klog.V(2).ErrorS(err, "error occurred when getExpectedLoadBalancingRulePropertiesForPort", "service", service.Name, "namespace", service.Namespace, + logger.V(2).Error(err, "error occurred when getExpectedLoadBalancingRulePropertiesForPort", "service", service.Name, "namespace", service.Namespace, "rule-name", lbRuleName, "port", port.Port) } if isNoLBRuleRequired { - klog.V(2).Infof("getExpectedLBRules lb name (%s) rule name (%s) no lb rule required", lbName, lbRuleName) + logger.V(2).Info("no lb rule required", "lbName", lbName, "ruleName", lbRuleName) continue } if port.Protocol == v1.ProtocolSCTP && !(az.UseStandardLoadBalancer() && consts.IsK8sServiceUsingInternalLoadBalancer(service)) { @@ -2985,13 +3015,13 @@ func (az *Cloud) getExpectedLBRules( isNoHealthProbeRule, err := consts.IsHealthProbeRuleOnK8sServicePortDisabled(service.Annotations, port.Port) if err != nil { err := fmt.Errorf("failed to parse annotation %s: %w", consts.BuildAnnotationKeyForPort(port.Port, consts.PortAnnotationNoHealthProbeRule), err) - klog.V(2).ErrorS(err, "error occurred when buildHealthProbeRulesForPort", "service", service.Name, "namespace", service.Namespace, + logger.V(2).Error(err, "error occurred when buildHealthProbeRulesForPort", "service", service.Name, "namespace", service.Namespace, "rule-name", lbRuleName, "port", port.Port) } if !isNoHealthProbeRule { portprobe, err := az.buildHealthProbeRulesForPort(service, port, lbRuleName, nodeEndpointHealthprobe, useSharedProbe) if err != nil { - klog.V(2).ErrorS(err, "error occurred when buildHealthProbeRulesForPort", "service", service.Name, "namespace", service.Namespace, + logger.V(2).Error(err, "error occurred when buildHealthProbeRulesForPort", "service", service.Name, "namespace", service.Namespace, "rule-name", lbRuleName, "port", port.Port) return expectedProbes, expectedRules, err } @@ -3497,6 +3527,7 @@ func (az *Cloud) getPublicIPUpdates( serviceAnnotationRequestsNamedPublicIP, isIPv6 bool, ) (bool, []*armnetwork.PublicIPAddress, bool, []*armnetwork.PublicIPAddress, error) { + logger := log.Background().WithName("getPublicIPUpdates") var ( err error discoveredDesiredPublicIP bool @@ -3531,7 +3562,7 @@ func (az *Cloud) getPublicIPUpdates( dirtyPIP, toBeDeleted bool ) if !wantLb && !isUserAssignedPIP { - klog.V(2).Infof("reconcilePublicIP for service(%s): unbinding the service from pip %s", serviceName, *pip.Name) + logger.V(2).Info("reconcilePublicIP for service: unbinding the service from pip", "service", serviceName, "pip", *pip.Name) if serviceReferences, err = unbindServiceFromPIP(pip, serviceName, isUserAssignedPIP); err != nil { return false, nil, false, nil, err } @@ -3572,6 +3603,7 @@ func (az *Cloud) getPublicIPUpdates( // safeDeletePublicIP deletes public IP by removing its reference first. func (az *Cloud) safeDeletePublicIP(ctx context.Context, service *v1.Service, pipResourceGroup string, pip *armnetwork.PublicIPAddress, lb *armnetwork.LoadBalancer) error { + logger := log.FromContextOrBackground(ctx).WithName("safeDeletePublicIP") // Remove references if pip.IPConfiguration is not nil. if pip.Properties != nil && pip.Properties.IPConfiguration != nil { @@ -3581,7 +3613,7 @@ func (az *Cloud) safeDeletePublicIP(ctx context.Context, service *v1.Service, pi // stored in the cache and is not up-to-date. latestPIP, ok, err := az.getPublicIPAddress(ctx, pipResourceGroup, *pip.Name, azcache.CacheReadTypeForceRefresh) if err != nil { - klog.Errorf("safeDeletePublicIP: failed to get latest public IP %s/%s: %s", pipResourceGroup, *pip.Name, err.Error()) + logger.Error(err, "failed to get latest public IP", "pipResourceGroup", pipResourceGroup, "pipName", *pip.Name) return err } if ok && latestPIP.Properties != nil && @@ -3642,7 +3674,7 @@ func (az *Cloud) safeDeletePublicIP(ctx context.Context, service *v1.Service, pi if frontendIPConfigUpdated || loadBalancerRuleUpdated { err := az.CreateOrUpdateLB(ctx, service, *lb) if err != nil { - klog.Errorf("safeDeletePublicIP for service(%s) failed with error: %v", getServiceName(service), err) + logger.Error(err, "safeDeletePublicIP for service failed", "service", getServiceName(service)) return err } } @@ -3650,12 +3682,12 @@ func (az *Cloud) safeDeletePublicIP(ctx context.Context, service *v1.Service, pi } pipName := ptr.Deref(pip.Name, "") - klog.V(10).Infof("DeletePublicIP(%s, %q): start", pipResourceGroup, pipName) + logger.V(10).Info("start", "pipResourceGroup", pipResourceGroup, "pipName", pipName) err := az.DeletePublicIP(service, pipResourceGroup, pipName) if err != nil { return err } - klog.V(10).Infof("DeletePublicIP(%s, %q): end", pipResourceGroup, pipName) + logger.V(10).Info("end", "pipResourceGroup", pipResourceGroup, "pipName", pipName) return nil } @@ -3760,12 +3792,13 @@ func getInternalSubnet(service *v1.Service) *string { } func ipInSubnet(ip string, subnet *armnetwork.Subnet) bool { + logger := log.Background().WithName("ipInSubnet") if subnet == nil || subnet.Properties == nil { return false } netIP, err := netip.ParseAddr(ip) if err != nil { - klog.Errorf("ipInSubnet: failed to parse ip %s: %v", netIP, err) + logger.Error(err, "failed to parse ip", "ip", ip) return false } cidrs := make([]*string, 0) @@ -3778,7 +3811,7 @@ func ipInSubnet(ip string, subnet *armnetwork.Subnet) bool { for _, cidr := range cidrs { network, err := netip.ParsePrefix(*cidr) if err != nil { - klog.Errorf("ipInSubnet: failed to parse ip cidr %s: %v", *cidr, err) + logger.Error(err, "failed to parse ip cidr", "cidr", *cidr) continue } if network.Contains(netIP) { @@ -3816,6 +3849,7 @@ func useSharedSecurityRule(service *v1.Service) bool { // 1. The serviceName is included in the service tags of a system-created pip. // 2. The service LoadBalancerIP matches the IP address of a user-created pip. func serviceOwnsPublicIP(service *v1.Service, pip *armnetwork.PublicIPAddress, clusterName string) (bool, bool) { + logger := log.Background().WithName("serviceOwnsPublicIP") if service == nil || pip == nil { klog.Warningf("serviceOwnsPublicIP: nil service or public IP") return false, false @@ -3835,7 +3869,7 @@ func serviceOwnsPublicIP(service *v1.Service, pip *armnetwork.PublicIPAddress, c if serviceTag == "" { // For user-created PIPs, we need a valid IP address to match against if pip.Properties == nil || ptr.Deref(pip.Properties.IPAddress, "") == "" { - klog.V(4).Infof("serviceOwnsPublicIP: empty pip.Properties.IPAddress for user-created PIP") + logger.V(4).Info("empty pip.Properties.IPAddress for user-created PIP") return false, true } return isServiceSelectPIP(service, pip, isIPv6), true @@ -3857,7 +3891,7 @@ func serviceOwnsPublicIP(service *v1.Service, pip *armnetwork.PublicIPAddress, c // or pip name, this could happen for secondary services // For secondary services, we need a valid IP address to match against if pip.Properties == nil || ptr.Deref(pip.Properties.IPAddress, "") == "" { - klog.V(4).Infof("serviceOwnsPublicIP: empty pip.Properties.IPAddress for secondary service check") + logger.V(4).Info("empty pip.Properties.IPAddress for secondary service check") return false, false } return isServiceSelectPIP(service, pip, isIPv6), false @@ -3866,7 +3900,7 @@ func serviceOwnsPublicIP(service *v1.Service, pip *armnetwork.PublicIPAddress, c // if the pip has no tags, it should be user-created // For user-created PIPs, we need a valid IP address to match against if pip.Properties == nil || ptr.Deref(pip.Properties.IPAddress, "") == "" { - klog.V(4).Infof("serviceOwnsPublicIP: empty pip.Properties.IPAddress for untagged PIP") + logger.V(4).Info("empty pip.Properties.IPAddress for untagged PIP") return false, true } return isServiceSelectPIP(service, pip, isIPv6), true @@ -3919,6 +3953,7 @@ func parsePIPServiceTag(serviceTag *string) []string { // example: // "ns1/svc1" + ["ns1/svc1", "ns2/svc2"] = "ns1/svc1,ns2/svc2" func bindServicesToPIP(pip *armnetwork.PublicIPAddress, incomingServiceNames []string, replace bool) (bool, error) { + logger := log.Background().WithName("bindServicesToPIP") if pip == nil { return false, fmt.Errorf("nil public IP") } @@ -3956,7 +3991,7 @@ func bindServicesToPIP(pip *armnetwork.PublicIPAddress, incomingServiceNames []s *serviceTagValue += fmt.Sprintf(",%s", serviceName) addedNew = true } else { - klog.V(10).Infof("service %s has been bound to the pip already", serviceName) + logger.V(10).Info("service has been bound to the pip already", "service", serviceName) } } } @@ -4081,9 +4116,10 @@ func getMostEligibleLBForService( existingLBs []*armnetwork.LoadBalancer, isInternal bool, ) string { + logger := log.Background().WithName("getMostEligibleLBForService") // 1. If the LB is eligible and being used, choose it. if StringInSlice(currentLBName, eligibleLBs) { - klog.V(4).Infof("getMostEligibleLBForService: choose %s as it is eligible and being used", currentLBName) + logger.V(4).Info("choose LB as it is eligible and being used", "currentLBName", currentLBName) return currentLBName } @@ -4100,7 +4136,7 @@ func getMostEligibleLBForService( } if !found { - klog.V(4).Infof("getMostEligibleLBForService: choose %s as it is eligible and not existing", eligibleLB) + logger.V(4).Info("choose LB as it is eligible and not existing", "eligibleLB", eligibleLB) return eligibleLB } } @@ -4123,7 +4159,7 @@ func getMostEligibleLBForService( } if expectedLBName != "" { - klog.V(4).Infof("getMostEligibleLBForService: choose %s with fewest %d rules", expectedLBName, ruleCount) + logger.V(4).Info("choose LB with fewest rules", "expectedLBName", expectedLBName, "ruleCount", ruleCount) } return trimSuffixIgnoreCase(expectedLBName, consts.InternalLoadBalancerNameSuffix) @@ -4156,7 +4192,7 @@ func (az *Cloud) getEligibleLoadBalancersForService(ctx context.Context, service lbFailedPlacementFlag []string ) - logger := klog.Background(). + logger := log.FromContextOrBackground(ctx). WithName("getEligibleLoadBalancersForService"). WithValues("service", service.Name) @@ -4314,10 +4350,11 @@ func (az *Cloud) isLoadBalancerInUseByService(service *v1.Service, lbConfig conf // service. Hence, it can be tracked by the loadBalancer IP. // If the IP version is not empty, which means it is the secondary Service, it returns IP version of the Service FIP. func (az *Cloud) serviceOwnsFrontendIP(ctx context.Context, fip *armnetwork.FrontendIPConfiguration, service *v1.Service) (bool, bool, *armnetwork.IPVersion) { + logger := log.FromContextOrBackground(ctx).WithName("serviceOwnsFrontendIP") var isPrimaryService bool baseName := az.GetLoadBalancerName(ctx, "", service) if fip != nil && strings.HasPrefix(ptr.Deref(fip.Name, ""), baseName) { - klog.V(6).Infof("serviceOwnsFrontendIP: found primary service %s of the frontend IP config %s", service.Name, *fip.Name) + logger.V(6).Info("found primary service of the frontend IP config", "service", service.Name, "frontendIPConfig", *fip.Name) isPrimaryService = true return true, isPrimaryService, nil } @@ -4357,8 +4394,9 @@ func (az *Cloud) serviceOwnsFrontendIP(ctx context.Context, fip *armnetwork.Fron if publicIPOwnsFrontendIP(service, fip, pip) { return true, isPrimaryService, pip.Properties.PublicIPAddressVersion } - klog.V(6).Infof("serviceOwnsFrontendIP: the public IP with ID %s is being referenced by other service with public IP address %s "+ - "OR it is of incorrect IP version", *pip.ID, *pip.Properties.IPAddress) + logger.V(6).Info("the public IP with ID is being referenced by other service with public IP address"+ + "OR it is of incorrect IP version", + "pipID", *pip.ID, "pipIPAddress", *pip.Properties.IPAddress) } return false, isPrimaryService, nil diff --git a/pkg/provider/azure_loadbalancer_backendpool.go b/pkg/provider/azure_loadbalancer_backendpool.go index 0bbbad0555..7098e841f6 100644 --- a/pkg/provider/azure_loadbalancer_backendpool.go +++ b/pkg/provider/azure_loadbalancer_backendpool.go @@ -33,6 +33,7 @@ import ( "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/metrics" utilsets "sigs.k8s.io/cloud-provider-azure/pkg/util/sets" ) @@ -83,6 +84,7 @@ func isLBBackendPoolsExisting(lbBackendPoolNames map[bool]string, bpName *string } func (bc *backendPoolTypeNodeIPConfig) CleanupVMSetFromBackendPoolByCondition(ctx context.Context, slb *armnetwork.LoadBalancer, service *v1.Service, _ []*v1.Node, clusterName string, shouldRemoveVMSetFromSLB func(string) bool) (*armnetwork.LoadBalancer, error) { + logger := log.FromContextOrBackground(ctx).WithName("bc.CleanupVMSetFromBackendPoolByCondition") v4Enabled, v6Enabled := getIPFamiliesEnabled(service) lbBackendPoolNames := getBackendPoolNames(clusterName) @@ -95,7 +97,7 @@ func (bc *backendPoolTypeNodeIPConfig) CleanupVMSetFromBackendPoolByCondition(ct for j, bp := range newBackendPools { if found, _ := isLBBackendPoolsExisting(lbBackendPoolNames, bp.Name); found { - klog.V(2).Infof("bc.CleanupVMSetFromBackendPoolByCondition: checking the backend pool %s from standard load balancer %s", ptr.Deref(bp.Name, ""), ptr.Deref(slb.Name, "")) + logger.V(2).Info("checking the backend pool from standard load balancer", "backendPoolName", ptr.Deref(bp.Name, ""), "lbName", ptr.Deref(slb.Name, "")) if bp.Properties != nil && bp.Properties.BackendIPConfigurations != nil { for i := len(bp.Properties.BackendIPConfigurations) - 1; i >= 0; i-- { ipConf := (bp.Properties.BackendIPConfigurations)[i] @@ -106,7 +108,7 @@ func (bc *backendPoolTypeNodeIPConfig) CleanupVMSetFromBackendPoolByCondition(ct } if shouldRemoveVMSetFromSLB(vmSetName) { - klog.V(2).Infof("bc.CleanupVMSetFromBackendPoolByCondition: found unwanted vmSet %s, decouple it from the LB", vmSetName) + logger.V(2).Info("found unwanted vmSet, decouple it from the LB", "vmSetName", vmSetName) // construct a backendPool that only contains the IP config of the node to be deleted interfaceIPConfigToBeDeleted := &armnetwork.InterfaceIPConfiguration{ ID: ptr.To(ipConfigID), @@ -163,6 +165,7 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools( service *v1.Service, lb *armnetwork.LoadBalancer, ) (bool, bool, *armnetwork.LoadBalancer, error) { + logger := log.FromContextOrBackground(ctx).WithName("bc.ReconcileBackendPools") var newBackendPools []*armnetwork.BackendAddressPool var err error if lb.Properties.BackendAddressPools != nil { @@ -187,7 +190,7 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools( bp := newBackendPools[i] found, isIPv6 := isLBBackendPoolsExisting(lbBackendPoolNames, bp.Name) if found { - klog.V(10).Infof("bc.ReconcileBackendPools for service (%s): lb backendpool - found wanted backendpool. not adding anything", serviceName) + logger.V(10).Info("lb backendpool - found wanted backendpool. not adding anything", "serviceName", serviceName) foundBackendPools[isBackendPoolIPv6(ptr.Deref(bp.Name, ""))] = true // Don't bother to remove unused nodeIPConfiguration if backend pool is pre configured @@ -205,7 +208,7 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools( isMigration = true bp.Properties.VirtualNetwork = nil if err := bc.CreateOrUpdateLBBackendPool(ctx, lbName, bp); err != nil { - klog.Errorf("bc.ReconcileBackendPools for service (%s): failed to cleanup IP based backend pool %s: %s", serviceName, lbBackendPoolNames[isIPv6], err.Error()) + logger.Error(err, "bc.ReconcileBackendPools: failed to cleanup IP based backend pool", "service", serviceName, "backendPoolName", lbBackendPoolNames[isIPv6]) return false, false, nil, fmt.Errorf("bc.ReconcileBackendPools for service (%s): failed to cleanup IP based backend pool %s: %w", serviceName, lbBackendPoolNames[isIPv6], err) } newBackendPools[i] = bp @@ -221,7 +224,7 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools( nodeName, _, err := bc.VMSet.GetNodeNameByIPConfigurationID(ctx, ipConfID) if err != nil { if errors.Is(err, cloudprovider.InstanceNotFound) { - klog.V(2).Infof("bc.ReconcileBackendPools for service (%s): vm not found for ipConfID %s", serviceName, ipConfID) + logger.V(2).Info("vm not found for ipConfID", "serviceName", serviceName, "ipConfID", ipConfID) bipConfigNotFound = append(bipConfigNotFound, ipConf) } else { return false, false, nil, err @@ -234,11 +237,11 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools( // delete them from the pool. shouldExcludeLoadBalancer, err := bc.ShouldNodeExcludedFromLoadBalancer(nodeName) if err != nil { - klog.Errorf("bc.ReconcileBackendPools: ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", nodeName, err) + logger.Error(err, "bc.ReconcileBackendPools: ShouldNodeExcludedFromLoadBalancer failed", "node", nodeName) return false, false, nil, err } if shouldExcludeLoadBalancer { - klog.V(2).Infof("bc.ReconcileBackendPools for service (%s): lb backendpool - found unwanted node %s, decouple it from the LB %s", serviceName, nodeName, lbName) + logger.V(2).Info("lb backendpool - found unwanted node, decouple it from the LB", "serviceName", serviceName, "nodeName", nodeName, "lbName", lbName) // construct a backendPool that only contains the IP config of the node to be deleted bipConfigExclude = append(bipConfigExclude, &armnetwork.InterfaceIPConfiguration{ID: ptr.To(ipConfID)}) } @@ -255,7 +258,7 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools( lbBackendPoolIDsSlice = append(lbBackendPoolIDsSlice, lbBackendPoolIDs[isIPv6]) } } else { - klog.V(10).Infof("bc.ReconcileBackendPools for service (%s): lb backendpool - found unmanaged backendpool %s", serviceName, ptr.Deref(bp.Name, "")) + logger.V(10).Info("lb backendpool - found unmanaged backendpool", "serviceName", serviceName, "backendPoolName", ptr.Deref(bp.Name, "")) } } if len(backendpoolToBeDeleted) > 0 { @@ -270,7 +273,7 @@ func (bc *backendPoolTypeNodeIPConfig) ReconcileBackendPools( } if backendPoolsUpdated { - klog.V(4).Infof("bc.ReconcileBackendPools for service(%s): refreshing load balancer %s", serviceName, lbName) + logger.V(4).Info("refreshing load balancer", "serviceName", serviceName, "lbName", lbName) lb, _, err = bc.getAzureLoadBalancer(ctx, lbName, cache.CacheReadTypeForceRefresh) if err != nil { return false, false, nil, fmt.Errorf("bc.ReconcileBackendPools for service (%s): failed to get loadbalancer %s: %w", serviceName, lbName, err) @@ -301,6 +304,7 @@ func getBackendIPConfigurationsToBeDeleted( bp armnetwork.BackendAddressPool, bipConfigNotFound, bipConfigExclude []*armnetwork.InterfaceIPConfiguration, ) []*armnetwork.InterfaceIPConfiguration { + logger := log.Background().WithName("getBackendIPConfigurationsToBeDeleted") if bp.Properties == nil || bp.Properties.BackendIPConfigurations == nil { return []*armnetwork.InterfaceIPConfiguration{} } @@ -332,13 +336,14 @@ func getBackendIPConfigurationsToBeDeleted( } } if len(unwantedIPConfigs) == len(ipConfigs) { - klog.V(2).Info("getBackendIPConfigurationsToBeDeleted: the pool is empty or will be empty after removing the unwanted IP addresses, skipping the removal") + logger.V(2).Info("the pool is empty or will be empty after removing the unwanted IP addresses, skipping the removal") return bipConfigToBeDeleted } return append(bipConfigToBeDeleted, unwantedIPConfigs...) } func (bc *backendPoolTypeNodeIPConfig) GetBackendPrivateIPs(ctx context.Context, clusterName string, service *v1.Service, lb *armnetwork.LoadBalancer) ([]string, []string) { + logger := log.FromContextOrBackground(ctx).WithName("bc.GetBackendPrivateIPs") serviceName := getServiceName(service) lbBackendPoolNames := getBackendPoolNames(clusterName) if lb.Properties == nil || lb.Properties.BackendAddressPools == nil { @@ -349,13 +354,13 @@ func (bc *backendPoolTypeNodeIPConfig) GetBackendPrivateIPs(ctx context.Context, for _, bp := range lb.Properties.BackendAddressPools { found, _ := isLBBackendPoolsExisting(lbBackendPoolNames, bp.Name) if found { - klog.V(10).Infof("bc.GetBackendPrivateIPs for service (%s): found wanted backendpool %s", serviceName, ptr.Deref(bp.Name, "")) + logger.V(10).Info("found wanted backendpool", "serviceName", serviceName, "backendPoolName", ptr.Deref(bp.Name, "")) if bp.Properties != nil && bp.Properties.BackendIPConfigurations != nil { for _, backendIPConfig := range bp.Properties.BackendIPConfigurations { ipConfigID := ptr.Deref(backendIPConfig.ID, "") nodeName, _, err := bc.VMSet.GetNodeNameByIPConfigurationID(ctx, ipConfigID) if err != nil { - klog.Errorf("bc.GetBackendPrivateIPs for service (%s): GetNodeNameByIPConfigurationID failed with error: %v", serviceName, err) + logger.Error(err, "bc.GetBackendPrivateIPs: GetNodeNameByIPConfigurationID failed", "service", serviceName) continue } privateIPsSet, ok := bc.nodePrivateIPs[strings.ToLower(nodeName)] @@ -365,7 +370,7 @@ func (bc *backendPoolTypeNodeIPConfig) GetBackendPrivateIPs(ctx context.Context, } privateIPs := privateIPsSet.UnsortedList() for _, ip := range privateIPs { - klog.V(2).Infof("bc.GetBackendPrivateIPs for service (%s): lb backendpool - found private IPs %s of node %s", serviceName, ip, nodeName) + logger.V(2).Info("lb backendpool - found private IPs of node", "serviceName", serviceName, "ip", ip, "nodeName", nodeName) if utilnet.IsIPv4String(ip) { backendPrivateIPv4s.Insert(ip) } else { @@ -375,7 +380,7 @@ func (bc *backendPoolTypeNodeIPConfig) GetBackendPrivateIPs(ctx context.Context, } } } else { - klog.V(10).Infof("bc.GetBackendPrivateIPs for service (%s): found unmanaged backendpool %s", serviceName, ptr.Deref(bp.Name, "")) + logger.V(10).Info("found unmanaged backendpool", "serviceName", serviceName, "backendPoolName", ptr.Deref(bp.Name, "")) } } return backendPrivateIPv4s.UnsortedList(), backendPrivateIPv6s.UnsortedList() @@ -403,6 +408,7 @@ func (az *Cloud) getVnetResourceID() string { } func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service *v1.Service, nodes []*v1.Node, _, _, clusterName, lbName string, backendPool *armnetwork.BackendAddressPool) error { + logger := log.FromContextOrBackground(ctx).WithName("bi.EnsureHostsInPool") if backendPool == nil { backendPool = &armnetwork.BackendAddressPool{} } @@ -420,7 +426,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service key := strings.ToLower(getServiceName(service)) si, found := bi.getLocalServiceInfo(key) if found && !strings.EqualFold(si.lbName, lbName) { - klog.V(4).InfoS("EnsureHostsInPool: the service is not on the load balancer", + logger.V(4).Info("the service is not on the load balancer", "service", key, "previous load balancer", lbName, "current load balancer", si.lbName) @@ -430,7 +436,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service } if isNICPool(backendPool) { - klog.V(4).InfoS("EnsureHostsInPool: skipping NIC-based backend pool", "backendPoolName", ptr.Deref(backendPool.Name, "")) + logger.V(4).Info("skipping NIC-based backend pool", "backendPoolName", ptr.Deref(backendPool.Name, "")) return nil } } @@ -447,7 +453,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service for _, loadBalancerBackendAddress := range backendPool.Properties.LoadBalancerBackendAddresses { if loadBalancerBackendAddress.Properties != nil && loadBalancerBackendAddress.Properties.IPAddress != nil { - klog.V(4).Infof("bi.EnsureHostsInPool: found existing IP %s in the backend pool %s", ptr.Deref(loadBalancerBackendAddress.Properties.IPAddress, ""), lbBackendPoolName) + logger.V(4).Info("found existing IP in the backend pool", "ip", ptr.Deref(loadBalancerBackendAddress.Properties.IPAddress, ""), "backendPoolName", lbBackendPoolName) existingIPs.Insert(ptr.Deref(loadBalancerBackendAddress.Properties.IPAddress, "")) } } @@ -456,7 +462,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service nodePrivateIPsSet := utilsets.NewString() for _, node := range nodes { if isControlPlaneNode(node) { - klog.V(4).Infof("bi.EnsureHostsInPool: skipping control plane node %s", node.Name) + logger.V(4).Info("skipping control plane node", "nodeName", node.Name) continue } @@ -467,14 +473,14 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service if bi.UseMultipleStandardLoadBalancers() { if activeNodes != nil && !activeNodes.Has(node.Name) { - klog.V(4).Infof("bi.EnsureHostsInPool: node %s should not be in load balancer %q", node.Name, lbName) + logger.V(4).Info("node should not be in load balancer", "nodeName", node.Name, "lbName", lbName) continue } } if !existingIPs.Has(privateIP) { name := node.Name - klog.V(6).Infof("bi.EnsureHostsInPool: adding %s with ip address %s", name, privateIP) + logger.V(6).Info("adding node with ip address", "nodeName", name, "ip", privateIP) nodeIPsToBeAdded = append(nodeIPsToBeAdded, privateIP) numOfAdd++ } @@ -485,7 +491,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service for _, loadBalancerBackendAddress := range backendPool.Properties.LoadBalancerBackendAddresses { ip := ptr.Deref(loadBalancerBackendAddress.Properties.IPAddress, "") if !nodePrivateIPsSet.Has(ip) { - klog.V(4).Infof("bi.EnsureHostsInPool: removing IP %s because it is deleted or should be excluded", ip) + logger.V(4).Info("removing IP because it is deleted or should be excluded", "ip", ip) nodeIPsToBeDeleted = append(nodeIPsToBeDeleted, ip) changed = true numOfDelete++ @@ -496,7 +502,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service continue } if !activeNodes.Has(nodeName) { - klog.V(4).Infof("bi.EnsureHostsInPool: removing IP %s because it should not be in this load balancer", ip) + logger.V(4).Info("removing IP because it should not be in this load balancer", "ip", ip) nodeIPsToBeDeleted = append(nodeIPsToBeDeleted, ip) changed = true numOfDelete++ @@ -506,7 +512,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service removeNodeIPAddressesFromBackendPool(backendPool, nodeIPsToBeDeleted, false, bi.UseMultipleStandardLoadBalancers(), true) } if changed { - klog.V(2).Infof("bi.EnsureHostsInPool: updating backend pool %s of load balancer %s to add %d nodes and remove %d nodes", lbBackendPoolName, lbName, numOfAdd, numOfDelete) + logger.V(2).Info("updating backend pool of load balancer to add and remove nodes", "backendPoolName", lbBackendPoolName, "lbName", lbName, "numOfAdd", numOfAdd, "numOfDelete", numOfDelete) if err := bi.CreateOrUpdateLBBackendPool(ctx, lbName, backendPool); err != nil { return fmt.Errorf("bi.EnsureHostsInPool: failed to update backend pool %s: %w", lbBackendPoolName, err) } @@ -516,6 +522,7 @@ func (bi *backendPoolTypeNodeIP) EnsureHostsInPool(ctx context.Context, service } func (bi *backendPoolTypeNodeIP) CleanupVMSetFromBackendPoolByCondition(ctx context.Context, slb *armnetwork.LoadBalancer, _ *v1.Service, nodes []*v1.Node, clusterName string, shouldRemoveVMSetFromSLB func(string) bool) (*armnetwork.LoadBalancer, error) { + logger := log.FromContextOrBackground(ctx).WithName("bi.CleanupVMSetFromBackendPoolByCondition") lbBackendPoolNames := getBackendPoolNames(clusterName) newBackendPools := make([]*armnetwork.BackendAddressPool, 0) if slb.Properties != nil && slb.Properties.BackendAddressPools != nil { @@ -526,7 +533,7 @@ func (bi *backendPoolTypeNodeIP) CleanupVMSetFromBackendPoolByCondition(ctx cont for j, bp := range newBackendPools { found, isIPv6 := isLBBackendPoolsExisting(lbBackendPoolNames, bp.Name) if found { - klog.V(2).Infof("bi.CleanupVMSetFromBackendPoolByCondition: checking the backend pool %s from standard load balancer %s", ptr.Deref(bp.Name, ""), ptr.Deref(slb.Name, "")) + logger.V(2).Info("checking the backend pool from standard load balancer", "backendPoolName", ptr.Deref(bp.Name, ""), "lbName", ptr.Deref(slb.Name, "")) vmIPsToBeDeleted := utilsets.NewString() for _, node := range nodes { vmSetName, err := bi.VMSet.GetNodeVMSetName(ctx, node) @@ -536,7 +543,7 @@ func (bi *backendPoolTypeNodeIP) CleanupVMSetFromBackendPoolByCondition(ctx cont if shouldRemoveVMSetFromSLB(vmSetName) { privateIP := getNodePrivateIPAddress(node, isIPv6) - klog.V(4).Infof("bi.CleanupVMSetFromBackendPoolByCondition: removing ip %s from the backend pool %s", privateIP, lbBackendPoolNames[isIPv6]) + logger.V(4).Info("removing ip from the backend pool", "ip", privateIP, "backendPoolName", lbBackendPoolNames[isIPv6]) vmIPsToBeDeleted.Insert(privateIP) } } @@ -553,12 +560,12 @@ func (bi *backendPoolTypeNodeIP) CleanupVMSetFromBackendPoolByCondition(ctx cont newBackendPools[j] = bp } else { - klog.V(10).Infof("bi.CleanupVMSetFromBackendPoolByCondition: found unmanaged backendpool %s from standard load balancer %q", ptr.Deref(bp.Name, ""), ptr.Deref(slb.Name, "")) + logger.V(10).Info("found unmanaged backendpool from standard load balancer", "backendPoolName", ptr.Deref(bp.Name, ""), "lbName", ptr.Deref(slb.Name, "")) } } for isIPv6 := range updatedPrivateIPs { - klog.V(2).Infof("bi.CleanupVMSetFromBackendPoolByCondition: updating lb %s since there are private IP updates", ptr.Deref(slb.Name, "")) + logger.V(2).Info("updating lb since there are private IP updates", "lbName", ptr.Deref(slb.Name, "")) slb.Properties.BackendAddressPools = newBackendPools for _, backendAddressPool := range slb.Properties.BackendAddressPools { @@ -575,6 +582,7 @@ func (bi *backendPoolTypeNodeIP) CleanupVMSetFromBackendPoolByCondition(ctx cont } func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clusterName string, service *v1.Service, lb *armnetwork.LoadBalancer) (bool, bool, *armnetwork.LoadBalancer, error) { + logger := log.FromContextOrBackground(ctx).WithName("bi.ReconcileBackendPools") var newBackendPools []*armnetwork.BackendAddressPool if lb.Properties.BackendAddressPools != nil { newBackendPools = lb.Properties.BackendAddressPools @@ -602,22 +610,22 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clus found, isIPv6 := isLBBackendPoolsExisting(lbBackendPoolNames, bp.Name) if found { bpIdxes = append(bpIdxes, i) - klog.V(10).Infof("bi.ReconcileBackendPools for service (%s): found wanted backendpool. Not adding anything", serviceName) + logger.V(10).Info("found wanted backendpool. Not adding anything", "serviceName", serviceName) foundBackendPools[isIPv6] = true lbBackendPoolIDsSlice = append(lbBackendPoolIDsSlice, lbBackendPoolIDs[isIPv6]) if nicsCount := countNICsOnBackendPool(bp); nicsCount > 0 { nicsCountMap[ptr.Deref(bp.Name, "")] = nicsCount - klog.V(4).Infof( - "bi.ReconcileBackendPools for service(%s): found NIC-based backendpool %s with %d NICs, will migrate to IP-based", - serviceName, - ptr.Deref(bp.Name, ""), - nicsCount, + logger.V(4).Info( + "found NIC-based backendpool with NICs, will migrate to IP-based", + "serviceName", serviceName, + "backendPoolName", ptr.Deref(bp.Name, ""), + "nicsCount", nicsCount, ) isMigration = true } } else { - klog.V(10).Infof("bi.ReconcileBackendPools for service (%s): found unmanaged backendpool %s", serviceName, *bp.Name) + logger.V(10).Info("found unmanaged backendpool", "serviceName", serviceName, "backendPoolName", *bp.Name) } } @@ -638,7 +646,7 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clus for _, id := range lbBackendPoolIDsSlice { name, err := getBackendPoolNameFromBackendPoolID(id) if err != nil { - klog.Errorf("bi.ReconcileBackendPools for service (%s): failed to get LB name from backend pool ID: %s", serviceName, err.Error()) + logger.Error(err, "bi.ReconcileBackendPools: failed to get LB name from backend pool ID", "service", serviceName) return false, false, nil, err } backendPoolNames = append(backendPoolNames, name) @@ -646,7 +654,7 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clus if err := bi.MigrateToIPBasedBackendPoolAndWaitForCompletion(ctx, lbName, backendPoolNames, nicsCountMap); err != nil { backendPoolNamesStr := strings.Join(backendPoolNames, ",") - klog.Errorf("Failed to migrate to IP based backend pool for lb %s, backend pool %s: %s", lbName, backendPoolNamesStr, err.Error()) + logger.Error(err, "Failed to migrate to IP based backend pool", "lbName", lbName, "backendPoolNames", backendPoolNamesStr) return false, false, nil, err } } @@ -660,10 +668,10 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clus // VMs during the migration. // 3. Decouple vmss from the lb if the backend pool is empty when using // ip-based LB. Ref: https://github.com/kubernetes-sigs/cloud-provider-azure/pull/2829. - klog.V(2).Infof("bi.ReconcileBackendPools for service (%s) and vmSet (%s): ensuring the LB is decoupled from the VMSet", serviceName, vmSetName) + logger.V(2).Info("ensuring the LB is decoupled from the VMSet", "serviceName", serviceName, "vmSetName", vmSetName) shouldRefreshLB, err = bi.VMSet.EnsureBackendPoolDeleted(ctx, service, lbBackendPoolIDsSlice, vmSetName, lb.Properties.BackendAddressPools, true) if err != nil { - klog.Errorf("bi.ReconcileBackendPools for service (%s): failed to EnsureBackendPoolDeleted: %s", serviceName, err.Error()) + logger.Error(err, "bi.ReconcileBackendPools: failed to EnsureBackendPoolDeleted", "service", serviceName) return false, false, nil, err } @@ -672,7 +680,7 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clus var nodeIPAddressesToBeDeleted []string for _, nodeName := range bi.excludeLoadBalancerNodes.UnsortedList() { for _, ip := range bi.nodePrivateIPs[strings.ToLower(nodeName)].UnsortedList() { - klog.V(2).Infof("bi.ReconcileBackendPools for service (%s): found unwanted node private IP %s, decouple it from the LB %s", serviceName, ip, lbName) + logger.V(2).Info("found unwanted node private IP, decouple it from the LB", "serviceName", serviceName, "ip", ip, "lbName", lbName) nodeIPAddressesToBeDeleted = append(nodeIPAddressesToBeDeleted, ip) } } @@ -718,7 +726,7 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clus shouldRefreshLB = shouldRefreshLB || isMigration if shouldRefreshLB { - klog.V(4).Infof("bi.ReconcileBackendPools for service(%s): refreshing load balancer %s", serviceName, lbName) + logger.V(4).Info("refreshing load balancer", "serviceName", serviceName, "lbName", lbName) lb, _, err = bi.getAzureLoadBalancer(ctx, lbName, cache.CacheReadTypeForceRefresh) if err != nil { return false, false, nil, fmt.Errorf("bi.ReconcileBackendPools for service (%s): failed to get loadbalancer %s: %w", serviceName, lbName, err) @@ -745,7 +753,8 @@ func (bi *backendPoolTypeNodeIP) ReconcileBackendPools(ctx context.Context, clus return isBackendPoolPreConfigured, backendPoolsUpdated, lb, nil } -func (bi *backendPoolTypeNodeIP) GetBackendPrivateIPs(_ context.Context, clusterName string, service *v1.Service, lb *armnetwork.LoadBalancer) ([]string, []string) { +func (bi *backendPoolTypeNodeIP) GetBackendPrivateIPs(ctx context.Context, clusterName string, service *v1.Service, lb *armnetwork.LoadBalancer) ([]string, []string) { + logger := log.FromContextOrBackground(ctx).WithName("GetBackendPrivateIPs") serviceName := getServiceName(service) lbBackendPoolNames := bi.getBackendPoolNamesForService(service, clusterName) if lb.Properties == nil || lb.Properties.BackendAddressPools == nil { @@ -756,24 +765,24 @@ func (bi *backendPoolTypeNodeIP) GetBackendPrivateIPs(_ context.Context, cluster for _, bp := range lb.Properties.BackendAddressPools { found, _ := isLBBackendPoolsExisting(lbBackendPoolNames, bp.Name) if found { - klog.V(10).Infof("bi.GetBackendPrivateIPs for service (%s): found wanted backendpool %s", serviceName, ptr.Deref(bp.Name, "")) + logger.V(10).Info("found wanted backendpool", "serviceName", serviceName, "backendPoolName", ptr.Deref(bp.Name, "")) if bp.Properties != nil && bp.Properties.LoadBalancerBackendAddresses != nil { for _, backendAddress := range bp.Properties.LoadBalancerBackendAddresses { ipAddress := backendAddress.Properties.IPAddress if ipAddress != nil { - klog.V(2).Infof("bi.GetBackendPrivateIPs for service (%s): lb backendpool - found private IP %q", serviceName, *ipAddress) + logger.V(2).Info("lb backendpool - found private IP", "serviceName", serviceName, "ip", *ipAddress) if utilnet.IsIPv4String(*ipAddress) { backendPrivateIPv4s.Insert(*ipAddress) } else if utilnet.IsIPv6String(*ipAddress) { backendPrivateIPv6s.Insert(*ipAddress) } } else { - klog.V(4).Infof("bi.GetBackendPrivateIPs for service (%s): lb backendpool - found null private IP", serviceName) + logger.V(4).Info("lb backendpool - found null private IP", "serviceName", serviceName) } } } } else { - klog.V(10).Infof("bi.GetBackendPrivateIPs for service (%s): found unmanaged backendpool %s", serviceName, ptr.Deref(bp.Name, "")) + logger.V(10).Info("found unmanaged backendpool", "serviceName", serviceName, "backendPoolName", ptr.Deref(bp.Name, "")) } } return backendPrivateIPv4s.UnsortedList(), backendPrivateIPv6s.UnsortedList() @@ -794,11 +803,12 @@ func (bi *backendPoolTypeNodeIP) getBackendPoolNodeNames(bp *armnetwork.BackendA } func newBackendPool(lb *armnetwork.LoadBalancer, isBackendPoolPreConfigured bool, preConfiguredBackendPoolLoadBalancerTypes, serviceName, lbBackendPoolName string) bool { + logger := log.Background().WithName("newBackendPool") if isBackendPoolPreConfigured { - klog.V(2).Infof("newBackendPool for service (%s)(true): lb backendpool - PreConfiguredBackendPoolLoadBalancerTypes %s has been set but can not find corresponding backend pool %q, ignoring it", - serviceName, - preConfiguredBackendPoolLoadBalancerTypes, - lbBackendPoolName) + logger.V(2).Info("lb backendpool - PreConfiguredBackendPoolLoadBalancerTypes has been set but can not find corresponding backend pool, ignoring it", + "serviceName", serviceName, + "preConfiguredBackendPoolLoadBalancerTypes", preConfiguredBackendPoolLoadBalancerTypes, + "backendPoolName", lbBackendPoolName) isBackendPoolPreConfigured = false } @@ -815,6 +825,7 @@ func newBackendPool(lb *armnetwork.LoadBalancer, isBackendPoolPreConfigured bool } func (az *Cloud) addNodeIPAddressesToBackendPool(backendPool *armnetwork.BackendAddressPool, nodeIPAddresses []string) bool { + logger := log.Background().WithName("bi.addNodeIPAddressesToBackendPool") vnetID := az.getVnetResourceID() if backendPool.Properties != nil { if backendPool.Properties.VirtualNetwork == nil || @@ -841,7 +852,7 @@ func (az *Cloud) addNodeIPAddressesToBackendPool(backendPool *armnetwork.Backend for _, ipAddress := range nodeIPAddresses { if !hasIPAddressInBackendPool(backendPool, ipAddress) { name := az.nodePrivateIPToNodeNameMap[ipAddress] - klog.V(4).Infof("bi.addNodeIPAddressesToBackendPool: adding %s to the backend pool %s", ipAddress, ptr.Deref(backendPool.Name, "")) + logger.V(4).Info("adding node to the backend pool", "ip", ipAddress, "backendPoolName", ptr.Deref(backendPool.Name, "")) addresses = append(addresses, &armnetwork.LoadBalancerBackendAddress{ Name: ptr.To(name), Properties: &armnetwork.LoadBalancerBackendAddressPropertiesFormat{ @@ -879,7 +890,7 @@ func removeNodeIPAddressesFromBackendPool( changed := false nodeIPsSet := utilsets.NewString(nodeIPAddresses...) - logger := klog.Background().WithName("removeNodeIPAddressFromBackendPool") + logger := log.Background().WithName("removeNodeIPAddressFromBackendPool") if backendPool.Properties == nil || backendPool.Properties.LoadBalancerBackendAddresses == nil { @@ -901,7 +912,7 @@ func removeNodeIPAddressesFromBackendPool( continue } if removeAll || nodeIPsSet.Has(ipAddress) { - klog.V(4).Infof("removeNodeIPAddressFromBackendPool: removing %s from the backend pool %s", ipAddress, ptr.Deref(backendPool.Name, "")) + logger.V(4).Info("removing IP from the backend pool", "ip", ipAddress, "backendPoolName", ptr.Deref(backendPool.Name, "")) addresses = append(addresses[:i], addresses[i+1:]...) changed = true } @@ -916,7 +927,7 @@ func removeNodeIPAddressesFromBackendPool( // Allow the pool to be empty when EnsureHostsInPool for multiple standard load balancers clusters, // or one node could occur in multiple backend pools. if len(addresses) == 0 && !UseMultipleStandardLoadBalancers { - klog.V(2).Info("removeNodeIPAddressFromBackendPool: the pool is empty or will be empty after removing the unwanted IP addresses, skipping the removal") + logger.V(2).Info("the pool is empty or will be empty after removing the unwanted IP addresses, skipping the removal") changed = false } else if changed { backendPool.Properties.LoadBalancerBackendAddresses = addresses diff --git a/pkg/provider/azure_loadbalancer_healthprobe.go b/pkg/provider/azure_loadbalancer_healthprobe.go index 26b0125721..10b87add2c 100644 --- a/pkg/provider/azure_loadbalancer_healthprobe.go +++ b/pkg/provider/azure_loadbalancer_healthprobe.go @@ -48,8 +48,9 @@ func (az *Cloud) buildClusterServiceSharedProbe() *armnetwork.Probe { // for following protocols: TCP HTTP HTTPS(SLB only) // return nil if no new probe is added func (az *Cloud) buildHealthProbeRulesForPort(serviceManifest *v1.Service, port v1.ServicePort, lbrule string, healthCheckNodePortProbe *armnetwork.Probe, useSharedProbe bool) (*armnetwork.Probe, error) { + logger := klog.Background().WithName("buildHealthProbeRulesForPort") if useSharedProbe { - klog.V(4).Infof("skip creating health probe for port %d because the shared probe is used", port.Port) + logger.V(4).Info("skip creating health probe for port because the shared probe is used", "port", port.Port) return nil, nil } @@ -299,6 +300,7 @@ func (az *Cloud) keepSharedProbe( expectedProbes []*armnetwork.Probe, wantLB bool, ) ([]*armnetwork.Probe, error) { + logger := klog.Background().WithName("keepSharedProbe") var shouldConsiderRemoveSharedProbe bool if !wantLB { shouldConsiderRemoveSharedProbe = true @@ -315,14 +317,14 @@ func (az *Cloud) keepSharedProbe( if len(probe.Properties.LoadBalancingRules) == 1 { ruleName, err := getLastSegment(*probe.Properties.LoadBalancingRules[0].ID, "/") if err != nil { - klog.Errorf("failed to parse load balancing rule name %s attached to health probe %s", - *probe.Properties.LoadBalancingRules[0].ID, *probe.ID) + logger.Error(err, "failed to parse load balancing rule name attached to health probe", + "ruleName", *probe.Properties.LoadBalancingRules[0].ID, "healthProbe", *probe.ID) } else { // If the service owns the rule and is now a local service, // it means the service was switched from Cluster to Local if az.serviceOwnsRule(service, ruleName) && isLocalService(service) { - klog.V(2).Infof("service %s has switched from Cluster to Local, removing shared probe", - getServiceName(service)) + logger.V(2).Info("service has switched from Cluster to Local, removing shared probe", + "serviceName", getServiceName(service)) // Remove the shared probe from the load balancer directly if lb.Properties != nil && lb.Properties.Probes != nil && i < len(lb.Properties.Probes) { lb.Properties.Probes = append(lb.Properties.Probes[:i], lb.Properties.Probes[i+1:]...) @@ -336,11 +338,12 @@ func (az *Cloud) keepSharedProbe( for _, rule := range probe.Properties.LoadBalancingRules { ruleName, err := getLastSegment(*rule.ID, "/") if err != nil { - klog.Errorf("failed to parse load balancing rule name %s attached to health probe %s", *rule.ID, *probe.ID) + logger.Error(err, "failed to parse load balancing rule name attached to health probe", "ruleName", *rule.ID, "healthProbe", *probe.ID) return []*armnetwork.Probe{}, err } if !az.serviceOwnsRule(service, ruleName) && shouldConsiderRemoveSharedProbe { - klog.V(4).Infof("there are load balancing rule %s of another service referencing the health probe %s, so the health probe should not be removed", *rule.ID, *probe.ID) + logger.V(4).Info("there are load balancing rule of another service referencing the health probe, so the health probe should not be removed", + "ruleID", *rule.ID, "probeID", *probe.ID) sharedProbe := az.buildClusterServiceSharedProbe() expectedProbes = append(expectedProbes, sharedProbe) return expectedProbes, nil diff --git a/pkg/provider/azure_loadbalancer_repo.go b/pkg/provider/azure_loadbalancer_repo.go index 36f367cd40..52e66f922d 100644 --- a/pkg/provider/azure_loadbalancer_repo.go +++ b/pkg/provider/azure_loadbalancer_repo.go @@ -35,12 +35,14 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" utilsets "sigs.k8s.io/cloud-provider-azure/pkg/util/sets" ) // DeleteLB invokes az.NetworkClientFactory.GetLoadBalancerClient().Delete with exponential backoff retry func (az *Cloud) DeleteLB(ctx context.Context, service *v1.Service, lbName string) error { + logger := log.FromContextOrBackground(ctx).WithName("DeleteLB") rgName := az.getLoadBalancerResourceGroup() rerr := az.NetworkClientFactory.GetLoadBalancerClient().Delete(ctx, rgName, lbName) if rerr == nil { @@ -49,13 +51,14 @@ func (az *Cloud) DeleteLB(ctx context.Context, service *v1.Service, lbName strin return nil } - klog.Errorf("LoadbalancerClient.Delete(%s) failed: %s", lbName, rerr.Error()) + logger.Error(rerr, "LoadbalancerClient.Delete failed", "lbName", lbName) az.Event(service, v1.EventTypeWarning, "DeleteLoadBalancer", rerr.Error()) return rerr } // ListLB invokes az.NetworkClientFactory.GetLoadBalancerClient().List with exponential backoff retry func (az *Cloud) ListLB(ctx context.Context, service *v1.Service) ([]*armnetwork.LoadBalancer, error) { + logger := log.FromContextOrBackground(ctx).WithName("ListLB") rgName := az.getLoadBalancerResourceGroup() allLBs, rerr := az.NetworkClientFactory.GetLoadBalancerClient().List(ctx, rgName) if rerr != nil { @@ -63,16 +66,17 @@ func (az *Cloud) ListLB(ctx context.Context, service *v1.Service) ([]*armnetwork return nil, nil } az.Event(service, v1.EventTypeWarning, "ListLoadBalancers", rerr.Error()) - klog.Errorf("LoadbalancerClient.List(%v) failure with err=%v", rgName, rerr) + logger.Error(rerr, "LoadbalancerClient.List failure", "resourceGroup", rgName) return nil, rerr } - klog.V(2).Infof("LoadbalancerClient.List(%v) success", rgName) + logger.V(2).Info("LoadbalancerClient.List success", "resourceGroup", rgName) return allLBs, nil } // ListManagedLBs invokes az.NetworkClientFactory.GetLoadBalancerClient().List and filter out // those that are not managed by cloud provider azure or not associated to a managed VMSet. func (az *Cloud) ListManagedLBs(ctx context.Context, service *v1.Service, nodes []*v1.Node, clusterName string) ([]*armnetwork.LoadBalancer, error) { + logger := log.FromContextOrBackground(ctx).WithName("ListManagedLBs") allLBs, err := az.ListLB(ctx, service) if err != nil { return nil, err @@ -88,7 +92,7 @@ func (az *Cloud) ListManagedLBs(ctx context.Context, service *v1.Service, nodes if strings.EqualFold(az.LoadBalancerSKU, consts.LoadBalancerSKUBasic) { // return early if wantLb=false if nodes == nil { - klog.V(4).Infof("ListManagedLBs: return all LBs in the resource group %s, including unmanaged LBs", az.getLoadBalancerResourceGroup()) + logger.V(4).Info("return all LBs in the resource group, including unmanaged LBs", "resourceGroup", az.getLoadBalancerResourceGroup()) return allLBs, nil } @@ -100,7 +104,7 @@ func (az *Cloud) ListManagedLBs(ctx context.Context, service *v1.Service, nodes if len(agentPoolVMSetNames) > 0 { for _, vmSetName := range agentPoolVMSetNames { - klog.V(6).Infof("ListManagedLBs: found agent pool vmSet name %s", *vmSetName) + logger.V(6).Info("found agent pool", "vmSet Name", *vmSetName) agentPoolVMSetNamesMap[strings.ToLower(*vmSetName)] = true } } @@ -119,7 +123,7 @@ func (az *Cloud) ListManagedLBs(ctx context.Context, service *v1.Service, nodes for _, lb := range allLBs { if managedLBNames.Has(trimSuffixIgnoreCase(ptr.Deref(lb.Name, ""), consts.InternalLoadBalancerNameSuffix)) { managedLBs = append(managedLBs, lb) - klog.V(4).Infof("ListManagedLBs: found managed LB %s", ptr.Deref(lb.Name, "")) + logger.V(4).Info("found managed LB", "loadBalancerName", ptr.Deref(lb.Name, "")) } } @@ -128,11 +132,12 @@ func (az *Cloud) ListManagedLBs(ctx context.Context, service *v1.Service, nodes // CreateOrUpdateLB invokes az.NetworkClientFactory.GetLoadBalancerClient().CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateLB(ctx context.Context, service *v1.Service, lb armnetwork.LoadBalancer) error { + logger := log.FromContextOrBackground(ctx).WithName("CreateOrUpdateLB") lb = cleanupSubnetInFrontendIPConfigurations(&lb) rgName := az.getLoadBalancerResourceGroup() _, err := az.NetworkClientFactory.GetLoadBalancerClient().CreateOrUpdate(ctx, rgName, ptr.Deref(lb.Name, ""), lb) - klog.V(10).Infof("LoadbalancerClient.CreateOrUpdate(%s): end", *lb.Name) + logger.V(10).Info("LoadbalancerClient.CreateOrUpdate: end", "loadBalancerName", *lb.Name) if err == nil { // Invalidate the cache right after updating _ = az.lbCache.Delete(*lb.Name) @@ -147,14 +152,14 @@ func (az *Cloud) CreateOrUpdateLB(ctx context.Context, service *v1.Service, lb a } // Invalidate the cache because ETAG precondition mismatch. if rerr.StatusCode == http.StatusPreconditionFailed { - klog.V(3).Infof("LoadBalancer cache for %s is cleanup because of http.StatusPreconditionFailed", ptr.Deref(lb.Name, "")) + logger.V(3).Info("LoadBalancer cache is cleanup because of http.StatusPreconditionFailed", "loadBalancerName", ptr.Deref(lb.Name, "")) _ = az.lbCache.Delete(*lb.Name) } retryErrorMessage := rerr.Error() // Invalidate the cache because another new operation has canceled the current request. if strings.Contains(strings.ToLower(retryErrorMessage), consts.OperationCanceledErrorMessage) { - klog.V(3).Infof("LoadBalancer cache for %s is cleanup because CreateOrUpdate is canceled by another operation", ptr.Deref(lb.Name, "")) + logger.V(3).Info("LoadBalancer cache is cleanup because CreateOrUpdate is canceled by another operation", "loadBalancerName", ptr.Deref(lb.Name, "")) _ = az.lbCache.Delete(*lb.Name) } @@ -162,20 +167,20 @@ func (az *Cloud) CreateOrUpdateLB(ctx context.Context, service *v1.Service, lb a if strings.Contains(strings.ToLower(retryErrorMessage), strings.ToLower(consts.ReferencedResourceNotProvisionedMessageCode)) { matches := pipErrorMessageRE.FindStringSubmatch(retryErrorMessage) if len(matches) != 3 { - klog.Errorf("Failed to parse the retry error message %s", retryErrorMessage) + logger.Error(nil, "Failed to parse the retry error message", "retryErrorMessage", retryErrorMessage) return rerr } pipRG, pipName := matches[1], matches[2] - klog.V(3).Infof("The public IP %s referenced by load balancer %s is not in Succeeded provisioning state, will try to update it", pipName, ptr.Deref(lb.Name, "")) + logger.V(3).Info("The public IP referenced by load balancer is not in Succeeded provisioning state, will try to update it", "pipName", pipName, "loadBalancerName", ptr.Deref(lb.Name, "")) pip, _, err := az.getPublicIPAddress(ctx, pipRG, pipName, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("Failed to get the public IP %s in resource group %s: %v", pipName, pipRG, err) + logger.Error(err, "Failed to get the public IP", "pip", pipName, "resourceGroup", pipRG) return rerr } // Perform a dummy update to fix the provisioning state err = az.CreateOrUpdatePIP(service, pipRG, pip) if err != nil { - klog.Errorf("Failed to update the public IP %s in resource group %s: %v", pipName, pipRG, err) + logger.Error(err, "Failed to update the public IP", "pip", pipName, "resourceGroup", pipRG) return rerr } // Invalidate the LB cache, return the error, and the controller manager @@ -187,7 +192,8 @@ func (az *Cloud) CreateOrUpdateLB(ctx context.Context, service *v1.Service, lb a } func (az *Cloud) CreateOrUpdateLBBackendPool(ctx context.Context, lbName string, backendPool *armnetwork.BackendAddressPool) error { - klog.V(4).Infof("CreateOrUpdateLBBackendPool: updating backend pool %s in LB %s", ptr.Deref(backendPool.Name, ""), lbName) + logger := log.FromContextOrBackground(ctx).WithName("CreateOrUpdateLBBackendPool") + logger.V(4).Info("updating backend pool in LB", "backendPoolName", ptr.Deref(backendPool.Name, ""), "loadBalancerName", lbName) _, err := az.NetworkClientFactory.GetBackendAddressPoolClient().CreateOrUpdate(ctx, az.getLoadBalancerResourceGroup(), lbName, ptr.Deref(backendPool.Name, ""), *backendPool) if err == nil { // Invalidate the cache right after updating @@ -201,14 +207,14 @@ func (az *Cloud) CreateOrUpdateLBBackendPool(ctx context.Context, lbName string, // Invalidate the cache because ETAG precondition mismatch. if rerr.StatusCode == http.StatusPreconditionFailed { - klog.V(3).Infof("LoadBalancer cache for %s is cleanup because of http.StatusPreconditionFailed", lbName) + logger.V(3).Info("LoadBalancer cache is cleanup because of http.StatusPreconditionFailed", "loadBalancerName", lbName) _ = az.lbCache.Delete(lbName) } retryErrorMessage := rerr.Error() // Invalidate the cache because another new operation has canceled the current request. if strings.Contains(strings.ToLower(retryErrorMessage), consts.OperationCanceledErrorMessage) { - klog.V(3).Infof("LoadBalancer cache for %s is cleanup because CreateOrUpdate is canceled by another operation", lbName) + logger.V(3).Info("LoadBalancer cache is cleanup because CreateOrUpdate is canceled by another operation", "loadBalancerName", lbName) _ = az.lbCache.Delete(lbName) } @@ -216,7 +222,8 @@ func (az *Cloud) CreateOrUpdateLBBackendPool(ctx context.Context, lbName string, } func (az *Cloud) DeleteLBBackendPool(ctx context.Context, lbName, backendPoolName string) error { - klog.V(4).Infof("DeleteLBBackendPool: deleting backend pool %s in LB %s", backendPoolName, lbName) + logger := log.FromContextOrBackground(ctx).WithName("DeleteLBBackendPool") + logger.V(4).Info("deleting backend pool in LB", "backendPoolName", backendPoolName, "loadBalancerName", lbName) err := az.NetworkClientFactory.GetBackendAddressPoolClient().Delete(ctx, az.getLoadBalancerResourceGroup(), lbName, backendPoolName) if err == nil { // Invalidate the cache right after updating @@ -230,14 +237,14 @@ func (az *Cloud) DeleteLBBackendPool(ctx context.Context, lbName, backendPoolNam } // Invalidate the cache because ETAG precondition mismatch. if rerr.StatusCode == http.StatusPreconditionFailed { - klog.V(3).Infof("LoadBalancer cache for %s is cleanup because of http.StatusPreconditionFailed", lbName) + logger.V(3).Info("LoadBalancer cache is cleanup because of http.StatusPreconditionFailed", "loadBalancerName", lbName) _ = az.lbCache.Delete(lbName) } retryErrorMessage := rerr.Error() // Invalidate the cache because another new operation has canceled the current request. if strings.Contains(strings.ToLower(retryErrorMessage), consts.OperationCanceledErrorMessage) { - klog.V(3).Infof("LoadBalancer cache for %s is cleanup because CreateOrUpdate is canceled by another operation", lbName) + logger.V(3).Info("LoadBalancer cache is cleanup because CreateOrUpdate is canceled by another operation", "loadBalancerName", lbName) _ = az.lbCache.Delete(lbName) } @@ -278,13 +285,14 @@ func (az *Cloud) MigrateToIPBasedBackendPoolAndWaitForCompletion( ctx context.Context, lbName string, backendPoolNames []string, nicsCountMap map[string]int, ) error { + logger := log.FromContextOrBackground(ctx).WithName("MigrateToIPBasedBackendPoolAndWaitForCompletion") if _, rerr := az.NetworkClientFactory.GetLoadBalancerClient().MigrateToIPBased(ctx, az.ResourceGroup, lbName, &armnetwork.LoadBalancersClientMigrateToIPBasedOptions{ Parameters: &armnetwork.MigrateLoadBalancerToIPBasedRequest{ Pools: to.SliceOfPtrs(backendPoolNames...), }, }); rerr != nil { backendPoolNamesStr := strings.Join(backendPoolNames, ",") - klog.Errorf("MigrateToIPBasedBackendPoolAndWaitForCompletion: Failed to migrate to IP based backend pool for lb %s, backend pool %s: %s", lbName, backendPoolNamesStr, rerr.Error()) + logger.Error(rerr, "Failed to migrate to IP based backend pool", "lb", lbName, "backendPool", backendPoolNamesStr) return rerr } @@ -301,12 +309,12 @@ func (az *Cloud) MigrateToIPBasedBackendPoolAndWaitForCompletion( bp, rerr := az.NetworkClientFactory.GetBackendAddressPoolClient().Get(ctx, az.ResourceGroup, lbName, bpName) if rerr != nil { - klog.Errorf("MigrateToIPBasedBackendPoolAndWaitForCompletion: Failed to get backend pool %s for lb %s: %s", bpName, lbName, rerr.Error()) + logger.Error(rerr, "Failed to get backend pool", "backendPool", bpName, "lb", lbName) return false, rerr } if countIPsOnBackendPool(bp) != nicsCount { - klog.V(4).Infof("MigrateToIPBasedBackendPoolAndWaitForCompletion: Expected IPs %d, current IPs %d, will retry in 5s", nicsCount, countIPsOnBackendPool(bp)) + logger.V(4).Info("Expected IPs vs current IPs, will retry in 5s", "expectedIPs", nicsCount, "currentIPs", countIPsOnBackendPool(bp)) return false, nil } succeeded[bpName] = true @@ -319,7 +327,7 @@ func (az *Cloud) MigrateToIPBasedBackendPoolAndWaitForCompletion( return nil } - klog.Errorf("MigrateToIPBasedBackendPoolAndWaitForCompletion: Failed to wait for migration to IP based backend pool for lb %s, backend pool %s: %s", lbName, strings.Join(backendPoolNames, ","), err.Error()) + logger.Error(err, "Failed to wait for migration to IP based backend pool", "lb", lbName, "backendPool", strings.Join(backendPoolNames, ",")) return err } @@ -328,6 +336,7 @@ func (az *Cloud) MigrateToIPBasedBackendPoolAndWaitForCompletion( func (az *Cloud) newLBCache() (azcache.Resource, error) { getter := func(ctx context.Context, key string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newLBCache") lb, err := az.NetworkClientFactory.GetLoadBalancerClient().Get(ctx, az.getLoadBalancerResourceGroup(), key, nil) exists, rerr := checkResourceExistsFromError(err) if rerr != nil { @@ -335,7 +344,7 @@ func (az *Cloud) newLBCache() (azcache.Resource, error) { } if !exists { - klog.V(2).Infof("Load balancer %q not found", key) + logger.V(2).Info("Load balancer not found", "loadBalancerName", key) return nil, nil } @@ -417,6 +426,7 @@ func isNICPool(bp *armnetwork.BackendAddressPool) bool { func (az *Cloud) cleanupBasicLoadBalancer( ctx context.Context, clusterName string, service *v1.Service, existingLBs []*armnetwork.LoadBalancer, ) ([]*armnetwork.LoadBalancer, error) { + logger := log.FromContextOrBackground(ctx).WithName("cleanupBasicLoadBalancer") if !az.UseStandardLoadBalancer() { return existingLBs, nil } @@ -425,9 +435,9 @@ func (az *Cloud) cleanupBasicLoadBalancer( for i := len(existingLBs) - 1; i >= 0; i-- { lb := existingLBs[i] if lb != nil && lb.SKU != nil && lb.SKU.Name != nil && *lb.SKU.Name == armnetwork.LoadBalancerSKUNameBasic { - klog.V(2).Infof("cleanupBasicLoadBalancer: found basic load balancer %q, removing it", *lb.Name) + logger.V(2).Info("found basic load balancer, removing it", "loadBalancerName", *lb.Name) if err := az.safeDeleteLoadBalancer(ctx, *lb, clusterName, service); err != nil { - klog.ErrorS(err, "cleanupBasicLoadBalancer: failed to delete outdated basic load balancer", "loadBalancerName", *lb.Name) + logger.Error(err, "cleanupBasicLoadBalancer: failed to delete outdated basic load balancer", "loadBalancerName", *lb.Name) return nil, err } existingLBs = append(existingLBs[:i], existingLBs[i+1:]...) @@ -442,7 +452,7 @@ func (az *Cloud) cleanupBasicLoadBalancer( var err error az.pipCache, err = az.newPIPCache() if err != nil { - klog.ErrorS(err, "cleanupBasicLoadBalancer: failed to refresh pip cache") + logger.Error(err, "cleanupBasicLoadBalancer: failed to refresh pip cache") return nil, err } } diff --git a/pkg/provider/azure_local_services.go b/pkg/provider/azure_local_services.go index 73f6339999..28badd2f47 100644 --- a/pkg/provider/azure_local_services.go +++ b/pkg/provider/azure_local_services.go @@ -35,6 +35,7 @@ import ( "k8s.io/utils/ptr" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/metrics" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" utilsets "sigs.k8s.io/cloud-provider-azure/pkg/util/sets" @@ -89,12 +90,13 @@ func newLoadBalancerBackendPoolUpdater(az *Cloud, interval time.Duration) *loadB // run starts the loadBalancerBackendPoolUpdater, and stops if the context exits. func (updater *loadBalancerBackendPoolUpdater) run(ctx context.Context) { - klog.V(2).Info("loadBalancerBackendPoolUpdater.run: started") + logger := log.FromContextOrBackground(ctx).WithName("loadBalancerBackendPoolUpdater.run") + logger.V(2).Info("started") err := wait.PollUntilContextCancel(ctx, updater.interval, false, func(ctx context.Context) (bool, error) { updater.process(ctx) return false, nil }) - klog.Infof("loadBalancerBackendPoolUpdater.run: stopped due to %s", err.Error()) + logger.Error(err, "stopped") } // getAddIPsToBackendPoolOperation creates a new loadBalancerBackendPoolUpdateOperation @@ -123,34 +125,36 @@ func getRemoveIPsFromBackendPoolOperation(serviceName, loadBalancerName, backend // addOperation adds an operation to the loadBalancerBackendPoolUpdater. func (updater *loadBalancerBackendPoolUpdater) addOperation(operation batchOperation) batchOperation { + logger := log.Background().WithName("loadBalancerBackendPoolUpdater.addOperation") updater.lock.Lock() defer updater.lock.Unlock() op := operation.(*loadBalancerBackendPoolUpdateOperation) - klog.V(4).InfoS("loadBalancerBackendPoolUpdater.addOperation", + logger.V(4).Info("Add operation to load balancer backend pool updater", "kind", op.kind, - "service name", op.serviceName, - "load balancer name", op.loadBalancerName, - "backend pool name", op.backendPoolName, - "node IPs", strings.Join(op.nodeIPs, ",")) + "serviceName", op.serviceName, + "loadBalancerName", op.loadBalancerName, + "backendPoolName", op.backendPoolName, + "nodeIPs", strings.Join(op.nodeIPs, ",")) updater.operations = append(updater.operations, operation) return operation } // removeOperation removes all operations targeting to the specified service. func (updater *loadBalancerBackendPoolUpdater) removeOperation(serviceName string) { + logger := log.Background().WithName("loadBalancerBackendPoolUpdater.removeOperation") updater.lock.Lock() defer updater.lock.Unlock() for i := len(updater.operations) - 1; i >= 0; i-- { op := updater.operations[i].(*loadBalancerBackendPoolUpdateOperation) if strings.EqualFold(op.serviceName, serviceName) { - klog.V(4).InfoS("loadBalancerBackendPoolUpdater.removeOperation", + logger.V(4).Info("Remove all operations targeting to the specific service", "kind", op.kind, - "service name", op.serviceName, - "load balancer name", op.loadBalancerName, - "backend pool name", op.backendPoolName, - "node IPs", strings.Join(op.nodeIPs, ",")) + "serviceName", op.serviceName, + "loadBalancerName", op.loadBalancerName, + "backendPoolName", op.backendPoolName, + "nodeIPs", strings.Join(op.nodeIPs, ",")) updater.operations = append(updater.operations[:i], updater.operations[i+1:]...) } } @@ -162,11 +166,12 @@ func (updater *loadBalancerBackendPoolUpdater) removeOperation(serviceName strin // if it is retriable, otherwise all operations in the batch targeting to // this backend pool will fail. func (updater *loadBalancerBackendPoolUpdater) process(ctx context.Context) { + logger := log.FromContextOrBackground(ctx).WithName("loadBalancerBackendPoolUpdater.process") updater.lock.Lock() defer updater.lock.Unlock() if len(updater.operations) == 0 { - klog.V(4).Infof("loadBalancerBackendPoolUpdater.process: no operations to process") + logger.V(4).Info("no operations to process") return } @@ -176,11 +181,11 @@ func (updater *loadBalancerBackendPoolUpdater) process(ctx context.Context) { lbOp := op.(*loadBalancerBackendPoolUpdateOperation) si, found := updater.az.getLocalServiceInfo(strings.ToLower(lbOp.serviceName)) if !found { - klog.V(4).Infof("loadBalancerBackendPoolUpdater.process: service %s is not a local service, skip the operation", lbOp.serviceName) + logger.V(4).Info("service is not a local service, skip the operation", "service", lbOp.serviceName) continue } if !strings.EqualFold(si.lbName, lbOp.loadBalancerName) { - klog.V(4).InfoS("loadBalancerBackendPoolUpdater.process: service is not associated with the load balancer, skip the operation", + logger.V(4).Info("service is not associated with the load balancer, skip the operation", "service", lbOp.serviceName, "previous load balancer", lbOp.loadBalancerName, "current load balancer", si.lbName) @@ -234,7 +239,7 @@ func (updater *loadBalancerBackendPoolUpdater) process(ctx context.Context) { // To keep the code clean, ignore the case when `changed` is true // but the backend pool object is not changed after multiple times of removal and re-adding. if changed { - klog.V(2).Infof("loadBalancerBackendPoolUpdater.process: updating backend pool %s/%s", lbName, poolName) + logger.V(2).Info("updating backend pool", "loadBalancer", lbName, "backendPool", poolName) _, err = updater.az.NetworkClientFactory.GetBackendAddressPoolClient().CreateOrUpdate(ctx, updater.az.ResourceGroup, lbName, poolName, *bp) if err != nil { updater.processError(err, operationName, ops...) @@ -253,8 +258,9 @@ func (updater *loadBalancerBackendPoolUpdater) processError( operationName string, operations ...batchOperation, ) { + logger := log.Background().WithName("loadBalancerBackendPoolUpdater.processError") if exists, err := errutils.CheckResourceExistsFromAzcoreError(rerr); !exists && err == nil { - klog.V(4).Infof("backend pool not found for operation %s, skip updating", operationName) + logger.V(4).Info("backend pool not found for operation, skip updating", "operation", operationName) return } @@ -298,6 +304,7 @@ func (az *Cloud) getLocalServiceInfo(serviceName string) (*serviceInfo, bool) { // setUpEndpointSlicesInformer creates an informer for EndpointSlices of local services. // It watches the update events and send backend pool update operations to the batch updater. func (az *Cloud) setUpEndpointSlicesInformer(informerFactory informers.SharedInformerFactory) { + logger := log.Background().WithName("setUpEndpointSlicesInformer") endpointSlicesInformer := informerFactory.Discovery().V1().EndpointSlices().Informer() _, _ = endpointSlicesInformer.AddEventHandler( cache.ResourceEventHandlerFuncs{ @@ -311,17 +318,17 @@ func (az *Cloud) setUpEndpointSlicesInformer(informerFactory informers.SharedInf svcName := getServiceNameOfEndpointSlice(newES) if svcName == "" { - klog.V(4).Infof("EndpointSlice %s/%s does not have service name label, skip updating load balancer backend pool", newES.Namespace, newES.Name) + logger.V(4).Info("EndpointSlice does not have service name label, skip updating load balancer backend pool", "namespace", newES.Namespace, "name", newES.Name) return } - klog.V(4).Infof("Detecting EndpointSlice %s/%s update", newES.Namespace, newES.Name) + logger.V(4).Info("Detecting EndpointSlice update", "namespace", newES.Namespace, "name", newES.Name) az.endpointSlicesCache.Store(strings.ToLower(fmt.Sprintf("%s/%s", newES.Namespace, newES.Name)), newES) key := strings.ToLower(fmt.Sprintf("%s/%s", newES.Namespace, svcName)) si, found := az.getLocalServiceInfo(key) if !found { - klog.V(4).Infof("EndpointSlice %s/%s belongs to service %s, but the service is not a local service, or has not finished the initial reconciliation loop. Skip updating load balancer backend pool", newES.Namespace, newES.Name, key) + logger.V(4).Info("EndpointSlice belongs to service, but the service is not a local service, or has not finished the initial reconciliation loop. Skip updating load balancer backend pool", "namespace", newES.Namespace, "name", newES.Name, "service", key) return } lbName, ipFamily := si.lbName, si.ipFamily @@ -375,11 +382,11 @@ func (az *Cloud) setUpEndpointSlicesInformer(informerFactory informers.SharedInf var ok bool es, ok = v.Obj.(*discovery_v1.EndpointSlice) if !ok { - klog.Errorf("Cannot convert to *discovery_v1.EndpointSlice: %T", v.Obj) + logger.Error(nil, "Cannot convert to *discovery_v1.EndpointSlice", "obj", v.Obj) return } default: - klog.Errorf("Cannot convert to *discovery_v1.EndpointSlice: %T", v) + logger.Error(nil, "Cannot convert to *discovery_v1.EndpointSlice", "obj.(type)", v) return } @@ -491,6 +498,7 @@ func newServiceInfo(ipFamily, lbName string) *serviceInfo { // getLocalServiceEndpointsNodeNames gets the node names that host all endpoints of the local service. func (az *Cloud) getLocalServiceEndpointsNodeNames(service *v1.Service) *utilsets.IgnoreCaseSet { + logger := log.Background().WithName("getLocalServiceEndpointsNodeNames") var eps []*discovery_v1.EndpointSlice az.endpointSlicesCache.Range(func(_, value interface{}) bool { endpointSlice := value.(*discovery_v1.EndpointSlice) @@ -508,7 +516,7 @@ func (az *Cloud) getLocalServiceEndpointsNodeNames(service *v1.Service) *utilset var nodeNames []string for _, ep := range eps { for _, endpoint := range ep.Endpoints { - klog.V(4).Infof("EndpointSlice %s/%s has endpoint %s on node %s", ep.Namespace, ep.Name, endpoint.Addresses, ptr.Deref(endpoint.NodeName, "")) + logger.V(4).Info("EndpointSlice has endpoint on node", "namespace", ep.Namespace, "name", ep.Name, "addresses", endpoint.Addresses, "nodeName", ptr.Deref(endpoint.NodeName, "")) nodeNames = append(nodeNames, ptr.Deref(endpoint.NodeName, "")) } } @@ -525,6 +533,7 @@ func (az *Cloud) cleanupLocalServiceBackendPool( lbs []*armnetwork.LoadBalancer, clusterName string, ) (newLBs []*armnetwork.LoadBalancer, err error) { + logger := log.FromContextOrBackground(ctx).WithName("cleanupLocalServiceBackendPool") var changed bool for _, lb := range lbs { lbName := ptr.Deref(lb.Name, "") @@ -543,7 +552,7 @@ func (az *Cloud) cleanupLocalServiceBackendPool( if changed { // Refresh the list of existing LBs after cleanup to update etags for the LBs. - klog.V(4).Info("Refreshing the list of existing LBs") + logger.V(4).Info("Refreshing the list of existing LBs") lbs, err = az.ListManagedLBs(ctx, svc, nodes, clusterName) if err != nil { return nil, fmt.Errorf("reconcileLoadBalancer: failed to list managed LB: %w", err) @@ -617,10 +626,11 @@ func (az *Cloud) reconcileIPsInLocalServiceBackendPoolsAsync( currentIPsInBackendPools map[string][]string, expectedIPs []string, ) { + logger := log.Background().WithName("reconcileIPsInLocalServiceBackendPoolsAsync") for bpName, currentIPs := range currentIPsInBackendPools { ipsToBeDeleted := compareNodeIPs(currentIPs, expectedIPs) if len(ipsToBeDeleted) == 0 && len(currentIPs) == len(expectedIPs) { - klog.V(4).Infof("No IP change detected for service %s, skip updating load balancer backend pool", serviceName) + logger.V(4).Info("No IP change detected for service, skip updating load balancer backend pool", "service", serviceName) return } if len(ipsToBeDeleted) > 0 { diff --git a/pkg/provider/azure_lock.go b/pkg/provider/azure_lock.go index d58a5103f7..649c2d36c3 100644 --- a/pkg/provider/azure_lock.go +++ b/pkg/provider/azure_lock.go @@ -26,10 +26,10 @@ import ( k8sapierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" "k8s.io/utils/ptr" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) type AzureResourceLocker struct { @@ -87,7 +87,7 @@ func createLeaseIfNotExists( leaseDurationSeconds int32, clientset kubernetes.Interface, ) error { - logger := klog.Background().WithName("createLeaseIfNotExists"). + logger := log.FromContextOrBackground(ctx).WithName("createLeaseIfNotExists"). WithValues("leaseNamespace", leaseNamespace, "leaseName", leaseName, "leaseDurationSeconds", leaseDurationSeconds).V(4) @@ -126,7 +126,7 @@ func (l *AzureResourceLocker) acquireLease( clientset kubernetes.Interface, holder, leaseNamespace, leaseName string, ) error { - logger := klog.Background().WithName("acquireLease"). + logger := log.FromContextOrBackground(ctx).WithName("acquireLease"). WithValues("holder", holder, "leaseNamespace", leaseNamespace, "leaseName", leaseName).V(4) lease, err := clientset.CoordinationV1().Leases(leaseNamespace).Get(ctx, leaseName, metav1.GetOptions{}) @@ -199,7 +199,7 @@ func releaseLease( clientset kubernetes.Interface, leaseNamespace, leaseName, holder string, ) error { - logger := klog.Background().WithName("releaseLease"). + logger := log.FromContextOrBackground(ctx).WithName("releaseLease"). WithValues("leaseNamespace", leaseNamespace, "leaseName", leaseName, "holder", holder).V(4) lease, err := clientset.CoordinationV1(). @@ -216,8 +216,8 @@ func releaseLease( prevHolder := ptr.Deref(lease.Spec.HolderIdentity, "") if !strings.EqualFold(prevHolder, holder) { logger.Info( - "%s is holding the lease instead of %s, no need to release it.", - prevHolder, holder, + "lease is already held by a different holder, no need to release it.", + "requestedHolder", holder, "leaseHolder", prevHolder, ) return nil } diff --git a/pkg/provider/azure_privatelinkservice.go b/pkg/provider/azure_privatelinkservice.go index 45522aa889..f639e011d9 100644 --- a/pkg/provider/azure_privatelinkservice.go +++ b/pkg/provider/azure_privatelinkservice.go @@ -29,11 +29,11 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6" v1 "k8s.io/api/core/v1" - "k8s.io/klog/v2" "k8s.io/utils/ptr" azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/metrics" fnutil "sigs.k8s.io/cloud-provider-azure/pkg/util/collectionutil" ) @@ -47,6 +47,7 @@ func (az *Cloud) reconcilePrivateLinkService( fipConfig *armnetwork.FrontendIPConfiguration, wantPLS bool, ) (bool /*deleted PLS*/, error) { + logger := log.FromContextOrBackground(ctx).WithName("reconcilePrivateLinkService") isinternal := requiresInternalLoadBalancer(service) _, _, fipIPVersion := az.serviceOwnsFrontendIP(ctx, fipConfig, service) serviceName := getServiceName(service) @@ -56,7 +57,7 @@ func (az *Cloud) reconcilePrivateLinkService( isIPv6 = *fipIPVersion == armnetwork.IPVersionIPv6 } else { if isIPv6, err = az.isFIPIPv6(service, fipConfig); err != nil { - klog.Errorf("reconcilePrivateLinkService for service(%s): failed to get FIP IP family: %v", serviceName, err) + logger.Error(err, "reconcilePrivateLinkService for service failed to get FIP IP family", "service", serviceName) return false, err } } @@ -64,14 +65,18 @@ func (az *Cloud) reconcilePrivateLinkService( isDualStack := isServiceDualStack(service) if isIPv6 { if isDualStack || !createPLS { - klog.V(2).Infof("IPv6 is not supported for private link service, skip reconcilePrivateLinkService for service(%s)", serviceName) + logger.V(2).Info("IPv6 is not supported for private link service, skip reconcilePrivateLinkService for service", "service", serviceName) return false, nil } return false, fmt.Errorf("IPv6 is not supported for private link service") } fipConfigID := fipConfig.ID - klog.V(2).Infof("reconcilePrivateLinkService for service(%s) - LB fipConfigID(%s) - wantPLS(%t) - createPLS(%t)", serviceName, ptr.Deref(fipConfig.Name, ""), wantPLS, createPLS) + logger.V(2).Info("Reconcile private link service for service", + "service", serviceName, + "LBFipConfigID", ptr.Deref(fipConfig.Name, ""), + "wantPLS", wantPLS, + "createPLS", createPLS) request := "ensure_privatelinkservice" if !wantPLS { @@ -93,13 +98,13 @@ func (az *Cloud) reconcilePrivateLinkService( // Secondly, check if there is a private link service already created existingPLS, err := az.plsRepo.Get(ctx, az.getPLSResourceGroup(service), *fipConfigID, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("reconcilePrivateLinkService for service(%s): getPrivateLinkService(%s) failed: %v", serviceName, ptr.Deref(fipConfigID, ""), err) + logger.Error(err, "reconcilePrivateLinkService for service failed: getPrivateLinkService failed", "service", serviceName, "fipConfigID", ptr.Deref(fipConfigID, "")) return false, err } exists := !strings.EqualFold(ptr.Deref(existingPLS.ID, ""), consts.PrivateLinkServiceNotExistID) if exists { - klog.V(4).Infof("reconcilePrivateLinkService for service(%s): found existing private link service attached(%s)", serviceName, ptr.Deref(existingPLS.Name, "")) + logger.V(4).Info("found existing private link service attached", "service", serviceName, "privateLinkService", ptr.Deref(existingPLS.Name, "")) if !isManagedPrivateLinkSerivce(existingPLS, clusterName) { return false, fmt.Errorf( "reconcilePrivateLinkService for service(%s) failed: LB frontend(%s) already has unmanaged private link service(%s)", @@ -120,11 +125,10 @@ func (az *Cloud) reconcilePrivateLinkService( ownerService, ) } - klog.V(2).Infof( - "reconcilePrivateLinkService for service(%s): automatically share private link service(%s) owned by service(%s)", - serviceName, - ptr.Deref(existingPLS.Name, ""), - ownerService, + logger.V(2).Info("automatically share private link service owned by another service", + "service", serviceName, + "privateLinkService", ptr.Deref(existingPLS.Name, ""), + "ownerService", ownerService, ) return false, nil } @@ -151,23 +155,23 @@ func (az *Cloud) reconcilePrivateLinkService( } if dirtyPLS { - klog.V(2).Infof("reconcilePrivateLinkService for service(%s): pls(%s) - updating", serviceName, plsName) + logger.V(2).Info("updating", "service", serviceName, "pls", plsName) err := az.disablePLSNetworkPolicy(ctx, service) if err != nil { - klog.Errorf("reconcilePrivateLinkService for service(%s) disable PLS network policy failed for pls(%s): %v", serviceName, plsName, err.Error()) + logger.Error(err, "reconcilePrivateLinkService for service failed to disable PLS network policy", "service", serviceName, "pls", plsName) return false, err } existingPLS.Etag = ptr.To("") _, err = az.plsRepo.CreateOrUpdate(ctx, az.getPLSResourceGroup(service), *existingPLS) if err != nil { - klog.Errorf("reconcilePrivateLinkService for service(%s) abort backoff: pls(%s) - updating: %s", serviceName, plsName, err.Error()) + logger.Error(err, "reconcilePrivateLinkService for service abort backoff: pls updating", "service", serviceName, "pls", plsName) return false, err } } } else if !wantPLS { existingPLS, err := az.plsRepo.Get(ctx, az.getPLSResourceGroup(service), *fipConfigID, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("reconcilePrivateLinkService for service(%s): getPrivateLinkService(%s) failed: %v", serviceName, ptr.Deref(fipConfigID, ""), err) + logger.Error(err, "reconcilePrivateLinkService for service failed: getPrivateLinkService failed", "service", serviceName, "LBFipConfigID", ptr.Deref(fipConfigID, "")) return false, err } @@ -175,17 +179,17 @@ func (az *Cloud) reconcilePrivateLinkService( if exists { deleteErr := az.safeDeletePLS(ctx, existingPLS, service) if deleteErr != nil { - klog.Errorf("reconcilePrivateLinkService for service(%s): deletePLS for frontEnd(%s) failed: %v", serviceName, ptr.Deref(fipConfigID, ""), err) + logger.Error(deleteErr, "reconcilePrivateLinkService for service failed: deletePLS for frontEnd failed", "service", serviceName, "LBFipConfigID", ptr.Deref(fipConfigID, "")) return false, deleteErr } isOperationSucceeded = true - klog.V(2).Infof("reconcilePrivateLinkService for service(%s) finished", serviceName) + logger.V(2).Info("finished", "service", serviceName) return true, nil // return true for successfully deleted PLS } } isOperationSucceeded = true - klog.V(2).Infof("reconcilePrivateLinkService for service(%s) finished", serviceName) + logger.V(2).Info("finished", "service", serviceName) return false, nil } @@ -240,13 +244,14 @@ func (az *Cloud) disablePLSNetworkPolicy(ctx context.Context, service *v1.Servic } func (az *Cloud) safeDeletePLS(ctx context.Context, pls *armnetwork.PrivateLinkService, service *v1.Service) error { + logger := log.FromContextOrBackground(ctx).WithName("safeDeletePLS") if pls == nil { return nil } peConns := pls.Properties.PrivateEndpointConnections for _, peConn := range peConns { - klog.V(2).Infof("deletePLS: deleting PEConnection %s", ptr.Deref(peConn.Name, "")) + logger.V(2).Info("deleting PEConnection", "PEConnection", ptr.Deref(peConn.Name, "")) err := az.plsRepo.DeletePEConnection(ctx, az.getPLSResourceGroup(service), ptr.Deref(pls.Name, ""), ptr.Deref(peConn.Name, "")) if err != nil { return err @@ -260,7 +265,7 @@ func (az *Cloud) safeDeletePLS(ctx context.Context, pls *armnetwork.PrivateLinkS if rerr != nil { return rerr } - klog.V(2).Infof("safeDeletePLS(%s) finished", ptr.Deref(pls.Name, "")) + logger.V(2).Info("finished", "privateLinkService", ptr.Deref(pls.Name, "")) return nil } @@ -367,6 +372,7 @@ func (az *Cloud) reconcilePLSIpConfigs( existingPLS *armnetwork.PrivateLinkService, service *v1.Service, ) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("reconcilePLSIpConfigs") changed := false serviceName := getServiceName(service) @@ -418,7 +424,7 @@ func (az *Cloud) reconcilePLSIpConfigs( changed = true } if *ipConfig.Properties.PrivateIPAllocationMethod == armnetwork.IPAllocationMethodStatic { - klog.V(10).Infof("Found static IP: %s", ptr.Deref(ipConfig.Properties.PrivateIPAddress, "")) + logger.V(10).Info("Found static IP", "ip", ptr.Deref(ipConfig.Properties.PrivateIPAddress, "")) if _, found := staticIps[ptr.Deref(ipConfig.Properties.PrivateIPAddress, "")]; !found { changed = true } diff --git a/pkg/provider/azure_publicip_repo.go b/pkg/provider/azure_publicip_repo.go index c5500005cf..b86e6faf61 100644 --- a/pkg/provider/azure_publicip_repo.go +++ b/pkg/provider/azure_publicip_repo.go @@ -35,6 +35,7 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/util/deepcopy" ) @@ -43,8 +44,10 @@ func (az *Cloud) CreateOrUpdatePIP(service *v1.Service, pipResourceGroup string, ctx, cancel := getContextWithCancel() defer cancel() + logger := log.FromContextOrBackground(ctx).WithName("CreateOrUpdatePIP") + _, rerr := az.NetworkClientFactory.GetPublicIPAddressClient().CreateOrUpdate(ctx, pipResourceGroup, ptr.Deref(pip.Name, ""), *pip) - klog.V(10).Infof("NetworkClientFactory.GetPublicIPAddressClient().CreateOrUpdate(%s, %s): end", pipResourceGroup, ptr.Deref(pip.Name, "")) + logger.V(10).Info("NetworkClientFactory.GetPublicIPAddressClient().CreateOrUpdate end", "pipResourceGroup", pipResourceGroup, "pipName", ptr.Deref(pip.Name, "")) if rerr == nil { // Invalidate the cache right after updating _ = az.pipCache.Delete(pipResourceGroup) @@ -59,7 +62,7 @@ func (az *Cloud) CreateOrUpdatePIP(service *v1.Service, pipResourceGroup string, var respError *azcore.ResponseError if errors.As(rerr, &respError) && respError != nil { if respError.StatusCode == http.StatusPreconditionFailed { - klog.V(3).Infof("PublicIP cache for (%s, %s) is cleanup because of http.StatusPreconditionFailed", pipResourceGroup, ptr.Deref(pip.Name, "")) + logger.V(3).Info("PublicIP cache is cleanup because of http.StatusPreconditionFailed", "pipResourceGroup", pipResourceGroup, "pipName", ptr.Deref(pip.Name, "")) _ = az.pipCache.Delete(pipResourceGroup) } } @@ -67,7 +70,7 @@ func (az *Cloud) CreateOrUpdatePIP(service *v1.Service, pipResourceGroup string, retryErrorMessage := rerr.Error() // Invalidate the cache because another new operation has canceled the current request. if strings.Contains(strings.ToLower(retryErrorMessage), consts.OperationCanceledErrorMessage) { - klog.V(3).Infof("PublicIP cache for (%s, %s) is cleanup because CreateOrUpdate is canceled by another operation", pipResourceGroup, ptr.Deref(pip.Name, "")) + logger.V(3).Info("PublicIP cache is cleanup because CreateOrUpdate is canceled by another operation", "pipResourceGroup", pipResourceGroup, "pipName", ptr.Deref(pip.Name, "")) _ = az.pipCache.Delete(pipResourceGroup) } @@ -78,10 +81,11 @@ func (az *Cloud) CreateOrUpdatePIP(service *v1.Service, pipResourceGroup string, func (az *Cloud) DeletePublicIP(service *v1.Service, pipResourceGroup string, pipName string) error { ctx, cancel := getContextWithCancel() defer cancel() + logger := log.FromContextOrBackground(ctx).WithName("DeletePublicIP") rerr := az.NetworkClientFactory.GetPublicIPAddressClient().Delete(ctx, pipResourceGroup, pipName) if rerr != nil { - klog.Errorf("NetworkClientFactory.GetPublicIPAddressClient().Delete(%s) failed: %s", pipName, rerr.Error()) + logger.Error(rerr, "NetworkClientFactory.GetPublicIPAddressClient().Delete failed", "pipName", pipName) az.Event(service, v1.EventTypeWarning, "DeletePublicIPAddress", rerr.Error()) if strings.Contains(rerr.Error(), consts.CannotDeletePublicIPErrorMessageCode) { diff --git a/pkg/provider/azure_routes.go b/pkg/provider/azure_routes.go index 210bd373c1..c242dda856 100644 --- a/pkg/provider/azure_routes.go +++ b/pkg/provider/azure_routes.go @@ -27,12 +27,12 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" cloudprovider "k8s.io/cloud-provider" - "k8s.io/klog/v2" utilnet "k8s.io/utils/net" "k8s.io/utils/ptr" azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/metrics" ) @@ -88,22 +88,24 @@ func newDelayedRouteUpdater(az *Cloud, interval time.Duration) batchProcessor { // run starts the updater reconciling loop. func (d *delayedRouteUpdater) run(ctx context.Context) { - klog.Info("delayedRouteUpdater: started") + logger := log.FromContextOrBackground(ctx).WithName("delayedRouteUpdater") + logger.Info("delayedRouteUpdater: started") err := wait.PollUntilContextCancel(ctx, d.interval, true, func(ctx context.Context) (bool, error) { d.updateRoutes(ctx) return false, nil }) - klog.Infof("delayedRouteUpdater: stopped due to %s", err.Error()) + logger.Error(err, "delayedRouteUpdater: stopped") } // updateRoutes invokes route table client to update all routes. func (d *delayedRouteUpdater) updateRoutes(ctx context.Context) { + logger := log.FromContextOrBackground(ctx).WithName("updateRoutes") d.lock.Lock() defer d.lock.Unlock() // No need to do any updating. if len(d.routesToUpdate) == 0 { - klog.V(4).Info("updateRoutes: nothing to update, returning") + logger.V(4).Info("nothing to update, returning") return } @@ -123,7 +125,7 @@ func (d *delayedRouteUpdater) updateRoutes(ctx context.Context) { ) routeTable, err = d.az.routeTableRepo.Get(ctx, d.az.RouteTableName, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("getRouteTable() failed with error: %v", err) + logger.Error(err, "getRouteTable() failed") return } @@ -131,13 +133,13 @@ func (d *delayedRouteUpdater) updateRoutes(ctx context.Context) { if routeTable == nil { err = d.az.createRouteTable(ctx) if err != nil { - klog.Errorf("createRouteTable() failed with error: %v", err) + logger.Error(err, "createRouteTable() failed") return } routeTable, err = d.az.routeTableRepo.Get(ctx, d.az.RouteTableName, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("getRouteTable() failed with error: %v", err) + logger.Error(err, "getRouteTable() failed") return } } @@ -189,12 +191,12 @@ func (d *delayedRouteUpdater) updateRoutes(ctx context.Context) { if rt.operation == routeOperationDelete { routes = append(routes[:i], routes[i+1:]...) dirty = true - klog.V(2).Infof("updateRoutes: found outdated route %s targeting node %s, removing it", ptr.Deref(rt.route.Name, ""), rt.nodeName) + logger.V(2).Info("found outdated route targeting node, removing it", "route", ptr.Deref(rt.route.Name, ""), "node", rt.nodeName) } } } if rt.operation == routeOperationDelete && !dirty { - klog.Warningf("updateRoutes: route to be deleted %s does not match any of the existing route", ptr.Deref(rt.route.Name, "")) + logger.Info("route to be deleted does not match any of the existing route", "route", ptr.Deref(rt.route.Name, "")) } // Add missing routes if the operation is add. @@ -209,12 +211,12 @@ func (d *delayedRouteUpdater) updateRoutes(ctx context.Context) { if dirty { if !onlyUpdateTags { - klog.V(2).Infof("updateRoutes: updating routes") + logger.V(2).Info("updating routes") routeTable.Properties.Routes = routes } _, err := d.az.routeTableRepo.CreateOrUpdate(ctx, *routeTable) if err != nil { - klog.Errorf("CreateOrUpdateRouteTable() failed with error: %v", err) + logger.Error(err, "CreateOrUpdateRouteTable() failed") return } @@ -226,20 +228,21 @@ func (d *delayedRouteUpdater) updateRoutes(ctx context.Context) { // cleanupOutdatedRoutes deletes all non-dualstack routes when dualstack is enabled, // and deletes all dualstack routes when dualstack is not enabled. func (d *delayedRouteUpdater) cleanupOutdatedRoutes(existingRoutes []*armnetwork.Route) (routes []*armnetwork.Route, changed bool) { + logger := log.Background().WithName("cleanupOutdatedRoutes") for i := len(existingRoutes) - 1; i >= 0; i-- { existingRouteName := ptr.Deref(existingRoutes[i].Name, "") split := strings.Split(existingRouteName, consts.RouteNameSeparator) - klog.V(4).Infof("cleanupOutdatedRoutes: checking route %s", existingRouteName) + logger.V(4).Info("checking route", "route", existingRouteName) // filter out unmanaged routes deleteRoute := false if d.az.nodeNames.Has(split[0]) { if d.az.ipv6DualStackEnabled && len(split) == 1 { - klog.V(2).Infof("cleanupOutdatedRoutes: deleting outdated non-dualstack route %s", existingRouteName) + logger.V(2).Info("deleting outdated non-dualstack route", "route", existingRouteName) deleteRoute = true } else if !d.az.ipv6DualStackEnabled && len(split) == 2 { - klog.V(2).Infof("cleanupOutdatedRoutes: deleting outdated dualstack route %s", existingRouteName) + logger.V(2).Info("deleting outdated dualstack route", "route", existingRouteName) deleteRoute = true } @@ -293,7 +296,8 @@ func (d *delayedRouteUpdater) removeOperation(_ string) {} // ListRoutes lists all managed routes that belong to the specified clusterName // implements cloudprovider.Routes.ListRoutes func (az *Cloud) ListRoutes(ctx context.Context, clusterName string) ([]*cloudprovider.Route, error) { - klog.V(10).Infof("ListRoutes: START clusterName=%q", clusterName) + logger := log.FromContextOrBackground(ctx).WithName("ListRoutes") + logger.V(10).Info("START", "clusterName", clusterName) routeTable, err := az.routeTableRepo.Get(ctx, az.RouteTableName, azcache.CacheReadTypeDefault) routes, err := processRoutes(az.ipv6DualStackEnabled, routeTable, err) if err != nil { @@ -320,13 +324,13 @@ func (az *Cloud) ListRoutes(ctx context.Context, clusterName string) ([]*cloudpr // ensure the route table is tagged as configured tags, changed := az.ensureRouteTableTagged(routeTable) if changed { - klog.V(2).Infof("ListRoutes: updating tags on route table %s", ptr.Deref(routeTable.Name, "")) + logger.V(2).Info("updating tags on route table", "routeTableName", ptr.Deref(routeTable.Name, "")) op := az.routeUpdater.addOperation(getUpdateRouteTableTagsOperation(tags)) // Wait for operation complete. err = op.wait().err if err != nil { - klog.Errorf("ListRoutes: failed to update route table tags with error: %v", err) + logger.Error(err, "failed to update route table tags") return nil, err } } @@ -336,6 +340,7 @@ func (az *Cloud) ListRoutes(ctx context.Context, clusterName string) ([]*cloudpr // Injectable for testing func processRoutes(ipv6DualStackEnabled bool, routeTable *armnetwork.RouteTable, err error) ([]*cloudprovider.Route, error) { + logger := log.Background().WithName("processRoutes") if err != nil { return nil, err } @@ -349,7 +354,7 @@ func processRoutes(ipv6DualStackEnabled bool, routeTable *armnetwork.RouteTable, for i, route := range routeTable.Properties.Routes { instance := MapRouteNameToNodeName(ipv6DualStackEnabled, *route.Name) cidr := *route.Properties.AddressPrefix - klog.V(10).Infof("ListRoutes: * instance=%q, cidr=%q", instance, cidr) + logger.V(10).Info("ListRoutes: *", "instance", instance, "cidr", cidr) kubeRoutes[i] = &cloudprovider.Route{ Name: *route.Name, @@ -359,18 +364,19 @@ func processRoutes(ipv6DualStackEnabled bool, routeTable *armnetwork.RouteTable, } } - klog.V(10).Info("ListRoutes: FINISH") + logger.V(10).Info("ListRoutes: FINISH") return kubeRoutes, nil } func (az *Cloud) createRouteTable(ctx context.Context) error { + logger := log.FromContextOrBackground(ctx).WithName("createRouteTable") routeTable := armnetwork.RouteTable{ Name: ptr.To(az.RouteTableName), Location: ptr.To(az.Location), Properties: &armnetwork.RouteTablePropertiesFormat{}, } - klog.V(3).Infof("createRouteTableIfNotExists: creating routetable. routeTableName=%q", az.RouteTableName) + logger.V(3).Info("creating routetable if not exists", "routeTableName", az.RouteTableName) _, err := az.routeTableRepo.CreateOrUpdate(ctx, routeTable) return err } @@ -380,6 +386,7 @@ func (az *Cloud) createRouteTable(ctx context.Context) error { // to create a more user-meaningful name. // implements cloudprovider.Routes.CreateRoute func (az *Cloud) CreateRoute(ctx context.Context, clusterName string, _ string, kubeRoute *cloudprovider.Route) error { + logger := log.FromContextOrBackground(ctx).WithName("CreateRoute") mc := metrics.NewMetricContext("routes", "create_route", az.ResourceGroup, az.getNetworkResourceSubscriptionID(), string(kubeRoute.TargetNode)) isOperationSucceeded := false defer func() { @@ -394,7 +401,7 @@ func (az *Cloud) CreateRoute(ctx context.Context, clusterName string, _ string, return err } if unmanaged { - klog.V(2).Infof("CreateRoute: omitting unmanaged node %q", kubeRoute.TargetNode) + logger.V(2).Info("omitting unmanaged node", "node", kubeRoute.TargetNode) az.routeCIDRsLock.Lock() defer az.routeCIDRsLock.Unlock() az.routeCIDRs[nodeName] = kubeRoute.DestinationCIDR @@ -413,16 +420,16 @@ func (az *Cloud) CreateRoute(ctx context.Context, clusterName string, _ string, } else { // for dual stack and single stack IPv6 we need to select // a private ip that matches family of the cidr - klog.V(4).Infof("CreateRoute: create route instance=%q cidr=%q is in dual stack mode", kubeRoute.TargetNode, kubeRoute.DestinationCIDR) + logger.V(4).Info("create route instance in dual stack mode", "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR) nodePrivateIPs, err := az.getPrivateIPsForMachine(ctx, kubeRoute.TargetNode) if nil != err { - klog.V(3).Infof("CreateRoute: create route: failed(GetPrivateIPsByNodeName) instance=%q cidr=%q with error=%v", kubeRoute.TargetNode, kubeRoute.DestinationCIDR, err) + logger.V(3).Error(err, "create route: failed(GetPrivateIPsByNodeName)", "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR) return err } targetIP, err = findFirstIPByFamily(nodePrivateIPs, CIDRv6) if nil != err { - klog.V(3).Infof("CreateRoute: create route: failed(findFirstIpByFamily) instance=%q cidr=%q with error=%v", kubeRoute.TargetNode, kubeRoute.DestinationCIDR, err) + logger.V(3).Error(err, "create route: failed(findFirstIpByFamily)", "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR) return err } } @@ -436,17 +443,17 @@ func (az *Cloud) CreateRoute(ctx context.Context, clusterName string, _ string, }, } - klog.V(2).Infof("CreateRoute: creating route for clusterName=%q instance=%q cidr=%q", clusterName, kubeRoute.TargetNode, kubeRoute.DestinationCIDR) + logger.V(2).Info("creating route", "clusterName", clusterName, "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR) op := az.routeUpdater.addOperation(getAddRouteOperation(route, string(kubeRoute.TargetNode))) // Wait for operation complete. err = op.wait().err if err != nil { - klog.Errorf("CreateRoute failed for node %q with error: %v", kubeRoute.TargetNode, err) + logger.Error(err, "CreateRoute failed for node", "node", kubeRoute.TargetNode) return err } - klog.V(2).Infof("CreateRoute: route created. clusterName=%q instance=%q cidr=%q", clusterName, kubeRoute.TargetNode, kubeRoute.DestinationCIDR) + logger.V(2).Info("route created", "clusterName", clusterName, "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR) isOperationSucceeded = true return nil @@ -455,7 +462,8 @@ func (az *Cloud) CreateRoute(ctx context.Context, clusterName string, _ string, // DeleteRoute deletes the specified managed route // Route should be as returned by ListRoutes // implements cloudprovider.Routes.DeleteRoute -func (az *Cloud) DeleteRoute(_ context.Context, clusterName string, kubeRoute *cloudprovider.Route) error { +func (az *Cloud) DeleteRoute(ctx context.Context, clusterName string, kubeRoute *cloudprovider.Route) error { + logger := log.FromContextOrBackground(ctx).WithName("DeleteRoute") mc := metrics.NewMetricContext("routes", "delete_route", az.ResourceGroup, az.getNetworkResourceSubscriptionID(), string(kubeRoute.TargetNode)) isOperationSucceeded := false defer func() { @@ -469,7 +477,7 @@ func (az *Cloud) DeleteRoute(_ context.Context, clusterName string, kubeRoute *c return err } if unmanaged { - klog.V(2).Infof("DeleteRoute: omitting unmanaged node %q", kubeRoute.TargetNode) + logger.V(2).Info("omitting unmanaged node", "node", kubeRoute.TargetNode) az.routeCIDRsLock.Lock() defer az.routeCIDRsLock.Unlock() delete(az.routeCIDRs, nodeName) @@ -477,7 +485,7 @@ func (az *Cloud) DeleteRoute(_ context.Context, clusterName string, kubeRoute *c } routeName := mapNodeNameToRouteName(az.ipv6DualStackEnabled, kubeRoute.TargetNode, kubeRoute.DestinationCIDR) - klog.V(2).Infof("DeleteRoute: deleting route. clusterName=%q instance=%q cidr=%q routeName=%q", clusterName, kubeRoute.TargetNode, kubeRoute.DestinationCIDR, routeName) + logger.V(2).Info("deleting route", "clusterName", clusterName, "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR, "routeName", routeName) route := &armnetwork.Route{ Name: ptr.To(routeName), Properties: &armnetwork.RoutePropertiesFormat{}, @@ -487,14 +495,14 @@ func (az *Cloud) DeleteRoute(_ context.Context, clusterName string, kubeRoute *c // Wait for operation complete. err = op.wait().err if err != nil { - klog.Errorf("DeleteRoute failed for node %q with error: %v", kubeRoute.TargetNode, err) + logger.Error(err, "DeleteRoute failed for node", "node", kubeRoute.TargetNode) return err } // Remove outdated ipv4 routes as well if az.ipv6DualStackEnabled { routeNameWithoutIPV6Suffix := strings.Split(routeName, consts.RouteNameSeparator)[0] - klog.V(2).Infof("DeleteRoute: deleting route. clusterName=%q instance=%q cidr=%q routeName=%q", clusterName, kubeRoute.TargetNode, kubeRoute.DestinationCIDR, routeNameWithoutIPV6Suffix) + logger.V(2).Info("deleting route", "clusterName", clusterName, "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR, "routeName", routeNameWithoutIPV6Suffix) route := &armnetwork.Route{ Name: ptr.To(routeNameWithoutIPV6Suffix), Properties: &armnetwork.RoutePropertiesFormat{}, @@ -504,12 +512,12 @@ func (az *Cloud) DeleteRoute(_ context.Context, clusterName string, kubeRoute *c // Wait for operation complete. err = op.wait().err if err != nil { - klog.Errorf("DeleteRoute failed for node %q with error: %v", kubeRoute.TargetNode, err) + logger.Error(err, "DeleteRoute failed for node", "node", kubeRoute.TargetNode) return err } } - klog.V(2).Infof("DeleteRoute: route deleted. clusterName=%q instance=%q cidr=%q", clusterName, kubeRoute.TargetNode, kubeRoute.DestinationCIDR) + logger.V(2).Info("route deleted", "clusterName", clusterName, "instance", kubeRoute.TargetNode, "cidr", kubeRoute.DestinationCIDR) isOperationSucceeded = true return nil diff --git a/pkg/provider/azure_standard.go b/pkg/provider/azure_standard.go index 40f32222db..c320b8ae8e 100644 --- a/pkg/provider/azure_standard.go +++ b/pkg/provider/azure_standard.go @@ -42,6 +42,7 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/metrics" vmutil "sigs.k8s.io/cloud-provider-azure/pkg/util/vm" ) @@ -331,6 +332,7 @@ func (az *Cloud) getRulePrefix(service *v1.Service) string { } func (az *Cloud) getPublicIPName(clusterName string, service *v1.Service, isIPv6 bool) (string, error) { + logger := log.Background().WithName("getPublicIPName") isDualStack := isServiceDualStack(service) pipName := fmt.Sprintf("%s-%s", clusterName, az.GetLoadBalancerName(context.TODO(), clusterName, service)) if id := getServicePIPPrefixID(service, isIPv6); id != "" { @@ -344,12 +346,13 @@ func (az *Cloud) getPublicIPName(clusterName string, service *v1.Service, isIPv6 maxLength := consts.PIPPrefixNameMaxLength - consts.IPFamilySuffixLength if len(pipName) > maxLength { pipNameSegment = pipNameSegment[:maxLength] - klog.V(6).Infof("original PIP name is lengthy %q, truncate it to %q", pipName, pipNameSegment) + logger.V(6).Info("original PIP name is lengthy, truncate it", "originalName", pipName, "truncatedName", pipNameSegment) } return getResourceByIPFamily(pipNameSegment, isDualStack, isIPv6), nil } func publicIPOwnsFrontendIP(service *v1.Service, fip *armnetwork.FrontendIPConfiguration, pip *armnetwork.PublicIPAddress) bool { + logger := log.Background().WithName("publicIPOwnsFrontendIP") if pip != nil && pip.ID != nil && pip.Properties != nil && @@ -358,7 +361,7 @@ func publicIPOwnsFrontendIP(service *v1.Service, fip *armnetwork.FrontendIPConfi fip.Properties != nil && fip.Properties.PublicIPAddress != nil { if strings.EqualFold(ptr.Deref(pip.ID, ""), ptr.Deref(fip.Properties.PublicIPAddress.ID, "")) { - klog.V(6).Infof("publicIPOwnsFrontendIP:found secondary service %s of the frontend IP config %s", service.Name, *fip.Name) + logger.V(6).Info("found secondary service of the frontend IP config", "serviceName", service.Name, "fipName", *fip.Name) return true } } @@ -409,6 +412,7 @@ type AvailabilitySetEntry struct { func (as *availabilitySet) newVMASCache() (azcache.Resource, error) { getter := func(ctx context.Context, _ string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newVMASCache") localCache := &sync.Map{} allResourceGroups, err := as.GetResourceGroups() @@ -419,7 +423,7 @@ func (as *availabilitySet) newVMASCache() (azcache.Resource, error) { for _, resourceGroup := range allResourceGroups.UnsortedList() { allAvailabilitySets, rerr := as.ComputeClientFactory.GetAvailabilitySetClient().List(ctx, resourceGroup) if rerr != nil { - klog.Errorf("AvailabilitySetsClient.List failed: %v", rerr) + logger.Error(rerr, "AvailabilitySetsClient.List failed") return nil, rerr } @@ -448,10 +452,11 @@ func (as *availabilitySet) newVMASCache() (azcache.Resource, error) { // RefreshCaches invalidates and renew all related caches. func (as *availabilitySet) RefreshCaches() error { + logger := log.Background().WithName("as.RefreshCaches") var err error as.vmasCache, err = as.newVMASCache() if err != nil { - klog.Errorf("as.RefreshCaches: failed to create or refresh VMAS cache: %s", err) + logger.Error(err, "failed to create or refresh VMAS cache") return err } return nil @@ -474,6 +479,7 @@ func newAvailabilitySet(az *Cloud) (VMSet, error) { // It must return ("", cloudprovider.InstanceNotFound) if the instance does // not exist or is no longer running. func (as *availabilitySet) GetInstanceIDByNodeName(ctx context.Context, name string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetInstanceIDByNodeName") var machine *armcompute.VirtualMachine var err error @@ -484,10 +490,10 @@ func (as *availabilitySet) GetInstanceIDByNodeName(ctx context.Context, name str } if err != nil { if as.CloudProviderBackoff { - klog.V(2).Infof("GetInstanceIDByNodeName(%s) backing off", name) + logger.V(2).Info("backing off", "node", name) machine, err = as.GetVirtualMachineWithRetry(ctx, types.NodeName(name), azcache.CacheReadTypeUnsafe) if err != nil { - klog.V(2).Infof("GetInstanceIDByNodeName(%s) abort backoff", name) + logger.V(2).Info("abort backoff", "node", name) return "", err } } else { @@ -498,7 +504,7 @@ func (as *availabilitySet) GetInstanceIDByNodeName(ctx context.Context, name str resourceID := *machine.ID convertedResourceID, err := ConvertResourceGroupNameToLower(resourceID) if err != nil { - klog.Errorf("ConvertResourceGroupNameToLower failed with error: %v", err) + logger.Error(err, "ConvertResourceGroupNameToLower failed") return "", err } return convertedResourceID, nil @@ -506,6 +512,7 @@ func (as *availabilitySet) GetInstanceIDByNodeName(ctx context.Context, name str // GetPowerStatusByNodeName returns the power state of the specified node. func (as *availabilitySet) GetPowerStatusByNodeName(ctx context.Context, name string) (powerState string, err error) { + logger := log.FromContextOrBackground(ctx).WithName("GetPowerStatusByNodeName") vm, err := as.getVirtualMachine(ctx, types.NodeName(name), azcache.CacheReadTypeDefault) if err != nil { return powerState, err @@ -516,7 +523,7 @@ func (as *availabilitySet) GetPowerStatusByNodeName(ctx context.Context, name st } // vm.Properties.InstanceView or vm.Properties.InstanceView.Statuses are nil when the VM is under deleting. - klog.V(3).Infof("InstanceView for node %q is nil, assuming it's deleting", name) + logger.V(3).Info("InstanceView for node is nil, assuming it's deleting", "node", name) return consts.VMPowerStateUnknown, nil } @@ -547,9 +554,10 @@ func (as *availabilitySet) GetNodeNameByProviderID(_ context.Context, providerID // GetInstanceTypeByNodeName gets the instance type by node name. func (as *availabilitySet) GetInstanceTypeByNodeName(ctx context.Context, name string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetInstanceTypeByNodeName") machine, err := as.getVirtualMachine(ctx, types.NodeName(name), azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("as.GetInstanceTypeByNodeName(%s) failed: as.getVirtualMachine(%s) err=%v", name, name, err) + logger.Error(err, "failed: as.getVirtualMachine failed", "node", name) return "", err } @@ -602,6 +610,7 @@ func (as *availabilitySet) GetPrimaryVMSetName() string { // GetIPByNodeName gets machine private IP and public IP by node name. func (as *availabilitySet) GetIPByNodeName(ctx context.Context, name string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetIPByNodeName") nic, err := as.GetPrimaryInterface(ctx, name) if err != nil { return "", "", err @@ -609,7 +618,7 @@ func (as *availabilitySet) GetIPByNodeName(ctx context.Context, name string) (st ipConfig, err := getPrimaryIPConfig(nic) if err != nil { - klog.Errorf("as.GetIPByNodeName(%s) failed: getPrimaryIPConfig(%v), err=%v", name, nic, err) + logger.Error(err, "getPrimaryIPConfig failed", "node", name, "nic", nic) return "", "", err } @@ -659,6 +668,7 @@ func (as *availabilitySet) GetPrivateIPsByNodeName(ctx context.Context, name str // getAgentPoolAvailabilitySets lists the virtual machines for the resource group and then builds // a list of availability sets that match the nodes available to k8s. func (as *availabilitySet) getAgentPoolAvailabilitySets(vms []*armcompute.VirtualMachine, nodes []*v1.Node) (agentPoolAvailabilitySets []*string, err error) { + logger := log.Background().WithName("as.getAgentPoolAvailabilitySets") vmNameToAvailabilitySetID := make(map[string]string, len(vms)) for vmx := range vms { vm := vms[vmx] @@ -679,7 +689,7 @@ func (as *availabilitySet) getAgentPoolAvailabilitySets(vms []*armcompute.Virtua } asName, err := getLastSegment(asID, "/") if err != nil { - klog.Errorf("as.getNodeAvailabilitySet - Node (%s)- getLastSegment(%s), err=%v", nodeName, asID, err) + logger.Error(err, "Node getLastSegment failed", "node", nodeName, "asID", asID) return nil, err } // AvailabilitySet ID is currently upper cased in a non-deterministic way @@ -698,6 +708,7 @@ func (as *availabilitySet) getAgentPoolAvailabilitySets(vms []*armcompute.Virtua // for loadbalancer exists then returns the eligible VMSet. The mode selection // annotation would be ignored when using one SLB per cluster. func (as *availabilitySet) GetVMSetNames(ctx context.Context, service *v1.Service, nodes []*v1.Node) (availabilitySetNames []*string, err error) { + logger := log.FromContextOrBackground(ctx).WithName("as.GetVMSetNames") hasMode, isAuto, serviceAvailabilitySetName := as.getServiceLoadBalancerMode(service) if !hasMode || as.UseStandardLoadBalancer() { // no mode specified in service annotation or use single SLB mode @@ -708,17 +719,18 @@ func (as *availabilitySet) GetVMSetNames(ctx context.Context, service *v1.Servic vms, err := as.ListVirtualMachines(ctx, as.ResourceGroup) if err != nil { - klog.Errorf("as.getNodeAvailabilitySet - ListVirtualMachines failed, err=%v", err) + logger.Error(err, "as.getNodeAvailabilitySet - ListVirtualMachines failed") return nil, err } availabilitySetNames, err = as.getAgentPoolAvailabilitySets(vms, nodes) if err != nil { - klog.Errorf("as.GetVMSetNames - getAgentPoolAvailabilitySets failed err=(%v)", err) + logger.Error(err, "as.GetVMSetNames - getAgentPoolAvailabilitySets failed") return nil, err } if len(availabilitySetNames) == 0 { - klog.Errorf("as.GetVMSetNames - No availability sets found for nodes in the cluster, node count(%d)", len(nodes)) - return nil, fmt.Errorf("no availability sets found for nodes, node count(%d)", len(nodes)) + err = fmt.Errorf("no availability sets found for nodes, node count(%d)", len(nodes)) + logger.Error(err, "as.GetVMSetNames - No availability sets found for nodes in the cluster.", "nodeCount", len(nodes)) + return nil, err } if !isAuto { found := false @@ -729,8 +741,9 @@ func (as *availabilitySet) GetVMSetNames(ctx context.Context, service *v1.Servic } } if !found { - klog.Errorf("as.GetVMSetNames - Availability set (%s) in service annotation not found", serviceAvailabilitySetName) - return nil, fmt.Errorf("availability set (%s) - not found", serviceAvailabilitySetName) + err = fmt.Errorf("availability set (%s) - not found", serviceAvailabilitySetName) + logger.Error(err, "as.GetVMSetNames - Availability set in service annotation not found", "availabilitySetName", serviceAvailabilitySetName) + return nil, err } return []*string{to.Ptr(serviceAvailabilitySetName)}, nil } @@ -739,6 +752,7 @@ func (as *availabilitySet) GetVMSetNames(ctx context.Context, service *v1.Servic } func (as *availabilitySet) GetNodeVMSetName(ctx context.Context, node *v1.Node) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("as.GetNodeVMSetName") var hostName string for _, nodeAddress := range node.Status.Addresses { if strings.EqualFold(string(nodeAddress.Type), string(v1.NodeHostName)) { @@ -757,7 +771,7 @@ func (as *availabilitySet) GetNodeVMSetName(ctx context.Context, node *v1.Node) vms, err := as.ListVirtualMachines(ctx, as.ResourceGroup) if err != nil { - klog.Errorf("as.GetNodeVMSetName - ListVirtualMachines failed, err=%v", err) + logger.Error(err, "as.GetNodeVMSetName - ListVirtualMachines failed") return "", err } @@ -765,11 +779,11 @@ func (as *availabilitySet) GetNodeVMSetName(ctx context.Context, node *v1.Node) for _, vm := range vms { if strings.EqualFold(ptr.Deref(vm.Name, ""), hostName) { if vm.Properties.AvailabilitySet != nil && ptr.Deref(vm.Properties.AvailabilitySet.ID, "") != "" { - klog.V(4).Infof("as.GetNodeVMSetName: found vm %s", hostName) + logger.V(4).Info("found vm", "vm", hostName) asName, err = getLastSegment(ptr.Deref(vm.Properties.AvailabilitySet.ID, ""), "/") if err != nil { - klog.Errorf("as.GetNodeVMSetName: failed to get last segment of ID %s: %s", ptr.Deref(vm.Properties.AvailabilitySet.ID, ""), err) + logger.Error(err, "as.GetNodeVMSetName: failed to get last segment of ID", "ID", ptr.Deref(vm.Properties.AvailabilitySet.ID, "")) return "", err } } @@ -778,7 +792,7 @@ func (as *availabilitySet) GetNodeVMSetName(ctx context.Context, node *v1.Node) } } - klog.V(4).Infof("as.GetNodeVMSetName: found availability set name %s from node name %s", asName, node.Name) + logger.V(4).Info("found availability set name from node name", "set name", asName, "node name", node.Name) return asName, nil } @@ -800,11 +814,12 @@ func extractResourceGroupByNicID(nicID string) (string, error) { // getPrimaryInterfaceWithVMSet gets machine primary network interface by node name and vmSet. func (as *availabilitySet) getPrimaryInterfaceWithVMSet(ctx context.Context, nodeName, vmSetName string) (*armnetwork.Interface, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getPrimaryInterfaceWithVMSet") var machine *armcompute.VirtualMachine machine, err := as.GetVirtualMachineWithRetry(ctx, types.NodeName(nodeName), azcache.CacheReadTypeDefault) if err != nil { - klog.V(2).Infof("GetPrimaryInterface(%s, %s) abort backoff", nodeName, vmSetName) + logger.V(2).Info("abort backoff", "nodeName", nodeName, "vmSetName", vmSetName) return nil, "", err } @@ -837,8 +852,7 @@ func (as *availabilitySet) getPrimaryInterfaceWithVMSet(ctx context.Context, nod if vmSetName != "" && needCheck { expectedAvailabilitySetID := as.getAvailabilitySetID(nodeResourceGroup, vmSetName) if machine.Properties.AvailabilitySet == nil || !strings.EqualFold(*machine.Properties.AvailabilitySet.ID, expectedAvailabilitySetID) { - klog.V(3).Infof( - "GetPrimaryInterface: nic (%s) is not in the availabilitySet(%s)", nicName, vmSetName) + logger.V(3).Info("nic is not in the availabilitySet", "nic", nicName, "availabilitySet", vmSetName) return nil, "", errNotInVMSet } } @@ -865,16 +879,17 @@ func (as *availabilitySet) getPrimaryInterfaceWithVMSet(ctx context.Context, nod // EnsureHostInPool ensures the given VM's Primary NIC's Primary IP Configuration is // participating in the specified LoadBalancer Backend Pool. func (as *availabilitySet) EnsureHostInPool(ctx context.Context, service *v1.Service, nodeName types.NodeName, backendPoolID string, vmSetName string) (string, string, string, *armcompute.VirtualMachineScaleSetVM, error) { + logger := log.FromContextOrBackground(ctx).WithName("EnsureHostInPool") vmName := mapNodeNameToVMName(nodeName) serviceName := getServiceName(service) nic, _, err := as.getPrimaryInterfaceWithVMSet(ctx, vmName, vmSetName) if err != nil { if errors.Is(err, errNotInVMSet) { - klog.V(3).Infof("EnsureHostInPool skips node %s because it is not in the vmSet %s", nodeName, vmSetName) + logger.V(3).Info("skips node because it is not in the vmSet", "node", nodeName, "vmSet", vmSetName) return "", "", "", nil, nil } - klog.Errorf("error: az.EnsureHostInPool(%s), az.VMSet.GetPrimaryInterface.Get(%s, %s), err=%v", nodeName, vmName, vmSetName, err) + logger.Error(err, "az.VMSet.GetPrimaryInterface.Get() failed", "nodeName", nodeName, "vmName", vmName, "vmSetName", vmSetName) return "", "", "", nil, err } @@ -925,7 +940,7 @@ func (as *availabilitySet) EnsureHostInPool(ctx context.Context, service *v1.Ser return "", "", "", nil, err } if !isSameLB { - klog.V(4).Infof("Node %q has already been added to LB %q, omit adding it to a new one", nodeName, oldLBName) + logger.V(4).Info("Node has already been added to LB, omit adding it to a new one", "node", nodeName, "oldLBName", oldLBName) return "", "", "", nil, nil } } @@ -938,7 +953,7 @@ func (as *availabilitySet) EnsureHostInPool(ctx context.Context, service *v1.Ser primaryIPConfig.Properties.LoadBalancerBackendAddressPools = newBackendPools nicName := *nic.Name - klog.V(3).Infof("nicupdate(%s): nic(%s) - updating", serviceName, nicName) + logger.V(3).Info("updating", "nicupdate", serviceName, "nic", nicName) err := as.CreateOrUpdateInterface(ctx, service, nic) if err != nil { return "", "", "", nil, err @@ -950,6 +965,7 @@ func (as *availabilitySet) EnsureHostInPool(ctx context.Context, service *v1.Ser // EnsureHostsInPool ensures the given Node's primary IP configurations are // participating in the specified LoadBalancer Backend Pool. func (as *availabilitySet) EnsureHostsInPool(ctx context.Context, service *v1.Service, nodes []*v1.Node, backendPoolID string, vmSetName string) error { + logger := log.FromContextOrBackground(ctx).WithName("EnsureHostsInPool") mc := metrics.NewMetricContext("services", "vmas_ensure_hosts_in_pool", as.ResourceGroup, as.SubscriptionID, getServiceName(service)) isOperationSucceeded := false defer func() { @@ -960,17 +976,17 @@ func (as *availabilitySet) EnsureHostsInPool(ctx context.Context, service *v1.Se for _, node := range nodes { localNodeName := node.Name if as.UseStandardLoadBalancer() && as.ExcludeMasterNodesFromStandardLB() && isControlPlaneNode(node) { - klog.V(4).Infof("Excluding master node %q from load balancer backendpool %q", localNodeName, backendPoolID) + logger.V(4).Info("Excluding master node from load balancer backendpool", "node", localNodeName, "backendpool", backendPoolID) continue } shouldExcludeLoadBalancer, err := as.ShouldNodeExcludedFromLoadBalancer(localNodeName) if err != nil { - klog.Errorf("ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", localNodeName, err) + logger.Error(err, "ShouldNodeExcludedFromLoadBalancer failed", "node", localNodeName) return err } if shouldExcludeLoadBalancer { - klog.V(4).Infof("Excluding unmanaged/external-resource-group node %q", localNodeName) + logger.V(4).Info("Excluding unmanaged/external-resource-group node", "node", localNodeName) continue } @@ -996,6 +1012,7 @@ func (as *availabilitySet) EnsureHostsInPool(ctx context.Context, service *v1.Se // EnsureBackendPoolDeleted ensures the loadBalancer backendAddressPools deleted from the specified nodes. // backendPoolIDs are the IDs of the backendpools to be deleted. func (as *availabilitySet) EnsureBackendPoolDeleted(ctx context.Context, service *v1.Service, backendPoolIDs []string, vmSetName string, backendAddressPools []*armnetwork.BackendAddressPool, _ bool) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("az.EnsureBackendPoolDeleted") // Returns nil if backend address pools already deleted. if backendAddressPools == nil { return false, nil @@ -1036,7 +1053,7 @@ func (as *availabilitySet) EnsureBackendPoolDeleted(ctx context.Context, service } nodeName, _, err := as.GetNodeNameByIPConfigurationID(ctx, ipConfigurationID) if err != nil && !errors.Is(err, cloudprovider.InstanceNotFound) { - klog.Errorf("Failed to GetNodeNameByIPConfigurationID(%s): %v", ipConfigurationID, err) + logger.Error(err, "Failed to GetNodeNameByIPConfigurationID", "ipConfigurationID", ipConfigurationID) allErrs = append(allErrs, err) continue } @@ -1048,11 +1065,11 @@ func (as *availabilitySet) EnsureBackendPoolDeleted(ctx context.Context, service nic, vmasID, err := as.getPrimaryInterfaceWithVMSet(ctx, vmName, vmSetName) if err != nil { if errors.Is(err, errNotInVMSet) { - klog.V(3).Infof("EnsureBackendPoolDeleted skips node %s because it is not in the vmSet %s", nodeName, vmSetName) + logger.V(3).Info("skips node because it is not in the vmSet", "node", nodeName, "vmSet", vmSetName) return false, nil } - klog.Errorf("error: az.EnsureBackendPoolDeleted(%s), az.VMSet.GetPrimaryInterface.Get(%s, %s), err=%v", nodeName, vmName, vmSetName, err) + logger.Error(err, "az.VMSet.GetPrimaryInterface.Get() failed", "nodeName", nodeName, "vmName", vmName, "vmSetName", vmSetName) return false, err } vmasName, err := getAvailabilitySetNameByID(vmasID) @@ -1062,7 +1079,7 @@ func (as *availabilitySet) EnsureBackendPoolDeleted(ctx context.Context, service // Only remove nodes belonging to specified vmSet to basic LB backends. // If vmasID is empty, then it is standalone VM. if vmasID != "" && !strings.EqualFold(vmasName, vmSetName) { - klog.V(2).Infof("EnsureBackendPoolDeleted: skipping the node %s belonging to another vm set %s", nodeName, vmasName) + logger.V(2).Info("skipping the node belonging to another vm set", "node", nodeName, "vmSet", vmasName) continue } @@ -1104,10 +1121,10 @@ func (as *availabilitySet) EnsureBackendPoolDeleted(ctx context.Context, service } nic.Properties.IPConfigurations = newIPConfigs nicUpdaters = append(nicUpdaters, func() error { - klog.V(2).Infof("EnsureBackendPoolDeleted begins to CreateOrUpdate for NIC(%s, %s) with backendPoolIDs %q", as.ResourceGroup, ptr.Deref(nic.Name, ""), backendPoolIDs) + logger.V(2).Info("begins to CreateOrUpdate for NIC with backendPoolIDs", "resourceGroup", as.ResourceGroup, "nicName", ptr.Deref(nic.Name, ""), "backendPoolIDs", backendPoolIDs) _, rerr := as.ComputeClientFactory.GetInterfaceClient().CreateOrUpdate(ctx, as.ResourceGroup, ptr.Deref(nic.Name, ""), *nic) if rerr != nil { - klog.Errorf("EnsureBackendPoolDeleted CreateOrUpdate for NIC(%s, %s) failed with error %v", as.ResourceGroup, ptr.Deref(nic.Name, ""), rerr.Error()) + logger.Error(rerr, "CreateOrUpdate for NIC failed", "resourceGroup", as.ResourceGroup, "nicName", ptr.Deref(nic.Name, "")) return rerr } nicUpdated.Store(true) @@ -1143,9 +1160,10 @@ func getAvailabilitySetNameByID(asID string) (string, error) { // GetNodeNameByIPConfigurationID gets the node name and the availabilitySet name by IP configuration ID. func (as *availabilitySet) GetNodeNameByIPConfigurationID(ctx context.Context, ipConfigurationID string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeNameByIPConfigurationID") matches := nicIDRE.FindStringSubmatch(ipConfigurationID) if len(matches) != 3 { - klog.V(4).Infof("Can not extract VM name from ipConfigurationID (%s)", ipConfigurationID) + logger.V(4).Info("Can not extract VM name from ipConfigurationID", "ipConfigurationID", ipConfigurationID) return "", "", fmt.Errorf("invalid ip config ID %s", ipConfigurationID) } @@ -1162,7 +1180,7 @@ func (as *availabilitySet) GetNodeNameByIPConfigurationID(ctx context.Context, i vmID = ptr.Deref(nic.Properties.VirtualMachine.ID, "") } if vmID == "" { - klog.V(2).Infof("GetNodeNameByIPConfigurationID(%s): empty vmID", ipConfigurationID) + logger.V(2).Info("empty vmID", "ipConfigurationID", ipConfigurationID) return "", "", nil } @@ -1174,7 +1192,7 @@ func (as *availabilitySet) GetNodeNameByIPConfigurationID(ctx context.Context, i vm, err := as.getVirtualMachine(ctx, types.NodeName(vmName), azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("Unable to get the virtual machine by node name %s: %v", vmName, err) + logger.Error(err, "Unable to get the virtual machine by node name", "name", vmName) return "", "", err } asID := "" @@ -1243,6 +1261,7 @@ func (as *availabilitySet) getAvailabilitySetByNodeName(ctx context.Context, nod // GetNodeCIDRMaskByProviderID returns the node CIDR subnet mask by provider ID. func (as *availabilitySet) GetNodeCIDRMasksByProviderID(ctx context.Context, providerID string) (int, int, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeCIDRMasksByProviderID") nodeName, err := as.GetNodeNameByProviderID(ctx, providerID) if err != nil { return 0, 0, err @@ -1260,13 +1279,13 @@ func (as *availabilitySet) GetNodeCIDRMasksByProviderID(ctx context.Context, pro if v4, ok := vmas.Tags[consts.VMSetCIDRIPV4TagKey]; ok && v4 != nil { ipv4Mask, err = strconv.Atoi(ptr.Deref(v4, "")) if err != nil { - klog.Errorf("GetNodeCIDRMasksByProviderID: error when paring the value of the ipv4 mask size %s: %v", ptr.Deref(v4, ""), err) + logger.Error(err, "error when parsing the value of the ipv4 mask size", "value", ptr.Deref(v4, "")) } } if v6, ok := vmas.Tags[consts.VMSetCIDRIPV6TagKey]; ok && v6 != nil { ipv6Mask, err = strconv.Atoi(ptr.Deref(v6, "")) if err != nil { - klog.Errorf("GetNodeCIDRMasksByProviderID: error when paring the value of the ipv6 mask size%s: %v", ptr.Deref(v6, ""), err) + logger.Error(err, "error when parsing the value of the ipv6 mask size", "value", ptr.Deref(v6, "")) } } @@ -1280,9 +1299,10 @@ func (as *availabilitySet) EnsureBackendPoolDeletedFromVMSets(_ context.Context, // GetAgentPoolVMSetNames returns all VMAS names according to the nodes func (as *availabilitySet) GetAgentPoolVMSetNames(ctx context.Context, nodes []*v1.Node) ([]*string, error) { + logger := log.FromContextOrBackground(ctx).WithName("as.GetAgentPoolVMSetNames") vms, err := as.ListVirtualMachines(ctx, as.ResourceGroup) if err != nil { - klog.Errorf("as.getNodeAvailabilitySet - ListVirtualMachines failed, err=%v", err) + logger.Error(err, "as.getNodeAvailabilitySet - ListVirtualMachines failed") return nil, err } diff --git a/pkg/provider/azure_utils.go b/pkg/provider/azure_utils.go index 05256f1212..f076464d0f 100644 --- a/pkg/provider/azure_utils.go +++ b/pkg/provider/azure_utils.go @@ -32,6 +32,7 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) const ( @@ -62,6 +63,7 @@ func getContextWithCancel() (context.Context, context.CancelFunc) { // // XXX: return error instead of logging; decouple tag parsing and tag application func parseTags(tags string, tagsMap map[string]string) map[string]*string { + logger := log.Background().WithName("parseTags") formatted := make(map[string]*string) if tags != "" { @@ -99,7 +101,7 @@ func parseTags(tags string, tagsMap map[string]string) map[string]*string { } if found, k := findKeyInMapCaseInsensitive(formatted, key); found && k != key { - klog.V(4).Infof("parseTags: found identical keys: %s from tags and %s from tagsMap (case-insensitive), %s will replace %s", k, key, key, k) + logger.V(4).Info("found identical keys from tags and tagsMap (case-insensitive), will replace", "identical keys", k, "keyFromTagsMap", key) delete(formatted, k) } formatted[key] = ptr.To(value) @@ -137,6 +139,7 @@ func findKeyInMapWithPrefix(targetMap map[string]*string, key string) (bool, str } func (az *Cloud) reconcileTags(currentTagsOnResource, newTags map[string]*string) (reconciledTags map[string]*string, changed bool) { + logger := log.Background().WithName("reconcileTags") var systemTags []string systemTagsMap := make(map[string]*string) @@ -169,7 +172,7 @@ func (az *Cloud) reconcileTags(currentTagsOnResource, newTags map[string]*string for k := range currentTagsOnResource { if _, ok := newTags[k]; !ok { if found, _ := findKeyInMapWithPrefix(systemTagsMap, k); !found { - klog.V(2).Infof("reconcileTags: delete tag %s: %s", k, ptr.Deref(currentTagsOnResource[k], "")) + logger.V(2).Info("delete tag", "key", k, "value", ptr.Deref(currentTagsOnResource[k], "")) delete(currentTagsOnResource, k) changed = true } @@ -189,10 +192,11 @@ func getExtendedLocationTypeFromString(extendedLocationType string) armnetwork.E } func getNodePrivateIPAddress(node *v1.Node, isIPv6 bool) string { + logger := log.Background().WithName("getNodePrivateIPAddress") for _, nodeAddress := range node.Status.Addresses { if strings.EqualFold(string(nodeAddress.Type), string(v1.NodeInternalIP)) && utilnet.IsIPv6String(nodeAddress.Address) == isIPv6 { - klog.V(6).Infof("getNodePrivateIPAddress: node %s, ip %s", node.Name, nodeAddress.Address) + logger.V(6).Info("Get node private IP address", "node", node.Name, "ip", nodeAddress.Address) return nodeAddress.Address } } @@ -521,9 +525,10 @@ func getServiceIPFamily(service *v1.Service) string { // getResourceGroupAndNameFromNICID parses the ip configuration ID to get the resource group and nic name. func getResourceGroupAndNameFromNICID(ipConfigurationID string) (string, string, error) { + logger := log.Background().WithName("getResourceGroupAndNameFromNICID") matches := nicIDRE.FindStringSubmatch(ipConfigurationID) if len(matches) != 3 { - klog.V(4).Infof("Can not extract nic name from ipConfigurationID (%s)", ipConfigurationID) + logger.V(4).Info("Can not extract nic name from ipConfigurationID", "ipConfigurationID", ipConfigurationID) return "", "", fmt.Errorf("invalid ip config ID %s", ipConfigurationID) } diff --git a/pkg/provider/azure_vmsets_repo.go b/pkg/provider/azure_vmsets_repo.go index 5db60c7cbd..fb9da82f52 100644 --- a/pkg/provider/azure_vmsets_repo.go +++ b/pkg/provider/azure_vmsets_repo.go @@ -31,10 +31,12 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // GetVirtualMachineWithRetry invokes az.getVirtualMachine with exponential backoff retry func (az *Cloud) GetVirtualMachineWithRetry(ctx context.Context, name types.NodeName, crt azcache.AzureCacheReadType) (*armcompute.VirtualMachine, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetVirtualMachineWithRetry") var machine *armcompute.VirtualMachine var retryErr error err := wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { @@ -43,10 +45,10 @@ func (az *Cloud) GetVirtualMachineWithRetry(ctx context.Context, name types.Node return true, cloudprovider.InstanceNotFound } if retryErr != nil { - klog.Errorf("GetVirtualMachineWithRetry(%s): backoff failure, will retry, err=%v", name, retryErr) + logger.Error(retryErr, "backoff failure, will retry", "node", name) return false, nil } - klog.V(2).Infof("GetVirtualMachineWithRetry(%s): backoff success", name) + logger.V(2).Info("backoff success", "node", name) return true, nil }) if errors.Is(err, wait.ErrWaitTimeout) { @@ -57,12 +59,13 @@ func (az *Cloud) GetVirtualMachineWithRetry(ctx context.Context, name types.Node // ListVirtualMachines invokes az.ComputeClientFactory.GetVirtualMachineClient().List with exponential backoff retry func (az *Cloud) ListVirtualMachines(ctx context.Context, resourceGroup string) ([]*armcompute.VirtualMachine, error) { + logger := log.FromContextOrBackground(ctx).WithName("ListVirtualMachines") allNodes, err := az.ComputeClientFactory.GetVirtualMachineClient().List(ctx, resourceGroup) if err != nil { - klog.Errorf("ComputeClientFactory.GetVirtualMachineClient().List(%v) failure with err=%v", resourceGroup, err) + logger.Error(err, "ComputeClientFactory.GetVirtualMachineClient().List failure", "resourceGroup", resourceGroup) return nil, err } - klog.V(6).Infof("ComputeClientFactory.GetVirtualMachineClient().List(%v) success", resourceGroup) + logger.V(6).Info("ComputeClientFactory.GetVirtualMachineClient().List success", "resourceGroup", resourceGroup) return allNodes, nil } @@ -73,6 +76,7 @@ func (az *Cloud) getPrivateIPsForMachine(ctx context.Context, nodeName types.Nod } func (az *Cloud) getPrivateIPsForMachineWithRetry(ctx context.Context, nodeName types.NodeName) ([]string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getPrivateIPsForMachineWithRetry") var privateIPs []string err := wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { var retryErr error @@ -82,10 +86,10 @@ func (az *Cloud) getPrivateIPsForMachineWithRetry(ctx context.Context, nodeName if errors.Is(retryErr, cloudprovider.InstanceNotFound) { return true, retryErr } - klog.Errorf("GetPrivateIPsByNodeName(%s): backoff failure, will retry,err=%v", nodeName, retryErr) + logger.Error(retryErr, "GetPrivateIPsByNodeName: backoff failure, will retry", "node", nodeName) return false, nil } - klog.V(3).Infof("GetPrivateIPsByNodeName(%s): backoff success", nodeName) + logger.V(3).Info("backoff success", "node", nodeName) return true, nil }) return privateIPs, err @@ -97,22 +101,25 @@ func (az *Cloud) getIPForMachine(ctx context.Context, nodeName types.NodeName) ( // GetIPForMachineWithRetry invokes az.getIPForMachine with exponential backoff retry func (az *Cloud) GetIPForMachineWithRetry(ctx context.Context, name types.NodeName) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetIPForMachineWithRetry") var ip, publicIP string err := wait.ExponentialBackoffWithContext(ctx, az.RequestBackoff(), func(ctx context.Context) (bool, error) { var retryErr error ip, publicIP, retryErr = az.VMSet.GetIPByNodeName(ctx, string(name)) if retryErr != nil { - klog.Errorf("GetIPForMachineWithRetry(%s): backoff failure, will retry,err=%v", name, retryErr) + logger.Error(retryErr, "GetIPForMachineWithRetry: backoff failure, will retry", "node", name) return false, nil } - klog.V(3).Infof("GetIPForMachineWithRetry(%s): backoff success", name) + logger.V(3).Info("backoff success", "node", name) return true, nil }) return ip, publicIP, err } func (az *Cloud) newVMCache() (azcache.Resource, error) { + getter := func(ctx context.Context, key string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newVMCache") // Currently InstanceView request are used by azure_zones, while the calls come after non-InstanceView // request. If we first send an InstanceView request and then a non InstanceView request, the second // request will still hit throttling. This is what happens now for cloud controller manager: In this @@ -132,13 +139,13 @@ func (az *Cloud) newVMCache() (azcache.Resource, error) { } if !exists { - klog.V(2).Infof("Virtual machine %q not found", key) + logger.V(2).Info("Virtual machine not found", "vmName", key) return nil, nil } if vm != nil && vm.Properties != nil && strings.EqualFold(ptr.Deref(vm.Properties.ProvisioningState, ""), string(consts.ProvisioningStateDeleting)) { - klog.V(2).Infof("Virtual machine %q is under deleting", key) + logger.V(2).Info("Virtual machine is under deleting", "vmName", key) return nil, nil } diff --git a/pkg/provider/azure_vmss.go b/pkg/provider/azure_vmss.go index d618b1b311..b202ebd777 100644 --- a/pkg/provider/azure_vmss.go +++ b/pkg/provider/azure_vmss.go @@ -41,6 +41,7 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/metrics" "sigs.k8s.io/cloud-provider-azure/pkg/provider/virtualmachine" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" @@ -170,6 +171,7 @@ func newScaleSet(az *Cloud) (VMSet, error) { } func (ss *ScaleSet) getVMSS(ctx context.Context, vmssName string, crt azcache.AzureCacheReadType) (*armcompute.VirtualMachineScaleSet, error) { + logger := log.FromContextOrBackground(ctx).WithName("getVMSS") getter := func(vmssName string) (*armcompute.VirtualMachineScaleSet, error) { cached, err := ss.vmssCache.Get(ctx, consts.VMSSKey, crt) if err != nil { @@ -192,7 +194,7 @@ func (ss *ScaleSet) getVMSS(ctx context.Context, vmssName string, crt azcache.Az return vmss, nil } - klog.V(2).Infof("Couldn't find VMSS with name %s, refreshing the cache", vmssName) + logger.V(2).Info("Couldn't find VMSS, refreshing the cache", "vmssName", vmssName) _ = ss.vmssCache.Delete(consts.VMSSKey) vmss, err = getter(vmssName) if err != nil { @@ -208,6 +210,7 @@ func (ss *ScaleSet) getVMSS(ctx context.Context, vmssName string, crt azcache.Az // getVmssVMByNodeIdentity find virtualMachineScaleSetVM by nodeIdentity, using node's parent VMSS cache. // Returns cloudprovider.InstanceNotFound if the node does not belong to the scale set named in nodeIdentity. func (ss *ScaleSet) getVmssVMByNodeIdentity(ctx context.Context, node *nodeIdentity, crt azcache.AzureCacheReadType) (*virtualmachine.VirtualMachine, error) { + logger := log.FromContextOrBackground(ctx).WithName("getVmssVMByNodeIdentity") // FIXME(ccc): check only if vmss is uniform. _, err := getScaleSetVMInstanceID(node.nodeName) if err != nil { @@ -246,11 +249,11 @@ func (ss *ScaleSet) getVmssVMByNodeIdentity(ctx context.Context, node *nodeIdent defer ss.lockMap.UnlockEntry(cacheKey) vm, found, err = getter(ctx, crt) if err == nil && found && vm != nil { - klog.V(2).Infof("found VMSS VM with nodeName %s after retry", node.nodeName) + logger.V(2).Info("found VMSS VM with nodeName after retry", "nodeName", node.nodeName) return vm, nil } - klog.V(2).Infof("Couldn't find VMSS VM with nodeName %s, refreshing the cache(vmss: %s, rg: %s)", node.nodeName, node.vmssName, node.resourceGroup) + logger.V(2).Info("Couldn't find VMSS VM with nodeName, refreshing the cache", "nodeName", node.nodeName, "vmss", node.vmssName, "resourceGroup", node.resourceGroup) vm, found, err = getter(ctx, azcache.CacheReadTypeForceRefresh) if err != nil { return nil, err @@ -281,9 +284,10 @@ func (ss *ScaleSet) getVmssVM(ctx context.Context, nodeName string, crt azcache. // GetPowerStatusByNodeName returns the power state of the specified node. func (ss *ScaleSet) GetPowerStatusByNodeName(ctx context.Context, name string) (powerState string, err error) { + logger := log.FromContextOrBackground(ctx).WithName("GetPowerStatusByNodeName") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return "", err } @@ -309,15 +313,16 @@ func (ss *ScaleSet) GetPowerStatusByNodeName(ctx context.Context, name string) ( } // vm.Properties.InstanceView or vm.Properties.InstanceView.Statuses are nil when the VM is under deleting. - klog.V(3).Infof("InstanceView for node %q is nil, assuming it's deleting", name) + logger.V(3).Info("InstanceView for node is nil, assuming it's deleting", "node", name) return consts.VMPowerStateUnknown, nil } // GetProvisioningStateByNodeName returns the provisioningState for the specified node. func (ss *ScaleSet) GetProvisioningStateByNodeName(ctx context.Context, name string) (provisioningState string, err error) { + logger := log.FromContextOrBackground(ctx).WithName("GetProvisioningStateByNodeName") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return "", err } @@ -345,6 +350,7 @@ func (ss *ScaleSet) GetProvisioningStateByNodeName(ctx context.Context, name str // getCachedVirtualMachineByInstanceID gets scaleSetVMInfo from cache. // The node must belong to one of scale sets. func (ss *ScaleSet) getVmssVMByInstanceID(ctx context.Context, resourceGroup, scaleSetName, instanceID string, crt azcache.AzureCacheReadType) (*armcompute.VirtualMachineScaleSetVM, error) { + logger := log.FromContextOrBackground(ctx).WithName("getVmssVMByInstanceID") getter := func(ctx context.Context, crt azcache.AzureCacheReadType) (vm *armcompute.VirtualMachineScaleSetVM, found bool, err error) { virtualMachines, err := ss.getVMSSVMsFromCache(ctx, resourceGroup, scaleSetName, crt) if err != nil { @@ -372,7 +378,7 @@ func (ss *ScaleSet) getVmssVMByInstanceID(ctx context.Context, resourceGroup, sc return nil, err } if !found { - klog.V(2).Infof("Couldn't find VMSS VM with scaleSetName %q and instanceID %q, refreshing the cache", scaleSetName, instanceID) + logger.V(2).Info("Couldn't find VMSS VM with scaleSetName and instanceID, refreshing the cache", "scaleSetName", scaleSetName, "instanceID", instanceID) vm, found, err = getter(ctx, azcache.CacheReadTypeForceRefresh) if err != nil { return nil, err @@ -382,7 +388,7 @@ func (ss *ScaleSet) getVmssVMByInstanceID(ctx context.Context, resourceGroup, sc return vm, nil } if found && vm == nil { - klog.V(2).Infof("Couldn't find VMSS VM with scaleSetName %q and instanceID %q, refreshing the cache if it is expired", scaleSetName, instanceID) + logger.V(2).Info("Couldn't find VMSS VM with scaleSetName and instanceID, refreshing the cache if it is expired", "scaleSetName", scaleSetName, "instanceID", instanceID) vm, found, err = getter(ctx, azcache.CacheReadTypeDefault) if err != nil { return nil, err @@ -402,9 +408,10 @@ func (ss *ScaleSet) getVmssVMByInstanceID(ctx context.Context, resourceGroup, sc // It must return ("", cloudprovider.InstanceNotFound) if the instance does // not exist or is no longer running. func (ss *ScaleSet) GetInstanceIDByNodeName(ctx context.Context, name string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetInstanceIDByNodeName") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return "", err } @@ -425,14 +432,14 @@ func (ss *ScaleSet) GetInstanceIDByNodeName(ctx context.Context, name string) (s if errors.Is(err, ErrorNotVmssInstance) { return "", cloudprovider.InstanceNotFound } - klog.Errorf("Unable to find node %s: %v", name, err) + logger.Error(err, "Unable to find node", "node", name) return "", err } resourceID := vm.ID convertedResourceID, err := ConvertResourceGroupNameToLower(resourceID) if err != nil { - klog.Errorf("ConvertResourceGroupNameToLower failed with error: %v", err) + logger.Error(err, "ConvertResourceGroupNameToLower failed") return "", err } return convertedResourceID, nil @@ -445,9 +452,10 @@ func (ss *ScaleSet) GetInstanceIDByNodeName(ctx context.Context, name string) (s // azure:///subscriptions/subsid/resourceGroups/rg/providers/Microsoft.Compute/virtualMachineScaleSets/aks-agentpool-22126781-vmss/virtualMachines/1 // /subscriptions/subsid/resourceGroups/rg/providers/Microsoft.Compute/virtualMachineScaleSets/aks-agentpool-22126781-vmss/virtualMachines/k8s-agentpool-36841236-vmss_1 func (ss *ScaleSet) GetNodeNameByProviderID(ctx context.Context, providerID string) (types.NodeName, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeNameByProviderID") vmManagementType, err := ss.getVMManagementTypeByProviderID(ctx, providerID, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return "", err } @@ -472,7 +480,7 @@ func (ss *ScaleSet) GetNodeNameByProviderID(ctx context.Context, providerID stri instanceID, err := getLastSegment(providerID, "/") if err != nil { - klog.V(4).Infof("Can not extract instanceID from providerID (%s), assuming it is managed by availability set: %v", providerID, err) + logger.V(4).Error(err, "Can not extract instanceID from providerID, assuming it is managed by availability set", "providerID", providerID) return ss.availabilitySet.GetNodeNameByProviderID(ctx, providerID) } @@ -486,7 +494,7 @@ func (ss *ScaleSet) GetNodeNameByProviderID(ctx context.Context, providerID stri vm, err := ss.getVmssVMByInstanceID(ctx, resourceGroup, scaleSetName, instanceID, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Unable to find node by providerID %s: %v", providerID, err) + logger.Error(err, "Unable to find node by providerID", "providerID", providerID) return "", err } @@ -500,9 +508,10 @@ func (ss *ScaleSet) GetNodeNameByProviderID(ctx context.Context, providerID stri // GetInstanceTypeByNodeName gets the instance type by node name. func (ss *ScaleSet) GetInstanceTypeByNodeName(ctx context.Context, name string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetInstanceTypeByNodeName") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return "", err } @@ -533,9 +542,10 @@ func (ss *ScaleSet) GetInstanceTypeByNodeName(ctx context.Context, name string) // GetZoneByNodeName gets availability zone for the specified node. If the node is not running // with availability zone, then it returns fault domain. func (ss *ScaleSet) GetZoneByNodeName(ctx context.Context, name string) (cloudprovider.Zone, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetZoneByNodeName") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return cloudprovider.Zone{}, err } @@ -570,7 +580,7 @@ func (ss *ScaleSet) GetZoneByNodeName(ctx context.Context, name string) (cloudpr failureDomain = strconv.Itoa(int(*vm.AsVirtualMachineScaleSetVM().Properties.InstanceView.PlatformFaultDomain)) } else { err = fmt.Errorf("failed to get zone info") - klog.Errorf("GetZoneByNodeName: got unexpected error %v", err) + logger.Error(err, "got unexpected error") _ = ss.DeleteCacheForNode(ctx, name) return cloudprovider.Zone{}, err } @@ -589,9 +599,10 @@ func (ss *ScaleSet) GetPrimaryVMSetName() string { // GetIPByNodeName gets machine private IP and public IP by node name. func (ss *ScaleSet) GetIPByNodeName(ctx context.Context, nodeName string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetIPByNodeName") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, nodeName, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return "", "", err } @@ -606,13 +617,13 @@ func (ss *ScaleSet) GetIPByNodeName(ctx context.Context, nodeName string) (strin nic, err := ss.GetPrimaryInterface(ctx, nodeName) if err != nil { - klog.Errorf("error: ss.GetIPByNodeName(%s), GetPrimaryInterface(%q), err=%v", nodeName, nodeName, err) + logger.Error(err, "GetPrimaryInterface() failed", "nodeName", nodeName) return "", "", err } ipConfig, err := getPrimaryIPConfig(nic) if err != nil { - klog.Errorf("error: ss.GetIPByNodeName(%s), getPrimaryIPConfig(%v), err=%v", nodeName, nic, err) + logger.Error(err, "getPrimaryIPConfig() failed", "nodeName", nodeName, "nic", nic) return "", "", err } @@ -630,7 +641,7 @@ func (ss *ScaleSet) GetIPByNodeName(ctx context.Context, nodeName string) (strin publicIPAddressName := matches[6] pip, existsPip, err := ss.getVMSSPublicIPAddress(resourceGroupName, virtualMachineScaleSetName, virtualMachineIndex, networkInterfaceName, IPConfigurationName, publicIPAddressName) if err != nil { - klog.Errorf("ss.getVMSSPublicIPAddress() failed with error: %v", err) + logger.Error(err, "ss.getVMSSPublicIPAddress() failed") return "", "", err } if existsPip && pip.Properties.IPAddress != nil { @@ -647,6 +658,7 @@ func (ss *ScaleSet) GetIPByNodeName(ctx context.Context, nodeName string) (strin func (ss *ScaleSet) getVMSSPublicIPAddress(resourceGroupName string, virtualMachineScaleSetName string, virtualMachineIndex string, networkInterfaceName string, IPConfigurationName string, publicIPAddressName string) (*armnetwork.PublicIPAddress, bool, error) { ctx, cancel := getContextWithCancel() defer cancel() + logger := log.FromContextOrBackground(ctx).WithName("getVMSSPublicIPAddress") pip, err := ss.NetworkClientFactory.GetPublicIPAddressClient().GetVirtualMachineScaleSetPublicIPAddress(ctx, resourceGroupName, virtualMachineScaleSetName, virtualMachineIndex, networkInterfaceName, IPConfigurationName, publicIPAddressName, nil) exists, rerr := checkResourceExistsFromError(err) @@ -655,7 +667,7 @@ func (ss *ScaleSet) getVMSSPublicIPAddress(resourceGroupName string, virtualMach } if !exists { - klog.V(2).Infof("Public IP %q not found", publicIPAddressName) + logger.V(2).Info("Public IP not found", "publicIPAddressName", publicIPAddressName) return nil, false, nil } @@ -666,10 +678,11 @@ func (ss *ScaleSet) getVMSSPublicIPAddress(resourceGroupName string, virtualMach // TODO (khenidak): This should read all nics, not just the primary // allowing users to split ipv4/v6 on multiple nics func (ss *ScaleSet) GetPrivateIPsByNodeName(ctx context.Context, nodeName string) ([]string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetPrivateIPsByNodeName") ips := make([]string, 0) vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, nodeName, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type by node name") return ips, err } @@ -684,7 +697,7 @@ func (ss *ScaleSet) GetPrivateIPsByNodeName(ctx context.Context, nodeName string nic, err := ss.GetPrimaryInterface(ctx, nodeName) if err != nil { - klog.Errorf("error: ss.GetIPByNodeName(%s), GetPrimaryInterface(%q), err=%v", nodeName, nodeName, err) + logger.Error(err, "GetPrimaryInterface() failed", "nodeName", nodeName) return ips, err } @@ -760,6 +773,7 @@ func extractResourceGroupByProviderID(providerID string) (string, error) { // getNodeIdentityByNodeName use the VMSS cache to find a node's resourcegroup and vmss, returned in a nodeIdentity. func (ss *ScaleSet) getNodeIdentityByNodeName(ctx context.Context, nodeName string, crt azcache.AzureCacheReadType) (*nodeIdentity, error) { + logger := log.FromContextOrBackground(ctx).WithName("getNodeIdentityByNodeName") getter := func(nodeName string, crt azcache.AzureCacheReadType) (*nodeIdentity, error) { node := &nodeIdentity{ nodeName: nodeName, @@ -808,7 +822,7 @@ func (ss *ScaleSet) getNodeIdentityByNodeName(ctx context.Context, nodeName stri return node, nil } - klog.V(2).Infof("Couldn't find VMSS for node %s, refreshing the cache", nodeName) + logger.V(2).Info("Couldn't find VMSS for node, refreshing the cache", "node", nodeName) node, err = getter(nodeName, azcache.CacheReadTypeForceRefresh) if err != nil { return nil, err @@ -825,17 +839,19 @@ func (ss *ScaleSet) listScaleSetVMs(scaleSetName, resourceGroup string) ([]*armc ctx, cancel := getContextWithCancel() defer cancel() + logger := log.FromContextOrBackground(ctx).WithName("listScaleSetVMs") + var allVMs []*armcompute.VirtualMachineScaleSetVM var rerr error if ss.Config.ListVmssVirtualMachinesWithoutInstanceView { - klog.V(6).Info("listScaleSetVMs called for scaleSetName: ", scaleSetName, " resourceGroup: ", resourceGroup) + logger.V(6).Info("listScaleSetVMs called for scaleSetName", "scaleSetName", scaleSetName, "resourceGroup", resourceGroup) allVMs, rerr = ss.ComputeClientFactory.GetVirtualMachineScaleSetVMClient().List(ctx, resourceGroup, scaleSetName) } else { - klog.V(6).Info("listScaleSetVMs called for scaleSetName with instanceView: ", scaleSetName, " resourceGroup: ", resourceGroup) + logger.V(6).Info("listScaleSetVMs called for scaleSetName with instanceView", "scaleSetName", scaleSetName, "resourceGroup", resourceGroup) allVMs, rerr = ss.ComputeClientFactory.GetVirtualMachineScaleSetVMClient().ListVMInstanceView(ctx, resourceGroup, scaleSetName) } if rerr != nil { - klog.Errorf("ComputeClientFactory.GetVirtualMachineScaleSetVMClient().List(%s, %s) failed: %v", resourceGroup, scaleSetName, rerr) + logger.Error(rerr, "ComputeClientFactory.GetVirtualMachineScaleSetVMClient().List() failed", "resourceGroup", resourceGroup, "scaleSetName", scaleSetName) if exists, err := errutils.CheckResourceExistsFromAzcoreError(rerr); !exists && err == nil { return nil, cloudprovider.InstanceNotFound } @@ -848,6 +864,7 @@ func (ss *ScaleSet) listScaleSetVMs(scaleSetName, resourceGroup string) ([]*armc // getAgentPoolScaleSets lists the virtual machines for the resource group and then builds // a list of scale sets that match the nodes available to k8s. func (ss *ScaleSet) getAgentPoolScaleSets(ctx context.Context, nodes []*v1.Node) ([]string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getAgentPoolScaleSets") agentPoolScaleSets := []string{} for nx := range nodes { if isControlPlaneNode(nodes[nx]) { @@ -857,7 +874,7 @@ func (ss *ScaleSet) getAgentPoolScaleSets(ctx context.Context, nodes []*v1.Node) nodeName := nodes[nx].Name shouldExcludeLoadBalancer, err := ss.ShouldNodeExcludedFromLoadBalancer(nodeName) if err != nil { - klog.Errorf("ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", nodeName, err) + logger.Error(err, "ShouldNodeExcludedFromLoadBalancer() failed", "nodeName", nodeName) return nil, err } if shouldExcludeLoadBalancer { @@ -870,7 +887,7 @@ func (ss *ScaleSet) getAgentPoolScaleSets(ctx context.Context, nodes []*v1.Node) } if vm.VMSSName == "" { - klog.V(3).Infof("Node %q is not belonging to any known scale sets", nodeName) + logger.V(3).Info("Node is not belonging to any known scale sets", "node", nodeName) continue } @@ -884,6 +901,7 @@ func (ss *ScaleSet) getAgentPoolScaleSets(ctx context.Context, nodes []*v1.Node) // no loadbalancer mode annotation returns the primary VMSet. If service annotation // for loadbalancer exists then return the eligible VMSet. func (ss *ScaleSet) GetVMSetNames(ctx context.Context, service *v1.Service, nodes []*v1.Node) ([]*string, error) { + logger := log.FromContextOrBackground(ctx).WithName("ss.GetVMSetNames") hasMode, isAuto, serviceVMSetName := ss.getServiceLoadBalancerMode(service) if !hasMode || ss.UseStandardLoadBalancer() { // no mode specified in service annotation or use single SLB mode @@ -893,11 +911,11 @@ func (ss *ScaleSet) GetVMSetNames(ctx context.Context, service *v1.Service, node scaleSetNames, err := ss.GetAgentPoolVMSetNames(ctx, nodes) if err != nil { - klog.Errorf("ss.GetVMSetNames - GetAgentPoolVMSetNames failed err=(%v)", err) + logger.Error(err, "GetAgentPoolVMSetNames() failed") return nil, err } if len(scaleSetNames) == 0 { - klog.Errorf("ss.GetVMSetNames - No scale sets found for nodes in the cluster, node count(%d)", len(nodes)) + logger.Error(nil, "No scale sets found for nodes in the cluster", "nodeCount", len(nodes)) return nil, fmt.Errorf("no scale sets found for nodes, node count(%d)", len(nodes)) } @@ -911,7 +929,7 @@ func (ss *ScaleSet) GetVMSetNames(ctx context.Context, service *v1.Service, node } } if !found { - klog.Errorf("ss.GetVMSetNames - scale set (%s) in service annotation not found", serviceVMSetName) + logger.Error(nil, "scale set in service annotation not found", "scaleSetName", serviceVMSetName) return nil, ErrScaleSetNotFound } return to.SliceOfPtrs(serviceVMSetName), nil @@ -932,9 +950,10 @@ func extractResourceGroupByVMSSNicID(nicID string) (string, error) { // GetPrimaryInterface gets machine primary network interface by node name and vmSet. func (ss *ScaleSet) GetPrimaryInterface(ctx context.Context, nodeName string) (*armnetwork.Interface, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetPrimaryInterface") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, nodeName, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type by node name") return nil, err } @@ -954,19 +973,19 @@ func (ss *ScaleSet) GetPrimaryInterface(ctx context.Context, nodeName string) (* return ss.availabilitySet.GetPrimaryInterface(ctx, nodeName) } - klog.Errorf("error: ss.GetPrimaryInterface(%s), ss.getVmssVM(ctx,%s), err=%v", nodeName, nodeName, err) + logger.Error(err, "ss.GetVmssVM() failed", "nodeName", nodeName) return nil, err } primaryInterfaceID, err := ss.getPrimaryInterfaceID(vm) if err != nil { - klog.Errorf("error: ss.GetPrimaryInterface(%s), ss.getPrimaryInterfaceID(), err=%v", nodeName, err) + logger.Error(err, "ss.getPrimaryInterfaceID() failed", "nodeName", nodeName) return nil, err } nicName, err := getLastSegment(primaryInterfaceID, "/") if err != nil { - klog.Errorf("error: ss.GetPrimaryInterface(%s), getLastSegment(%s), err=%v", nodeName, primaryInterfaceID, err) + logger.Error(err, "getLastSegment() failed", "nodeName", nodeName, "primaryInterfaceID", primaryInterfaceID) return nil, err } resourceGroup, err := extractResourceGroupByVMSSNicID(primaryInterfaceID) @@ -982,7 +1001,7 @@ func (ss *ScaleSet) GetPrimaryInterface(ctx context.Context, nodeName string) (* if rerr != nil { exists, realErr := checkResourceExistsFromError(rerr) if realErr != nil { - klog.Errorf("error: ss.GetPrimaryInterface(%s), ss.GetVirtualMachineScaleSetNetworkInterface.Get(%s, %s, %s), err=%v", nodeName, resourceGroup, vm.VMSSName, nicName, realErr) + logger.Error(realErr, "ss.GetVirtualMachineScaleSetNetworkInterface failed", "nodeName", nodeName, "resourceGroup", resourceGroup, "vmssName", vm.VMSSName, "nicName", nicName) return nil, realErr } @@ -1050,13 +1069,13 @@ func getPrimaryIPConfigFromVMSSNetworkConfig(config *armcompute.VirtualMachineSc // EnsureHostInPool ensures the given VM's Primary NIC's Primary IP Configuration is // participating in the specified LoadBalancer Backend Pool, which returns (resourceGroup, vmasName, instanceID, vmssVM, error). func (ss *ScaleSet) EnsureHostInPool(ctx context.Context, _ *v1.Service, nodeName types.NodeName, backendPoolID string, vmSetNameOfLB string) (string, string, string, *armcompute.VirtualMachineScaleSetVM, error) { - logger := klog.Background().WithName("EnsureHostInPool"). + logger := log.FromContextOrBackground(ctx).WithName("EnsureHostInPool"). WithValues("nodeName", nodeName, "backendPoolID", backendPoolID, "vmSetNameOfLB", vmSetNameOfLB) vmName := mapNodeNameToVMName(nodeName) vm, err := ss.getVmssVM(ctx, vmName, azcache.CacheReadTypeDefault) if err != nil { if errors.Is(err, cloudprovider.InstanceNotFound) { - klog.Infof("EnsureHostInPool: skipping node %s because it is not found", vmName) + logger.Info("EnsureHostInPool: skipping node because it is not found", "vmName", vmName) return "", "", "", nil, nil } @@ -1093,7 +1112,7 @@ func (ss *ScaleSet) EnsureHostInPool(ctx context.Context, _ *v1.Service, nodeNam } if vmSetNameOfLB != "" && needCheck && !strings.EqualFold(vmSetNameOfLB, vm.VMSSName) { - logger.V(3).Info("skips the node %s because it is not in the ScaleSet %s", vmName, vmSetNameOfLB) + logger.V(3).Info("skips the node because it is not in the ScaleSet", "vmName", vmName, "vmSetNameOfLB", vmSetNameOfLB) return "", "", "", nil, nil } @@ -1197,7 +1216,8 @@ func getVmssAndResourceGroupNameByVMID(id string) (string, string, error) { } func (ss *ScaleSet) ensureVMSSInPool(ctx context.Context, _ *v1.Service, nodes []*v1.Node, backendPoolID string, vmSetNameOfLB string) error { - klog.V(2).Infof("ensureVMSSInPool: ensuring VMSS with backendPoolID %s", backendPoolID) + logger := log.FromContextOrBackground(ctx).WithName("ensureVMSSInPool") + logger.V(2).Info("ensuring VMSS with backendPoolID", "backendPoolID", backendPoolID) vmssNamesMap := make(map[string]bool) // the single standard load balancer supports multiple vmss in its backend while @@ -1210,11 +1230,11 @@ func (ss *ScaleSet) ensureVMSSInPool(ctx context.Context, _ *v1.Service, nodes [ shouldExcludeLoadBalancer, err := ss.ShouldNodeExcludedFromLoadBalancer(node.Name) if err != nil { - klog.Errorf("ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", node.Name, err) + logger.Error(err, "ShouldNodeExcludedFromLoadBalancer failed", "node", node.Name) return err } if shouldExcludeLoadBalancer { - klog.V(4).Infof("Excluding unmanaged/external-resource-group node %q", node.Name) + logger.V(4).Info("Excluding unmanaged/external-resource-group node", "node", node.Name) continue } @@ -1223,19 +1243,19 @@ func (ss *ScaleSet) ensureVMSSInPool(ctx context.Context, _ *v1.Service, nodes [ if node.Spec.ProviderID != "" { resourceGroupName, vmssName, err = getVmssAndResourceGroupNameByVMProviderID(node.Spec.ProviderID) if err != nil { - klog.V(4).Infof("ensureVMSSInPool: the provider ID %s of node %s is not the format of VMSS VM, will skip checking and continue", node.Spec.ProviderID, node.Name) + logger.V(4).Info("the provider ID of node is not the format of VMSS VM, will skip checking and continue", "providerID", node.Spec.ProviderID, "node", node.Name) continue } } else { - klog.V(4).Infof("ensureVMSSInPool: the provider ID of node %s is empty, will check the VM ID", node.Name) + logger.V(4).Info("the provider ID of node is empty, will check the VM ID", "node", node.Name) instanceID, err := ss.InstanceID(ctx, types.NodeName(node.Name)) if err != nil { - klog.Errorf("ensureVMSSInPool: Failed to get instance ID for node %q: %v", node.Name, err) + logger.Error(err, "Failed to get instance ID for node", "node", node.Name) return err } resourceGroupName, vmssName, err = getVmssAndResourceGroupNameByVMID(instanceID) if err != nil { - klog.V(4).Infof("ensureVMSSInPool: the instance ID %s of node %s is not the format of VMSS VM, will skip checking and continue", node.Spec.ProviderID, node.Name) + logger.V(4).Info("the instance ID of node is not the format of VMSS VM, will skip checking and continue", "instanceID", instanceID, "node", node.Name) continue } } @@ -1248,7 +1268,7 @@ func (ss *ScaleSet) ensureVMSSInPool(ctx context.Context, _ *v1.Service, nodes [ vmssNamesMap[vmSetNameOfLB] = true } - klog.V(2).Infof("ensureVMSSInPool begins to update VMSS %v with backendPoolID %s", vmssNamesMap, backendPoolID) + logger.V(2).Info("begins to update VMSS with backendPoolID", "VMSS", vmssNamesMap, "backendPoolID", backendPoolID) for vmssName := range vmssNamesMap { vmss, err := ss.getVMSS(ctx, vmssName, azcache.CacheReadTypeDefault) if err != nil { @@ -1258,19 +1278,19 @@ func (ss *ScaleSet) ensureVMSSInPool(ctx context.Context, _ *v1.Service, nodes [ // When vmss is being deleted, CreateOrUpdate API would report "the vmss is being deleted" error. // Since it is being deleted, we shouldn't send more CreateOrUpdate requests for it. if vmss.Properties.ProvisioningState != nil && strings.EqualFold(*vmss.Properties.ProvisioningState, consts.ProvisionStateDeleting) { - klog.V(3).Infof("ensureVMSSInPool: found vmss %s being deleted, skipping", vmssName) + logger.V(3).Info("found vmss being deleted, skipping", "vmss", vmssName) continue } if vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations == nil { - klog.V(4).Infof("EnsureHostInPool: cannot obtain the primary network interface configuration of vmss %s", vmssName) + logger.V(4).Info("cannot obtain the primary network interface configuration of vmss", "vmss", vmssName) continue } // It is possible to run Windows 2019 nodes in IPv4-only mode in a dual-stack cluster. IPv6 is not supported on // Windows 2019 nodes and therefore does not need to be added to the IPv6 backend pool. if isWindows2019(vmss) && isBackendPoolIPv6(backendPoolID) { - klog.V(3).Infof("ensureVMSSInPool: vmss %s is Windows 2019, skipping adding to IPv6 backend pool", vmssName) + logger.V(3).Info("vmss is Windows 2019, skipping adding to IPv6 backend pool", "vmss", vmssName) continue } @@ -1317,7 +1337,7 @@ func (ss *ScaleSet) ensureVMSSInPool(ctx context.Context, _ *v1.Service, nodes [ return err } if !isSameLB { - klog.V(4).Infof("VMSS %q has already been added to LB %q, omit adding it to a new one", vmssName, oldLBName) + logger.V(4).Info("VMSS has already been added to LB, omit adding it to a new one", "vmss", vmssName, "LB", oldLBName) return nil } } @@ -1348,10 +1368,10 @@ func (ss *ScaleSet) ensureVMSSInPool(ctx context.Context, _ *v1.Service, nodes [ _ = ss.vmssCache.Delete(consts.VMSSKey) }() - klog.V(2).Infof("ensureVMSSInPool begins to update vmss(%s) with new backendPoolID %s", vmssName, backendPoolID) + logger.V(2).Info("begins to update vmss with new backendPoolID", "vmss", vmssName, "backendPoolID", backendPoolID) rerr := ss.CreateOrUpdateVMSS(ss.ResourceGroup, vmssName, newVMSS) if rerr != nil { - klog.Errorf("ensureVMSSInPool CreateOrUpdateVMSS(%s) with new backendPoolID %s, err: %v", vmssName, backendPoolID, rerr) + logger.Error(rerr, "CreateOrUpdateVMSS failed", "vmss", vmssName, "backendPoolID", backendPoolID) return rerr } } @@ -1399,6 +1419,7 @@ func isWindows2019(vmss *armcompute.VirtualMachineScaleSet) bool { } func (ss *ScaleSet) ensureHostsInPool(ctx context.Context, service *v1.Service, nodes []*v1.Node, backendPoolID string, vmSetNameOfLB string) error { + logger := log.FromContextOrBackground(ctx).WithName("ensureHostsInPool") mc := metrics.NewMetricContext("services", "vmss_ensure_hosts_in_pool", ss.ResourceGroup, ss.SubscriptionID, getServiceName(service)) isOperationSucceeded := false defer func() { @@ -1419,23 +1440,23 @@ func (ss *ScaleSet) ensureHostsInPool(ctx context.Context, service *v1.Service, localNodeName := node.Name if ss.UseStandardLoadBalancer() && ss.ExcludeMasterNodesFromStandardLB() && isControlPlaneNode(node) { - klog.V(4).Infof("Excluding master node %q from load balancer backendpool %q", localNodeName, backendPoolID) + logger.V(4).Info("Excluding master node from load balancer backendpool", "node", localNodeName, "backendPoolID", backendPoolID) continue } shouldExcludeLoadBalancer, err := ss.ShouldNodeExcludedFromLoadBalancer(localNodeName) if err != nil { - klog.Errorf("ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", localNodeName, err) + logger.Error(err, "ShouldNodeExcludedFromLoadBalancer failed", "node", localNodeName) return err } if shouldExcludeLoadBalancer { - klog.V(4).Infof("Excluding unmanaged/external-resource-group node %q", localNodeName) + logger.V(4).Info("Excluding unmanaged/external-resource-group node", "node", localNodeName) continue } nodeResourceGroup, nodeVMSS, nodeInstanceID, nodeVMSSVM, err := ss.EnsureHostInPool(ctx, service, types.NodeName(localNodeName), backendPoolID, vmSetNameOfLB) if err != nil { - klog.Errorf("EnsureHostInPool(%s): backendPoolID(%s) - failed to ensure host in pool: %q", getServiceName(service), backendPoolID, err) + logger.Error(err, "EnsureHostInPool failed", "service", getServiceName(service), "backendPoolID", backendPoolID) errors = append(errors, err) continue } @@ -1508,6 +1529,7 @@ func (ss *ScaleSet) ensureHostsInPool(ctx context.Context, service *v1.Service, // EnsureHostsInPool ensures the given Node's primary IP configurations are // participating in the specified LoadBalancer Backend Pool. func (ss *ScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Service, nodes []*v1.Node, backendPoolID string, vmSetNameOfLB string) error { + logger := log.FromContextOrBackground(ctx).WithName("EnsureHostsInPool") if ss.DisableAvailabilitySetNodes && !ss.EnableVmssFlexNodes { return ss.ensureHostsInPool(ctx, service, nodes, backendPoolID, vmSetNameOfLB) } @@ -1519,23 +1541,23 @@ func (ss *ScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Service, localNodeName := node.Name if ss.UseStandardLoadBalancer() && ss.ExcludeMasterNodesFromStandardLB() && isControlPlaneNode(node) { - klog.V(4).Infof("Excluding master node %q from load balancer backendpool %q", localNodeName, backendPoolID) + logger.V(4).Info("Excluding master node from load balancer backendpool", "node", localNodeName, "backendPoolID", backendPoolID) continue } shouldExcludeLoadBalancer, err := ss.ShouldNodeExcludedFromLoadBalancer(localNodeName) if err != nil { - klog.Errorf("ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", localNodeName, err) + logger.Error(err, "ShouldNodeExcludedFromLoadBalancer failed", "node", localNodeName) return err } if shouldExcludeLoadBalancer { - klog.V(4).Infof("Excluding unmanaged/external-resource-group node %q", localNodeName) + logger.V(4).Info("Excluding unmanaged/external-resource-group node", "node", localNodeName) continue } vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, localNodeName, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("Failed to check vmManagementType(%s): %v", localNodeName, err) + logger.Error(err, "Failed to check vmManagementType by node name", "node", localNodeName) errors = append(errors, err) continue } @@ -1547,7 +1569,7 @@ func (ss *ScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Service, vmasNodes = append(vmasNodes, node) continue } - klog.V(3).Infof("EnsureHostsInPool skips node %s because VMAS nodes couldn't be added to basic LB with VMSS backends", localNodeName) + logger.V(3).Info("EnsureHostsInPool skips node because VMAS nodes couldn't be added to basic LB with VMSS backends", "node", localNodeName) continue } if vmManagementType == ManagedByVmssFlex { @@ -1556,7 +1578,7 @@ func (ss *ScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Service, vmssFlexNodes = append(vmssFlexNodes, node) continue } - klog.V(3).Infof("EnsureHostsInPool skips node %s because VMSS Flex nodes deos not support Basic Load Balancer", localNodeName) + logger.V(3).Info("EnsureHostsInPool skips node because VMSS Flex nodes deos not support Basic Load Balancer", "node", localNodeName) continue } vmssUniformNodes = append(vmssUniformNodes, node) @@ -1585,11 +1607,11 @@ func (ss *ScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Service, // ensureBackendPoolDeletedFromNode ensures the loadBalancer backendAddressPools deleted // from the specified node, which returns (resourceGroup, vmasName, instanceID, vmssVM, error). func (ss *ScaleSet) ensureBackendPoolDeletedFromNode(ctx context.Context, nodeName string, backendPoolIDs []string) (string, string, string, *armcompute.VirtualMachineScaleSetVM, error) { - logger := klog.Background().WithName("ensureBackendPoolDeletedFromNode").WithValues("nodeName", nodeName, "backendPoolIDs", backendPoolIDs) + logger := log.FromContextOrBackground(ctx).WithName("ensureBackendPoolDeletedFromNode").WithValues("nodeName", nodeName, "backendPoolIDs", backendPoolIDs) vm, err := ss.getVmssVM(ctx, nodeName, azcache.CacheReadTypeDefault) if err != nil { if errors.Is(err, cloudprovider.InstanceNotFound) { - klog.Infof("ensureBackendPoolDeletedFromNode: skipping node %s because it is not found", nodeName) + logger.Info("ensureBackendPoolDeletedFromNode: skipping node because it is not found", "nodeName", nodeName) return "", "", "", nil, nil } @@ -1606,8 +1628,8 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromNode(ctx context.Context, nodeNa // Find primary network interface configuration. if vm.VirtualMachineScaleSetVMProperties.NetworkProfileConfiguration.NetworkInterfaceConfigurations == nil { - klog.V(4).Infof("ensureBackendPoolDeletedFromNode: cannot obtain the primary network interface configuration, of vm %s, "+ - "probably because the vm's being deleted", nodeName) + logger.V(4).Info("ensureBackendPoolDeletedFromNode: cannot obtain the primary network interface configuration, of vm, "+ + "probably because the vm's being deleted", "vm", nodeName) return "", "", "", nil, nil } networkInterfaceConfigurations := vm.VirtualMachineScaleSetVMProperties.NetworkProfileConfiguration.NetworkInterfaceConfigurations @@ -1653,9 +1675,10 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromNode(ctx context.Context, nodeNa // GetNodeNameByIPConfigurationID gets the node name and the VMSS name by IP configuration ID. func (ss *ScaleSet) GetNodeNameByIPConfigurationID(ctx context.Context, ipConfigurationID string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeNameByIPConfigurationID") vmManagementType, err := ss.getVMManagementTypeByIPConfigurationID(ctx, ipConfigurationID, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type by IP configuration ID") return "", "", err } @@ -1678,7 +1701,7 @@ func (ss *ScaleSet) GetNodeNameByIPConfigurationID(ctx context.Context, ipConfig instanceID := matches[3] vm, err := ss.getVmssVMByInstanceID(ctx, resourceGroup, scaleSetName, instanceID, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Unable to find node by ipConfigurationID %s: %v", ipConfigurationID, err) + logger.Error(err, "Unable to find node by ipConfigurationID", "ipConfigurationID", ipConfigurationID) return "", "", err } @@ -1690,9 +1713,10 @@ func (ss *ScaleSet) GetNodeNameByIPConfigurationID(ctx context.Context, ipConfig } func getScaleSetAndResourceGroupNameByIPConfigurationID(ipConfigurationID string) (string, string, error) { + logger := log.Background().WithName("getScaleSetAndResourceGroupNameByIPConfigurationID") matches := vmssIPConfigurationRE.FindStringSubmatch(ipConfigurationID) if len(matches) != 4 { - klog.V(4).Infof("Can not extract scale set name from ipConfigurationID (%s), assuming it is managed by availability set or vmss flex", ipConfigurationID) + logger.V(4).Info("Can not extract scale set name from ipConfigurationID, assuming it is managed by availability set or vmss flex", "ipConfigurationID", ipConfigurationID) return "", "", ErrorNotVmssInstance } @@ -1702,12 +1726,13 @@ func getScaleSetAndResourceGroupNameByIPConfigurationID(ipConfigurationID string } func (ss *ScaleSet) ensureBackendPoolDeletedFromVMSS(ctx context.Context, backendPoolIDs []string, vmSetName string) error { + logger := log.FromContextOrBackground(ctx).WithName("ensureBackendPoolDeletedFromVMSS") if !ss.UseStandardLoadBalancer() { found := false cachedUniform, err := ss.vmssCache.Get(ctx, consts.VMSSKey, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("ensureBackendPoolDeletedFromVMSS: failed to get vmss uniform from cache: %v", err) + logger.Error(err, "Failed to get vmss uniform from cache") return err } vmssUniformMap := cachedUniform.(*sync.Map) @@ -1727,7 +1752,7 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromVMSS(ctx context.Context, backen flexScaleSet := ss.flexScaleSet.(*FlexScaleSet) cachedFlex, err := flexScaleSet.vmssFlexCache.Get(ctx, consts.VmssFlexKey, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("ensureBackendPoolDeletedFromVMSS: failed to get vmss flex from cache: %v", err) + logger.Error(err, "Failed to get vmss flex from cache") return err } vmssFlexMap := cachedFlex.(*sync.Map) @@ -1759,12 +1784,13 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromVMSS(ctx context.Context, backen } func (ss *ScaleSet) ensureBackendPoolDeletedFromVmssUniform(ctx context.Context, backendPoolIDs []string, vmSetName string) error { + logger := log.FromContextOrBackground(ctx).WithName("ensureBackendPoolDeletedFromVmssUniform") vmssNamesMap := make(map[string]bool) // the standard load balancer supports multiple vmss in its backend while the basic SKU doesn't if ss.UseStandardLoadBalancer() { cachedUniform, err := ss.vmssCache.Get(ctx, consts.VMSSKey, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("ensureBackendPoolDeletedFromVMSS: failed to get vmss uniform from cache: %v", err) + logger.Error(err, "Failed to get vmss uniform from cache") return err } @@ -1777,26 +1803,26 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromVmssUniform(ctx context.Context, } else if v, ok := value.(*armcompute.VirtualMachineScaleSet); ok { vmss = v } - klog.V(2).Infof("ensureBackendPoolDeletedFromVmssUniform: vmss %q, backendPoolIDs %q", ptr.Deref(vmss.Name, ""), backendPoolIDs) + logger.V(2).Info("Ensure backend pools are deleted from vmss uniform", "vmssName", ptr.Deref(vmss.Name, ""), "backendPoolIDs", backendPoolIDs) // When vmss is being deleted, CreateOrUpdate API would report "the vmss is being deleted" error. // Since it is being deleted, we shouldn't send more CreateOrUpdate requests for it. if vmss.Properties.ProvisioningState != nil && strings.EqualFold(*vmss.Properties.ProvisioningState, consts.ProvisionStateDeleting) { - klog.V(3).Infof("ensureBackendPoolDeletedFromVMSS: found vmss %s being deleted, skipping", ptr.Deref(vmss.Name, "")) + logger.V(3).Info("found vmss being deleted, skipping", "vmss", ptr.Deref(vmss.Name, "")) return true } if vmss.Properties.VirtualMachineProfile == nil { - klog.V(4).Infof("ensureBackendPoolDeletedFromVMSS: vmss %s has no VirtualMachineProfile, skipping", ptr.Deref(vmss.Name, "")) + logger.V(4).Info("vmss has no VirtualMachineProfile, skipping", "vmss", ptr.Deref(vmss.Name, "")) return true } if vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations == nil { - klog.V(4).Infof("ensureBackendPoolDeletedFromVMSS: cannot obtain the primary network interface configuration, of vmss %s", ptr.Deref(vmss.Name, "")) + logger.V(4).Info("cannot obtain the primary network interface configuration, of vmss", "vmss", ptr.Deref(vmss.Name, "")) return true } vmssNIC := vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations primaryNIC, err := getPrimaryNetworkInterfaceConfiguration(vmssNIC, ptr.Deref(vmss.Name, "")) if err != nil { - klog.Errorf("ensureBackendPoolDeletedFromVMSS: failed to get the primary network interface config of the VMSS %s: %v", ptr.Deref(vmss.Name, ""), err) + logger.Error(err, "Failed to get the primary network interface config of the VMSS", "vmss", ptr.Deref(vmss.Name, "")) errorList = append(errorList, err) return true } @@ -1804,7 +1830,7 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromVmssUniform(ctx context.Context, handleBackendPool := func(backendPoolID string) bool { primaryIPConfig, err := getPrimaryIPConfigFromVMSSNetworkConfig(primaryNIC, backendPoolID, ptr.Deref(vmss.Name, "")) if err != nil { - klog.Errorf("ensureBackendPoolDeletedFromVMSS: failed to find the primary IP config from the VMSS %s's network config : %v", ptr.Deref(vmss.Name, ""), err) + logger.Error(err, "Failed to find the primary IP config from the VMSS's network config", "vmss", ptr.Deref(vmss.Name, "")) errorList = append(errorList, err) return true } @@ -1813,9 +1839,9 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromVmssUniform(ctx context.Context, loadBalancerBackendAddressPools = primaryIPConfig.Properties.LoadBalancerBackendAddressPools } for _, loadBalancerBackendAddressPool := range loadBalancerBackendAddressPools { - klog.V(4).Infof("ensureBackendPoolDeletedFromVMSS: loadBalancerBackendAddressPool (%s) on vmss (%s)", ptr.Deref(loadBalancerBackendAddressPool.ID, ""), ptr.Deref(vmss.Name, "")) + logger.V(4).Info("loadBalancerBackendAddressPool on vmss", "backendAddressPool", ptr.Deref(loadBalancerBackendAddressPool.ID, ""), "vmss", ptr.Deref(vmss.Name, "")) if strings.EqualFold(ptr.Deref(loadBalancerBackendAddressPool.ID, ""), backendPoolID) { - klog.V(4).Infof("ensureBackendPoolDeletedFromVMSS: found vmss %s with backend pool %s, removing it", ptr.Deref(vmss.Name, ""), backendPoolID) + logger.V(4).Info("found vmss with backend pool, removing it", "vmss", ptr.Deref(vmss.Name, ""), "backendPool", backendPoolID) vmssNamesMap[ptr.Deref(vmss.Name, "")] = true } } @@ -1836,7 +1862,7 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromVmssUniform(ctx context.Context, return utilerrors.Flatten(utilerrors.NewAggregate(errorList)) } } else { - klog.V(2).Infof("ensureBackendPoolDeletedFromVmssUniform: vmss %q, backendPoolIDs %q", vmSetName, backendPoolIDs) + logger.V(2).Info("Ensure backend pools are deleted from vmss uniform", "vmss", vmSetName, "backendPoolIDs", backendPoolIDs) vmssNamesMap[vmSetName] = true } @@ -1845,6 +1871,7 @@ func (ss *ScaleSet) ensureBackendPoolDeletedFromVmssUniform(ctx context.Context, // ensureBackendPoolDeleted ensures the loadBalancer backendAddressPools deleted from the specified nodes. func (ss *ScaleSet) ensureBackendPoolDeleted(ctx context.Context, service *v1.Service, backendPoolIDs []string, vmSetName string, backendAddressPools []*armnetwork.BackendAddressPool) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("ensureBackendPoolDeleted") // Returns nil if backend address pools already deleted. if backendAddressPools == nil { return false, nil @@ -1900,12 +1927,11 @@ func (ss *ScaleSet) ensureBackendPoolDeleted(ctx context.Context, service *v1.Se } if errors.Is(err, cloudprovider.InstanceNotFound) { - klog.Infof("ensureBackendPoolDeleted(%s): skipping ip config %s because the corresponding vmss vm is not"+ - " found", getServiceName(service), ipConfigurationID) + logger.Info("skipping ip config because the corresponding vmss vm is not found", "service", getServiceName(service), "ipConfigurationID", ipConfigurationID) continue } - klog.Errorf("Failed to GetNodeNameByIPConfigurationID(%s): %v", ipConfigurationID, err) + logger.Error(err, "Failed to GetNodeNameByIPConfigurationID", "ipConfigurationID", ipConfigurationID) allErrs = append(allErrs, err) continue } @@ -1913,7 +1939,7 @@ func (ss *ScaleSet) ensureBackendPoolDeleted(ctx context.Context, service *v1.Se nodeResourceGroup, nodeVMSS, nodeInstanceID, nodeVMSSVM, err := ss.ensureBackendPoolDeletedFromNode(ctx, nodeName, backendPoolIDs) if err != nil { if !errors.Is(err, ErrorNotVmssInstance) { // Do nothing for the VMAS nodes. - klog.Errorf("ensureBackendPoolDeleted(%s): backendPoolIDs(%q) - failed with error %v", getServiceName(service), backendPoolIDs, err) + logger.Error(err, "ensureBackendPoolDeletedFromNode failed", "service", getServiceName(service), "backendPoolIDs", backendPoolIDs) allErrs = append(allErrs, err) } continue @@ -1955,7 +1981,7 @@ func (ss *ScaleSet) ensureBackendPoolDeleted(ctx context.Context, service *v1.Se batchSize, err := ss.VMSSBatchSize(ctx, meta.vmssName) if err != nil { - klog.ErrorS(err, "Failed to get vmss batch size", logFields...) + logger.Error(err, "Failed to get vmss batch size", logFields...) return err } @@ -1968,7 +1994,7 @@ func (ss *ScaleSet) ensureBackendPoolDeleted(ctx context.Context, service *v1.Se } err = utilerrors.NewAggregate(errs) if err != nil { - klog.ErrorS(err, "Failed to update VMs for VMSS", logFields...) + logger.Error(err, "Failed to update VMs for VMSS", logFields...) return err } updatedVM.Store(true) @@ -2105,9 +2131,10 @@ func (ss *ScaleSet) EnsureBackendPoolDeleted(ctx context.Context, service *v1.Se // GetNodeCIDRMaskByProviderID returns the node CIDR subnet mask by provider ID. func (ss *ScaleSet) GetNodeCIDRMasksByProviderID(ctx context.Context, providerID string) (int, int, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeCIDRMasksByProviderID") vmManagementType, err := ss.getVMManagementTypeByProviderID(ctx, providerID, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return 0, 0, err } @@ -2134,13 +2161,13 @@ func (ss *ScaleSet) GetNodeCIDRMasksByProviderID(ctx context.Context, providerID if v4, ok := vmss.Tags[consts.VMSetCIDRIPV4TagKey]; ok && v4 != nil { ipv4Mask, err = strconv.Atoi(ptr.Deref(v4, "")) if err != nil { - klog.Errorf("GetNodeCIDRMasksByProviderID: error when paring the value of the ipv4 mask size %s: %v", ptr.Deref(v4, ""), err) + logger.Error(err, "Failed to parse the value of the ipv4 mask size", "value", ptr.Deref(v4, "")) } } if v6, ok := vmss.Tags[consts.VMSetCIDRIPV6TagKey]; ok && v6 != nil { ipv6Mask, err = strconv.Atoi(ptr.Deref(v6, "")) if err != nil { - klog.Errorf("GetNodeCIDRMasksByProviderID: error when paring the value of the ipv6 mask size%s: %v", ptr.Deref(v6, ""), err) + logger.Error(err, "Failed to parse the value of the ipv6 mask size", "value", ptr.Deref(v6, "")) } } @@ -2149,9 +2176,10 @@ func (ss *ScaleSet) GetNodeCIDRMasksByProviderID(ctx context.Context, providerID // deleteBackendPoolFromIPConfig deletes the backend pool from the IP config. func deleteBackendPoolFromIPConfig(msg, backendPoolID, resource string, primaryNIC *armcompute.VirtualMachineScaleSetNetworkConfiguration) (bool, error) { + logger := log.Background().WithName("deleteBackendPoolFromIPConfig") primaryIPConfig, err := getPrimaryIPConfigFromVMSSNetworkConfig(primaryNIC, backendPoolID, resource) if err != nil { - klog.Errorf("%s: failed to get the primary IP config from the VMSS %q's network config: %v", msg, resource, err) + logger.Error(err, "Failed to get the primary IP config from the VMSS's network config", "msg", msg, "resource", resource) return false, err } loadBalancerBackendAddressPools := []*armcompute.SubResource{} @@ -2164,7 +2192,7 @@ func deleteBackendPoolFromIPConfig(msg, backendPoolID, resource string, primaryN for i := len(loadBalancerBackendAddressPools) - 1; i >= 0; i-- { curPool := loadBalancerBackendAddressPools[i] if strings.EqualFold(backendPoolID, *curPool.ID) { - klog.V(10).Infof("%s gets unwanted backend pool %q for VMSS OR VMSS VM %q", msg, backendPoolID, resource) + logger.V(10).Info("gets unwanted backend pool for VMSS OR VMSS VM", "msg", msg, "backendPoolID", backendPoolID, "resource", resource) found = true newBackendPools = append(loadBalancerBackendAddressPools[:i], loadBalancerBackendAddressPools[i+1:]...) } @@ -2178,13 +2206,14 @@ func deleteBackendPoolFromIPConfig(msg, backendPoolID, resource string, primaryN // EnsureBackendPoolDeletedFromVMSets ensures the loadBalancer backendAddressPools deleted from the specified VMSS func (ss *ScaleSet) EnsureBackendPoolDeletedFromVMSets(ctx context.Context, vmssNamesMap map[string]bool, backendPoolIDs []string) error { + logger := log.FromContextOrBackground(ctx).WithName("EnsureBackendPoolDeletedFromVMSets") vmssUpdaters := make([]func() error, 0, len(vmssNamesMap)) errors := make([]error, 0, len(vmssNamesMap)) for vmssName := range vmssNamesMap { vmssName := vmssName vmss, err := ss.getVMSS(ctx, vmssName, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("ensureBackendPoolDeletedFromVMSS: failed to get VMSS %s: %v", vmssName, err) + logger.Error(err, "Failed to get VMSS", "vmss", vmssName) errors = append(errors, err) continue } @@ -2192,17 +2221,17 @@ func (ss *ScaleSet) EnsureBackendPoolDeletedFromVMSets(ctx context.Context, vmss // When vmss is being deleted, CreateOrUpdate API would report "the vmss is being deleted" error. // Since it is being deleted, we shouldn't send more CreateOrUpdate requests for it. if vmss.Properties.ProvisioningState != nil && strings.EqualFold(*vmss.Properties.ProvisioningState, consts.ProvisionStateDeleting) { - klog.V(3).Infof("EnsureBackendPoolDeletedFromVMSets: found vmss %s being deleted, skipping", vmssName) + logger.V(3).Info("found vmss being deleted, skipping", "vmss", vmssName) continue } if vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations == nil { - klog.V(4).Infof("EnsureBackendPoolDeletedFromVMSets: cannot obtain the primary network interface configuration, of vmss %s", vmssName) + logger.V(4).Info("cannot obtain the primary network interface configuration, of vmss", "vmss", vmssName) continue } vmssNIC := vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations primaryNIC, err := getPrimaryNetworkInterfaceConfiguration(vmssNIC, vmssName) if err != nil { - klog.Errorf("EnsureBackendPoolDeletedFromVMSets: failed to get the primary network interface config of the VMSS %s: %v", vmssName, err) + logger.Error(err, "Failed to get the primary network interface config of the VMSS", "vmss", vmssName) errors = append(errors, err) continue } @@ -2239,10 +2268,10 @@ func (ss *ScaleSet) EnsureBackendPoolDeletedFromVMSets(ctx context.Context, vmss _ = ss.vmssCache.Delete(consts.VMSSKey) }() - klog.V(2).Infof("EnsureBackendPoolDeletedFromVMSets begins to update vmss(%s) with backendPoolIDs %q", vmssName, backendPoolIDs) + logger.V(2).Info("begins to update vmss with backendPoolIDs", "vmss", vmssName, "backendPoolIDs", backendPoolIDs) rerr := ss.CreateOrUpdateVMSS(ss.ResourceGroup, vmssName, newVMSS) if rerr != nil { - klog.Errorf("EnsureBackendPoolDeletedFromVMSets CreateOrUpdateVMSS(%s) with new backendPoolIDs %q, err: %v", vmssName, backendPoolIDs, rerr) + logger.Error(rerr, "CreateOrUpdateVMSS failed with new backendPoolIDs", "vmss", vmssName, "backendPoolIDs", backendPoolIDs) return rerr } @@ -2317,9 +2346,10 @@ func (ss *ScaleSet) GetAgentPoolVMSetNames(ctx context.Context, nodes []*v1.Node } func (ss *ScaleSet) GetNodeVMSetName(ctx context.Context, node *v1.Node) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeVMSetName") vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, node.Name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("Failed to check VM management type: %v", err) + logger.Error(err, "Failed to check VM management type") return "", err } @@ -2335,16 +2365,17 @@ func (ss *ScaleSet) GetNodeVMSetName(ctx context.Context, node *v1.Node) (string providerID := node.Spec.ProviderID _, vmssName, err := getVmssAndResourceGroupNameByVMProviderID(providerID) if err != nil { - klog.Errorf("getVmssAndResourceGroupNameByVMProviderID failed: %v", err) + logger.Error(err, "getVmssAndResourceGroupNameByVMProviderID failed") return "", err } - klog.V(4).Infof("ss.GetNodeVMSetName: found vmss name %s from node name %s", vmssName, node.Name) + logger.V(4).Info("found vmss name from node name", "vmssName", vmssName, "nodeName", node.Name) return vmssName, nil } // VMSSBatchSize returns the batch size for VMSS operations. func (ss *ScaleSet) VMSSBatchSize(ctx context.Context, vmssName string) (int, error) { + logger := log.FromContextOrBackground(ctx).WithName("VMSSBatchSize") batchSize := 1 vmss, err := ss.getVMSS(ctx, vmssName, azcache.CacheReadTypeDefault) if err != nil { @@ -2356,7 +2387,7 @@ func (ss *ScaleSet) VMSSBatchSize(ctx context.Context, vmssName string) (int, er if batchSize < 1 { batchSize = 1 } - klog.V(2).InfoS("Fetch VMSS batch size", "vmss", vmssName, "size", batchSize) + logger.V(2).Info("Fetch VMSS batch size", "vmss", vmssName, "size", batchSize) return batchSize, nil } diff --git a/pkg/provider/azure_vmss_cache.go b/pkg/provider/azure_vmss_cache.go index 85123a43ed..a011facc65 100644 --- a/pkg/provider/azure_vmss_cache.go +++ b/pkg/provider/azure_vmss_cache.go @@ -29,6 +29,7 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" utilsets "sigs.k8s.io/cloud-provider-azure/pkg/util/sets" ) @@ -66,6 +67,7 @@ const ( func (ss *ScaleSet) newVMSSCache() (azcache.Resource, error) { getter := func(ctx context.Context, _ string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newVMSSCache") localCache := &sync.Map{} // [vmssName]*vmssEntry allResourceGroups, err := ss.GetResourceGroups() @@ -82,7 +84,7 @@ func (ss *ScaleSet) newVMSSCache() (azcache.Resource, error) { resourceGroupNotFound = true continue } - klog.Errorf("ComputeClientFactory.GetVirtualMachineScaleSetClient().List failed: %v", rerr) + logger.Error(rerr, "ComputeClientFactory.GetVirtualMachineScaleSetClient().List failed") return nil, rerr } @@ -109,7 +111,7 @@ func (ss *ScaleSet) newVMSSCache() (azcache.Resource, error) { for _, cacheKey := range vmssVMKeys { vmssName := cacheKey[strings.LastIndex(cacheKey, "/")+1:] if _, ok := localCache.Load(vmssName); !ok { - klog.V(2).Infof("remove vmss %s from vmssVMCache due to rg not found", cacheKey) + logger.V(2).Info("remove vmss from vmssVMCache due to rg not found", "vmss", cacheKey) _ = ss.vmssVMCache.Delete(cacheKey) } } @@ -144,7 +146,8 @@ func (ss *ScaleSet) getVMSSVMsFromCache(ctx context.Context, resourceGroup, vmss func (ss *ScaleSet) newVMSSVirtualMachinesCache() (azcache.Resource, error) { vmssVirtualMachinesCacheTTL := time.Duration(ss.Config.VmssVirtualMachinesCacheTTLInSeconds) * time.Second - getter := func(_ context.Context, cacheKey string) (interface{}, error) { + getter := func(ctx context.Context, cacheKey string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newVMSSVirtualMachinesCache") localCache := &sync.Map{} // [nodeName]*VMSSVirtualMachineEntry oldCache := make(map[string]*VMSSVirtualMachineEntry) @@ -201,7 +204,7 @@ func (ss *ScaleSet) newVMSSVirtualMachinesCache() (azcache.Resource, error) { // set cache entry to nil when the VM is under deleting. if vm.Properties != nil && strings.EqualFold(ptr.Deref(vm.Properties.ProvisioningState, ""), string(consts.ProvisioningStateDeleting)) { - klog.V(4).Infof("VMSS virtualMachine %q is under deleting, setting its cache to nil", computerName) + logger.V(4).Info("VMSS virtualMachine is under deleting, setting its cache to nil", "VM", computerName) vmssVMCacheEntry.VirtualMachine = nil } localCache.Store(computerName, vmssVMCacheEntry) @@ -218,7 +221,7 @@ func (ss *ScaleSet) newVMSSVirtualMachinesCache() (azcache.Resource, error) { // if the nil cache entry has existed for vmssVirtualMachinesCacheTTL in the cache // then it should not be added back to the cache if vmEntry.VirtualMachine == nil && time.Since(vmEntry.LastUpdate) > vmssVirtualMachinesCacheTTL { - klog.V(5).Infof("ignoring expired entries from old cache for %s", name) + logger.V(5).Info("ignoring expired entries from old cache", "name", name) continue } LastUpdate := time.Now().UTC() @@ -228,7 +231,7 @@ func (ss *ScaleSet) newVMSSVirtualMachinesCache() (azcache.Resource, error) { LastUpdate = vmEntry.LastUpdate } - klog.V(5).Infof("adding old entries to new cache for %s", name) + logger.V(5).Info("adding old entries to new cache", "name", name) localCache.Store(name, &VMSSVirtualMachineEntry{ ResourceGroup: vmEntry.ResourceGroup, VMSSName: vmEntry.VMSSName, @@ -247,12 +250,13 @@ func (ss *ScaleSet) newVMSSVirtualMachinesCache() (azcache.Resource, error) { // DeleteCacheForNode deletes Node from VMSS VM and VM caches. func (ss *ScaleSet) DeleteCacheForNode(ctx context.Context, nodeName string) error { + logger := log.FromContextOrBackground(ctx).WithName("DeleteCacheForNode") if ss.Config.DisableAPICallCache { return nil } vmManagementType, err := ss.getVMManagementTypeByNodeName(ctx, nodeName, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("getVMManagementTypeByNodeName(%s) failed with %v", nodeName, err) + logger.Error(err, "getVMManagementTypeByNodeName failed", "node", nodeName) return err } @@ -267,7 +271,7 @@ func (ss *ScaleSet) DeleteCacheForNode(ctx context.Context, nodeName string) err node, err := ss.getNodeIdentityByNodeName(ctx, nodeName, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("getNodeIdentityByNodeName(%s) failed with %v", nodeName, err) + logger.Error(err, "getNodeIdentityByNodeName failed", "node", nodeName) return err } // get sync.Map cache and remove the node from the cache @@ -277,17 +281,18 @@ func (ss *ScaleSet) DeleteCacheForNode(ctx context.Context, nodeName string) err virtualMachines, err := ss.getVMSSVMsFromCache(ctx, node.resourceGroup, node.vmssName, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("getVMSSVMsFromCache(%s, %s) failed with %v", node.resourceGroup, node.vmssName, err) + logger.Error(err, "getVMSSVMsFromCache failed", "resourceGroup", node.resourceGroup, "vmssName", node.vmssName) return err } virtualMachines.Delete(nodeName) ss.vmssVMCache.Update(cacheKey, virtualMachines) - klog.V(2).Infof("DeleteCacheForNode(%s, %s, %s) successfully", node.resourceGroup, node.vmssName, nodeName) + logger.V(2).Info("successfully deleted cache for node", "resourceGroup", node.resourceGroup, "vmssName", node.vmssName, "node", nodeName) return nil } func (ss *ScaleSet) updateCache(ctx context.Context, nodeName, resourceGroupName, vmssName, instanceID string, updatedVM *armcompute.VirtualMachineScaleSetVM) error { + logger := log.FromContextOrBackground(ctx).WithName("updateCache") if nodeName == "" { return fmt.Errorf("updateCache(%s, %s, %s) failed with empty nodeName", vmssName, resourceGroupName, nodeName) } @@ -325,12 +330,13 @@ func (ss *ScaleSet) updateCache(ctx context.Context, nodeName, resourceGroupName }) ss.vmssVMCache.Update(cacheKey, localCache) - klog.V(2).Infof("updateCache(%s, %s, %s) for cacheKey(%s) updated successfully", vmssName, resourceGroupName, nodeName, cacheKey) + logger.V(2).Info("updated successfully", "vmssName", vmssName, "resourceGroupName", resourceGroupName, "node", nodeName, "cacheKey", cacheKey) return nil } func (ss *ScaleSet) newNonVmssUniformNodesCache() (azcache.Resource, error) { getter := func(ctx context.Context, _ string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newNonVmssUniformNodesCache") vmssFlexVMNodeNames := utilsets.NewString() vmssFlexVMProviderIDs := utilsets.NewString() avSetVMNodeNames := utilsets.NewString() @@ -339,7 +345,7 @@ func (ss *ScaleSet) newNonVmssUniformNodesCache() (azcache.Resource, error) { if err != nil { return nil, err } - klog.V(2).Infof("refresh the cache of NonVmssUniformNodesCache in rg %v", resourceGroups) + logger.V(2).Info("refresh the cache of NonVmssUniformNodesCache", "resourceGroups", resourceGroups) for _, resourceGroup := range resourceGroups.UnsortedList() { vms, err := ss.Cloud.ListVirtualMachines(ctx, resourceGroup) @@ -387,6 +393,7 @@ func (ss *ScaleSet) newNonVmssUniformNodesCache() (azcache.Resource, error) { } func (ss *ScaleSet) getVMManagementTypeByNodeName(ctx context.Context, nodeName string, crt azcache.AzureCacheReadType) (VMManagementType, error) { + logger := log.FromContextOrBackground(ctx).WithName("getVMManagementTypeByNodeName") if ss.DisableAvailabilitySetNodes && !ss.EnableVmssFlexNodes { return ManagedByVmssUniform, nil } @@ -422,7 +429,7 @@ func (ss *ScaleSet) getVMManagementTypeByNodeName(ctx context.Context, nodeName return ManagedByVmssUniform, nil } - klog.V(2).Infof("Node %s has joined the cluster since the last VM cache refresh in NonVmssUniformNodesEntry, refreshing the cache", nodeName) + logger.V(2).Info("Node has joined the cluster since the last VM cache refresh in NonVmssUniformNodesEntry, refreshing the cache", "node", nodeName) cached, err = ss.nonVmssUniformNodesCache.Get(ctx, consts.NonVmssUniformNodesKey, azcache.CacheReadTypeForceRefresh) if err != nil { return ManagedByUnknownVMSet, err diff --git a/pkg/provider/azure_vmss_repo.go b/pkg/provider/azure_vmss_repo.go index 3b0697b1d1..b7caa998b4 100644 --- a/pkg/provider/azure_vmss_repo.go +++ b/pkg/provider/azure_vmss_repo.go @@ -20,32 +20,33 @@ import ( "strings" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6" - "k8s.io/klog/v2" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // CreateOrUpdateVMSS invokes az.ComputeClientFactory.GetVirtualMachineScaleSetClient().Update(). func (az *Cloud) CreateOrUpdateVMSS(resourceGroupName string, VMScaleSetName string, parameters armcompute.VirtualMachineScaleSet) error { ctx, cancel := getContextWithCancel() defer cancel() + logger := log.FromContextOrBackground(ctx).WithName("CreateOrUpdateVMSS") // When vmss is being deleted, CreateOrUpdate API would report "the vmss is being deleted" error. // Since it is being deleted, we shouldn't send more CreateOrUpdate requests for it. - klog.V(3).Infof("CreateOrUpdateVMSS: verify the status of the vmss being created or updated") + logger.V(3).Info("verify the status of the vmss being created or updated") vmss, err := az.ComputeClientFactory.GetVirtualMachineScaleSetClient().Get(ctx, resourceGroupName, VMScaleSetName, nil) if err != nil { - klog.Errorf("CreateOrUpdateVMSS: error getting vmss(%s): %v", VMScaleSetName, err) + logger.Error(err, "error getting vmss", "vmss", VMScaleSetName) return err } if vmss.Properties.ProvisioningState != nil && strings.EqualFold(*vmss.Properties.ProvisioningState, consts.ProvisionStateDeleting) { - klog.V(3).Infof("CreateOrUpdateVMSS: found vmss %s being deleted, skipping", VMScaleSetName) + logger.V(3).Info("found vmss being deleted, skipping", "vmss", VMScaleSetName) return nil } _, err = az.ComputeClientFactory.GetVirtualMachineScaleSetClient().CreateOrUpdate(ctx, resourceGroupName, VMScaleSetName, parameters) if err != nil { - klog.Errorf("CreateOrUpdateVMSS: error CreateOrUpdate vmss(%s): %v", VMScaleSetName, err) + logger.Error(err, "creating or updating vmss failed", "vmss", VMScaleSetName) return err } diff --git a/pkg/provider/azure_vmssflex.go b/pkg/provider/azure_vmssflex.go index ac73ab54d5..d1b868de1f 100644 --- a/pkg/provider/azure_vmssflex.go +++ b/pkg/provider/azure_vmssflex.go @@ -39,6 +39,7 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/metrics" "sigs.k8s.io/cloud-provider-azure/pkg/util/lockmap" vmutil "sigs.k8s.io/cloud-provider-azure/pkg/util/vm" @@ -62,7 +63,7 @@ type FlexScaleSet struct { // RefreshCaches invalidates and renew all related caches. func (fs *FlexScaleSet) RefreshCaches() error { - logger := klog.Background().WithName("fs.RefreshCaches") + logger := log.Background().WithName("fs.RefreshCaches") var err error fs.vmssFlexCache, err = fs.newVmssFlexCache() if err != nil { @@ -119,11 +120,12 @@ func (fs *FlexScaleSet) GetNodeVMSetName(ctx context.Context, node *v1.Node) (st // GetAgentPoolVMSetNames returns all vmSet names according to the nodes func (fs *FlexScaleSet) GetAgentPoolVMSetNames(ctx context.Context, nodes []*v1.Node) ([]*string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetAgentPoolVMSetNames") vmSetNames := make([]*string, 0) for _, node := range nodes { vmSetName, err := fs.GetNodeVMSetName(ctx, node) if err != nil { - klog.Errorf("Unable to get the vmss flex name by node name %s: %v", node.Name, err) + logger.Error(err, "Unable to get the vmss flex name by node name", "node", node.Name) continue } vmSetNames = append(vmSetNames, &vmSetName) @@ -137,6 +139,7 @@ func (fs *FlexScaleSet) GetAgentPoolVMSetNames(ctx context.Context, nodes []*v1. // for loadbalancer exists then returns the eligible VMSet. The mode selection // annotation would be ignored when using one SLB per cluster. func (fs *FlexScaleSet) GetVMSetNames(ctx context.Context, service *v1.Service, nodes []*v1.Node) ([]*string, error) { + logger := log.FromContextOrBackground(ctx).WithName("fs.GetVMSetNames") hasMode, isAuto, serviceVMSetName := fs.getServiceLoadBalancerMode(service) if !hasMode || fs.UseStandardLoadBalancer() { // no mode specified in service annotation or use single SLB mode @@ -147,7 +150,7 @@ func (fs *FlexScaleSet) GetVMSetNames(ctx context.Context, service *v1.Service, vmssFlexNames, err := fs.GetAgentPoolVMSetNames(ctx, nodes) if err != nil { - klog.Errorf("fs.GetVMSetNames - GetAgentPoolVMSetNames failed err=(%v)", err) + logger.Error(err, "GetAgentPoolVMSetNames failed") return nil, err } @@ -161,8 +164,9 @@ func (fs *FlexScaleSet) GetVMSetNames(ctx context.Context, service *v1.Service, } } if !found { - klog.Errorf("fs.GetVMSetNames - scale set (%s) in service annotation not found", serviceVMSetName) - return nil, fmt.Errorf("scale set (%s) - not found", serviceVMSetName) + err = fmt.Errorf("scale set (%s) - not found", serviceVMSetName) + logger.Error(err, "scale set in service annotation not found", "scaleSet", serviceVMSetName) + return nil, err } return to.SliceOfPtrs(serviceVMSetName), nil } @@ -192,6 +196,7 @@ func (fs *FlexScaleSet) GetNodeNameByProviderID(ctx context.Context, providerID // It must return ("", cloudprovider.InstanceNotFound) if the instance does // not exist or is no longer running. func (fs *FlexScaleSet) GetInstanceIDByNodeName(ctx context.Context, name string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetInstanceIDByNodeName") machine, err := fs.getVmssFlexVM(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { return "", err @@ -202,7 +207,7 @@ func (fs *FlexScaleSet) GetInstanceIDByNodeName(ctx context.Context, name string resourceID := *machine.ID convertedResourceID, err := ConvertResourceGroupNameToLower(resourceID) if err != nil { - klog.Errorf("ConvertResourceGroupNameToLower failed with error: %v", err) + logger.Error(err, "ConvertResourceGroupNameToLower failed") return "", err } return convertedResourceID, nil @@ -210,9 +215,10 @@ func (fs *FlexScaleSet) GetInstanceIDByNodeName(ctx context.Context, name string // GetInstanceTypeByNodeName gets the instance type by node name. func (fs *FlexScaleSet) GetInstanceTypeByNodeName(ctx context.Context, name string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetInstanceTypeByNodeName") machine, err := fs.getVmssFlexVM(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("fs.GetInstanceTypeByNodeName(%s) failed: fs.getVmssFlexVMWithoutInstanceView(%s) err=%v", name, name, err) + logger.Error(err, "fs.getVmssFlexVM failed", "node", name) return "", err } @@ -226,9 +232,10 @@ func (fs *FlexScaleSet) GetInstanceTypeByNodeName(ctx context.Context, name stri // with availability zone, then it returns fault domain. // for details, refer to https://kubernetes-sigs.github.io/cloud-provider-azure/topics/availability-zones/#node-labels func (fs *FlexScaleSet) GetZoneByNodeName(ctx context.Context, name string) (cloudprovider.Zone, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetZoneByNodeName") vm, err := fs.getVmssFlexVM(ctx, name, azcache.CacheReadTypeUnsafe) if err != nil { - klog.Errorf("fs.GetZoneByNodeName(%s) failed: fs.getVmssFlexVMWithoutInstanceView(%s) err=%v", name, name, err) + logger.Error(err, "fs.getVmssFlexVM failed", "node", name) return cloudprovider.Zone{}, err } @@ -247,7 +254,7 @@ func (fs *FlexScaleSet) GetZoneByNodeName(ctx context.Context, name string) (clo failureDomain = strconv.Itoa(int(ptr.Deref(vm.Properties.InstanceView.PlatformFaultDomain, 0))) } else { err = fmt.Errorf("failed to get zone info") - klog.Errorf("GetZoneByNodeName: got unexpected error %v", err) + logger.Error(err, "got unexpected error") return cloudprovider.Zone{}, err } @@ -274,6 +281,7 @@ func (fs *FlexScaleSet) GetProvisioningStateByNodeName(ctx context.Context, name // GetPowerStatusByNodeName returns the powerState for the specified node. func (fs *FlexScaleSet) GetPowerStatusByNodeName(ctx context.Context, name string) (powerState string, err error) { + logger := log.FromContextOrBackground(ctx).WithName("fs.GetPowerStatusByNodeName") vm, err := fs.getVmssFlexVM(ctx, name, azcache.CacheReadTypeDefault) if err != nil { return powerState, err @@ -284,15 +292,16 @@ func (fs *FlexScaleSet) GetPowerStatusByNodeName(ctx context.Context, name strin } // vm.Properties.InstanceView or vm.Properties.InstanceView.Statuses are nil when the VM is under deleting. - klog.V(3).Infof("InstanceView for node %q is nil, assuming it's deleting", name) + logger.V(3).Info("InstanceView for node is nil, assuming it's deleting", "node", name) return consts.VMPowerStateUnknown, nil } // GetPrimaryInterface gets machine primary network interface by node name. func (fs *FlexScaleSet) GetPrimaryInterface(ctx context.Context, nodeName string) (*armnetwork.Interface, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetPrimaryInterface") machine, err := fs.getVmssFlexVM(ctx, nodeName, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("fs.GetInstanceTypeByNodeName(%s) failed: fs.getVmssFlexVMWithoutInstanceView(%s) err=%v", nodeName, nodeName, err) + logger.Error(err, "fs.getVmssFlexVMWithoutInstanceView failed", "node", nodeName) return nil, err } @@ -320,6 +329,7 @@ func (fs *FlexScaleSet) GetPrimaryInterface(ctx context.Context, nodeName string // GetIPByNodeName gets machine private IP and public IP by node name. func (fs *FlexScaleSet) GetIPByNodeName(ctx context.Context, name string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetIPByNodeName") nic, err := fs.GetPrimaryInterface(ctx, name) if err != nil { return "", "", err @@ -327,7 +337,7 @@ func (fs *FlexScaleSet) GetIPByNodeName(ctx context.Context, name string) (strin ipConfig, err := getPrimaryIPConfig(nic) if err != nil { - klog.Errorf("fs.GetIPByNodeName(%s) failed: getPrimaryIPConfig(%v), err=%v", name, nic, err) + logger.Error(err, "getPrimaryIPConfig failed", "node", name, "nic", nic) return "", "", err } @@ -376,9 +386,10 @@ func (fs *FlexScaleSet) GetPrivateIPsByNodeName(ctx context.Context, name string // GetNodeNameByIPConfigurationID gets the nodeName and vmSetName by IP configuration ID. func (fs *FlexScaleSet) GetNodeNameByIPConfigurationID(ctx context.Context, ipConfigurationID string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeNameByIPConfigurationID") nodeName, vmssFlexName, _, err := fs.getNodeInformationByIPConfigurationID(ctx, ipConfigurationID) if err != nil { - klog.Errorf("fs.GetNodeNameByIPConfigurationID(%s) failed. Error: %v", ipConfigurationID, err) + logger.Error(err, "fs.GetNodeNameByIPConfigurationID failed", "ipConfigurationID", ipConfigurationID) return "", "", err } @@ -386,6 +397,7 @@ func (fs *FlexScaleSet) GetNodeNameByIPConfigurationID(ctx context.Context, ipCo } func (fs *FlexScaleSet) getNodeInformationByIPConfigurationID(ctx context.Context, ipConfigurationID string) (string, string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getNodeInformationByIPConfigurationID") nicResourceGroup, nicName, err := getResourceGroupAndNameFromNICID(ipConfigurationID) if err != nil { return "", "", "", fmt.Errorf("failed to get resource group and name from ip config ID %s: %w", ipConfigurationID, err) @@ -404,7 +416,7 @@ func (fs *FlexScaleSet) getNodeInformationByIPConfigurationID(ctx context.Contex vmssFlexName, err := fs.getNodeVmssFlexName(ctx, nodeName) if err != nil { - klog.Errorf("Unable to get the vmss flex name by node name %s: %v", vmName, err) + logger.Error(err, "Unable to get the vmss flex name by node name", "vmName", vmName) return "", "", "", err } @@ -413,9 +425,10 @@ func (fs *FlexScaleSet) getNodeInformationByIPConfigurationID(ctx context.Contex // GetNodeCIDRMaskByProviderID returns the node CIDR subnet mask by provider ID. func (fs *FlexScaleSet) GetNodeCIDRMasksByProviderID(ctx context.Context, providerID string) (int, int, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetNodeCIDRMasksByProviderID") nodeNameWrapper, err := fs.GetNodeNameByProviderID(ctx, providerID) if err != nil { - klog.Errorf("Unable to get the vmss flex vm node name by providerID %s: %v", providerID, err) + logger.Error(err, "Unable to get the vmss flex vm node name by providerID", "providerID", providerID) return 0, 0, err } nodeName := mapNodeNameToVMName(nodeNameWrapper) @@ -432,13 +445,13 @@ func (fs *FlexScaleSet) GetNodeCIDRMasksByProviderID(ctx context.Context, provid if v4, ok := vmssFlex.Tags[consts.VMSetCIDRIPV4TagKey]; ok && v4 != nil { ipv4Mask, err = strconv.Atoi(ptr.Deref(v4, "")) if err != nil { - klog.Errorf("GetNodeCIDRMasksByProviderID: error when paring the value of the ipv4 mask size %s: %v", ptr.Deref(v4, ""), err) + logger.Error(err, "error when parsing the value of the ipv4 mask size", "value", ptr.Deref(v4, "")) } } if v6, ok := vmssFlex.Tags[consts.VMSetCIDRIPV6TagKey]; ok && v6 != nil { ipv6Mask, err = strconv.Atoi(ptr.Deref(v6, "")) if err != nil { - klog.Errorf("GetNodeCIDRMasksByProviderID: error when paring the value of the ipv6 mask size%s: %v", ptr.Deref(v6, ""), err) + logger.Error(err, "error when parsing the value of the ipv6 mask size", "value", ptr.Deref(v6, "")) } } @@ -448,11 +461,12 @@ func (fs *FlexScaleSet) GetNodeCIDRMasksByProviderID(ctx context.Context, provid // EnsureHostInPool ensures the given VM's Primary NIC's Primary IP Configuration is // participating in the specified LoadBalancer Backend Pool, which returns (resourceGroup, vmasName, instanceID, vmssVM, error). func (fs *FlexScaleSet) EnsureHostInPool(ctx context.Context, service *v1.Service, nodeName types.NodeName, backendPoolID string, vmSetNameOfLB string) (string, string, string, *armcompute.VirtualMachineScaleSetVM, error) { + logger := log.FromContextOrBackground(ctx).WithName("EnsureHostInPool") serviceName := getServiceName(service) name := mapNodeNameToVMName(nodeName) vmssFlexName, err := fs.getNodeVmssFlexName(ctx, name) if err != nil { - klog.Errorf("EnsureHostInPool: failed to get VMSS Flex Name %s: %v", name, err) + logger.Error(err, "failed to get VMSS Flex Name", "name", name) return "", "", "", nil, nil } @@ -466,13 +480,13 @@ func (fs *FlexScaleSet) EnsureHostInPool(ctx context.Context, service *v1.Servic return "", "", "", nil, fmt.Errorf("EnsureHostInPool: VMSS Flex does not support Basic Load Balancer") } if vmSetNameOfLB != "" && needCheck && !strings.EqualFold(vmSetNameOfLB, vmssFlexName) { - klog.V(3).Infof("EnsureHostInPool skips node %s because it is not in the ScaleSet %s", name, vmSetNameOfLB) + logger.V(3).Info("skips node because it is not in the ScaleSet", "node", name, "ScaleSet", vmSetNameOfLB) return "", "", "", nil, errNotInVMSet } nic, err := fs.GetPrimaryInterface(ctx, name) if err != nil { - klog.Errorf("error: fs.EnsureHostInPool(%s), s.GetPrimaryInterface(%s), vmSetNameOfLB: %s, err=%v", name, name, vmSetNameOfLB, err) + logger.Error(err, "fs.GetPrimaryInterface failed", "node", name, "vmSetNameOfLB", vmSetNameOfLB) return "", "", "", nil, err } @@ -527,7 +541,7 @@ func (fs *FlexScaleSet) EnsureHostInPool(ctx context.Context, service *v1.Servic return "", "", "", nil, err } if !isSameLB { - klog.V(4).Infof("Node %q has already been added to LB %q, omit adding it to a new one", nodeName, oldLBName) + logger.V(4).Info("Node has already been added to LB, omit adding it to a new one", "node", nodeName, "LB", oldLBName) return "", "", "", nil, nil } } @@ -540,7 +554,7 @@ func (fs *FlexScaleSet) EnsureHostInPool(ctx context.Context, service *v1.Servic primaryIPConfig.Properties.LoadBalancerBackendAddressPools = newBackendPools nicName := *nic.Name - klog.V(3).Infof("nicupdate(%s): nic(%s) - updating", serviceName, nicName) + logger.V(3).Info("updating", "nicupdate", serviceName, "nic", nicName) err = fs.CreateOrUpdateInterface(ctx, service, nic) if err != nil { return "", "", "", nil, err @@ -556,7 +570,8 @@ func (fs *FlexScaleSet) EnsureHostInPool(ctx context.Context, service *v1.Servic } func (fs *FlexScaleSet) ensureVMSSFlexInPool(ctx context.Context, _ *v1.Service, nodes []*v1.Node, backendPoolID string, vmSetNameOfLB string) error { - klog.V(2).Infof("ensureVMSSFlexInPool: ensuring VMSS Flex with backendPoolID %s", backendPoolID) + logger := log.FromContextOrBackground(ctx).WithName("ensureVMSSFlexInPool") + logger.V(2).Info("ensuring VMSS Flex with backendPoolID", "backendPoolID", backendPoolID) vmssFlexIDsMap := make(map[string]bool) if !fs.UseStandardLoadBalancer() { @@ -573,23 +588,23 @@ func (fs *FlexScaleSet) ensureVMSSFlexInPool(ctx context.Context, _ *v1.Service, shouldExcludeLoadBalancer, err := fs.ShouldNodeExcludedFromLoadBalancer(node.Name) if err != nil { - klog.Errorf("ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", node.Name, err) + logger.Error(err, "ShouldNodeExcludedFromLoadBalancer failed", "node", node.Name) return err } if shouldExcludeLoadBalancer { - klog.V(4).Infof("Excluding unmanaged/external-resource-group node %q", node.Name) + logger.V(4).Info("Excluding unmanaged/external-resource-group node", "node", node.Name) continue } // in this scenario the vmSetName is an empty string and the name of vmss should be obtained from the provider IDs of nodes vmssFlexID, err := fs.getNodeVmssFlexID(ctx, node.Name) if err != nil { - klog.Errorf("ensureVMSSFlexInPool: failed to get VMSS Flex ID of node: %s, will skip checking and continue", node.Name) + logger.Error(err, "failed to get VMSS Flex ID of node, will skip checking and continue", "node", node.Name) continue } resourceGroupName, err := fs.GetNodeResourceGroup(node.Name) if err != nil { - klog.Errorf("ensureVMSSFlexInPool: failed to get resource group of node: %s, will skip checking and continue", node.Name) + logger.Error(err, "failed to get resource group of node, will skip checking and continue", "node", node.Name) continue } @@ -601,13 +616,13 @@ func (fs *FlexScaleSet) ensureVMSSFlexInPool(ctx context.Context, _ *v1.Service, } else { vmssFlexID, err := fs.getVmssFlexIDByName(ctx, vmSetNameOfLB) if err != nil { - klog.Errorf("ensureVMSSFlexInPool: failed to get VMSS Flex ID of vmSet: %s", vmSetNameOfLB) + logger.Error(err, "failed to get VMSS Flex ID of vmSet", "vmSet", vmSetNameOfLB) return err } vmssFlexIDsMap[vmssFlexID] = true } - klog.V(2).Infof("ensureVMSSFlexInPool begins to update VMSS list %v with backendPoolID %s", vmssFlexIDsMap, backendPoolID) + logger.V(2).Info("begins to update VMSS list with backendPoolID", "VMSS list", vmssFlexIDsMap, "backendPoolID", backendPoolID) for vmssFlexID := range vmssFlexIDsMap { vmssFlex, err := fs.getVmssFlexByVmssFlexID(ctx, vmssFlexID, azcache.CacheReadTypeDefault) if err != nil { @@ -618,12 +633,12 @@ func (fs *FlexScaleSet) ensureVMSSFlexInPool(ctx context.Context, _ *v1.Service, // When vmss is being deleted, CreateOrUpdate API would report "the vmss is being deleted" error. // Since it is being deleted, we shouldn't send more CreateOrUpdate requests for it. if vmssFlex.Properties.ProvisioningState != nil && strings.EqualFold(*vmssFlex.Properties.ProvisioningState, consts.ProvisionStateDeleting) { - klog.V(3).Infof("ensureVMSSFlexInPool: found vmss %s being deleted, skipping", vmssFlexID) + logger.V(3).Info("found vmss being deleted, skipping", "vmss", vmssFlexID) continue } if vmssFlex.Properties.VirtualMachineProfile == nil || vmssFlex.Properties.VirtualMachineProfile.NetworkProfile == nil || vmssFlex.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations == nil { - klog.V(4).Infof("ensureVMSSFlexInPool: cannot obtain the primary network interface configuration of vmss %s, just skip it as it might not have default vm profile", vmssFlexID) + logger.V(4).Info("cannot obtain the primary network interface configuration of vmss, just skip it as it might not have default vm profile", "vmss", vmssFlexID) continue } vmssNIC := vmssFlex.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations @@ -668,7 +683,7 @@ func (fs *FlexScaleSet) ensureVMSSFlexInPool(ctx context.Context, _ *v1.Service, return err } if !isSameLB { - klog.V(4).Infof("VMSS %q has already been added to LB %q, omit adding it to a new one", vmssFlexID, oldLBName) + logger.V(4).Info("VMSS has already been added to LB, omit adding it to a new one", "vmss", vmssFlexID, "LB", oldLBName) return nil } } @@ -695,10 +710,10 @@ func (fs *FlexScaleSet) ensureVMSSFlexInPool(ctx context.Context, _ *v1.Service, _ = fs.vmssFlexCache.Delete(consts.VmssFlexKey) }() - klog.V(2).Infof("ensureVMSSFlexInPool begins to add vmss(%s) with new backendPoolID %s", vmssFlexName, backendPoolID) + logger.V(2).Info("begins to add vmss with new backendPoolID", "vmss", vmssFlexName, "backendPoolID", backendPoolID) rerr := fs.CreateOrUpdateVMSS(fs.ResourceGroup, vmssFlexName, newVMSS) if rerr != nil { - klog.Errorf("ensureVMSSFlexInPool CreateOrUpdateVMSS(%s) with new backendPoolID %s, err: %v", vmssFlexName, backendPoolID, err) + logger.Error(rerr, "CreateOrUpdateVMSS with new backendPoolID", "vmss", vmssFlexName, "backendPoolID", backendPoolID) return rerr } } @@ -708,6 +723,7 @@ func (fs *FlexScaleSet) ensureVMSSFlexInPool(ctx context.Context, _ *v1.Service, // EnsureHostsInPool ensures the given Node's primary IP configurations are // participating in the specified LoadBalancer Backend Pool. func (fs *FlexScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Service, nodes []*v1.Node, backendPoolID string, vmSetNameOfLB string) error { + logger := log.FromContextOrBackground(ctx).WithName("EnsureHostsInPool") mc := metrics.NewMetricContext("services", "vmssflex_ensure_hosts_in_pool", fs.ResourceGroup, fs.SubscriptionID, getServiceName(service)) isOperationSucceeded := false defer func() { @@ -723,17 +739,17 @@ func (fs *FlexScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Servi for _, node := range nodes { localNodeName := node.Name if fs.UseStandardLoadBalancer() && fs.ExcludeMasterNodesFromStandardLB() && isControlPlaneNode(node) { - klog.V(4).Infof("Excluding master node %q from load balancer backendpool %q", localNodeName, backendPoolID) + logger.V(4).Info("Excluding master node from load balancer backendpool", "node", localNodeName, "backendPoolID", backendPoolID) continue } shouldExcludeLoadBalancer, err := fs.ShouldNodeExcludedFromLoadBalancer(localNodeName) if err != nil { - klog.Errorf("ShouldNodeExcludedFromLoadBalancer(%s) failed with error: %v", localNodeName, err) + logger.Error(err, "ShouldNodeExcludedFromLoadBalancer failed", "node", localNodeName) return err } if shouldExcludeLoadBalancer { - klog.V(4).Infof("Excluding unmanaged/external-resource-group node %q", localNodeName) + logger.V(4).Info("Excluding unmanaged/external-resource-group node", "node", localNodeName) continue } @@ -757,11 +773,12 @@ func (fs *FlexScaleSet) EnsureHostsInPool(ctx context.Context, service *v1.Servi } func (fs *FlexScaleSet) ensureBackendPoolDeletedFromVmssFlex(ctx context.Context, backendPoolIDs []string, vmSetName string) error { + logger := log.FromContextOrBackground(ctx).WithName("ensureBackendPoolDeletedFromVmssFlex") vmssNamesMap := make(map[string]bool) if fs.UseStandardLoadBalancer() { cached, err := fs.vmssFlexCache.Get(ctx, consts.VmssFlexKey, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("ensureBackendPoolDeletedFromVmssFlex: failed to get vmss flex from cache: %v", err) + logger.Error(err, "failed to get vmss flex from cache") return err } vmssFlexes := cached.(*sync.Map) @@ -778,13 +795,14 @@ func (fs *FlexScaleSet) ensureBackendPoolDeletedFromVmssFlex(ctx context.Context // EnsureBackendPoolDeletedFromVMSets ensures the loadBalancer backendAddressPools deleted from the specified VMSS Flex func (fs *FlexScaleSet) EnsureBackendPoolDeletedFromVMSets(ctx context.Context, vmssNamesMap map[string]bool, backendPoolIDs []string) error { + logger := log.FromContextOrBackground(ctx).WithName("fs.EnsureBackendPoolDeletedFromVMSets") vmssUpdaters := make([]func() error, 0, len(vmssNamesMap)) errors := make([]error, 0, len(vmssNamesMap)) for vmssName := range vmssNamesMap { vmssName := vmssName vmss, err := fs.getVmssFlexByName(ctx, vmssName) if err != nil { - klog.Errorf("fs.EnsureBackendPoolDeletedFromVMSets: failed to get VMSS %s: %v", vmssName, err) + logger.Error(err, "failed to get VMSS", "vmss", vmssName) errors = append(errors, err) continue } @@ -792,17 +810,17 @@ func (fs *FlexScaleSet) EnsureBackendPoolDeletedFromVMSets(ctx context.Context, // When vmss is being deleted, CreateOrUpdate API would report "the vmss is being deleted" error. // Since it is being deleted, we shouldn't send more CreateOrUpdate requests for it. if vmss.Properties.ProvisioningState != nil && strings.EqualFold(*vmss.Properties.ProvisioningState, consts.ProvisionStateDeleting) { - klog.V(3).Infof("fs.EnsureBackendPoolDeletedFromVMSets: found vmss %s being deleted, skipping", vmssName) + logger.V(3).Info("found vmss being deleted, skipping", "vmss", vmssName) continue } if vmss.Properties.VirtualMachineProfile == nil || vmss.Properties.VirtualMachineProfile.NetworkProfile == nil || vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations == nil { - klog.V(4).Infof("fs.EnsureBackendPoolDeletedFromVMSets: cannot obtain the primary network interface configurations, of vmss %s", vmssName) + logger.V(4).Info("cannot obtain the primary network interface configurations, of vmss", "vmss", vmssName) continue } vmssNIC := vmss.Properties.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations primaryNIC, err := getPrimaryNetworkInterfaceConfiguration(vmssNIC, vmssName) if err != nil { - klog.Errorf("fs.EnsureBackendPoolDeletedFromVMSets: failed to get the primary network interface config of the VMSS %s: %v", vmssName, err) + logger.Error(err, "failed to get the primary network interface config of the VMSS", "vmss", vmssName) errors = append(errors, err) continue } @@ -839,10 +857,10 @@ func (fs *FlexScaleSet) EnsureBackendPoolDeletedFromVMSets(ctx context.Context, _ = fs.vmssFlexCache.Delete(consts.VmssFlexKey) }() - klog.V(2).Infof("fs.EnsureBackendPoolDeletedFromVMSets begins to delete backendPoolIDs %q from vmss(%s)", backendPoolIDs, vmssName) + logger.V(2).Info("begins to delete backendPoolIDs from vmss", "backendPoolIDs", backendPoolIDs, "vmss", vmssName) rerr := fs.CreateOrUpdateVMSS(fs.ResourceGroup, vmssName, newVMSS) if rerr != nil { - klog.Errorf("fs.EnsureBackendPoolDeletedFromVMSets CreateOrUpdateVMSS(%s) for backendPoolIDs %q, err: %v", vmssName, backendPoolIDs, rerr) + logger.Error(rerr, "CreateOrUpdateVMSS for backendPoolIDs", "vmss", vmssName, "backendPoolIDs", backendPoolIDs) return rerr } @@ -864,6 +882,7 @@ func (fs *FlexScaleSet) EnsureBackendPoolDeletedFromVMSets(ctx context.Context, // EnsureBackendPoolDeleted ensures the loadBalancer backendAddressPools deleted from the specified nodes. func (fs *FlexScaleSet) EnsureBackendPoolDeleted(ctx context.Context, service *v1.Service, backendPoolIDs []string, vmSetName string, backendAddressPools []*armnetwork.BackendAddressPool, deleteFromVMSet bool) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("EnsureBackendPoolDeleted") // Returns nil if backend address pools already deleted. if backendAddressPools == nil { return false, nil @@ -920,7 +939,7 @@ func (fs *FlexScaleSet) EnsureBackendPoolDeleted(ctx context.Context, service *v } } - klog.V(2).Infof("Ensure backendPoolIDs %q deleted from the VMSS.", backendPoolIDs) + logger.V(2).Info("Ensure backendPoolIDs deleted from the VMSS", "backendPoolIDs", backendPoolIDs) if deleteFromVMSet { err := fs.ensureBackendPoolDeletedFromVmssFlex(ctx, backendPoolIDs, vmSetName) if err != nil { @@ -928,10 +947,10 @@ func (fs *FlexScaleSet) EnsureBackendPoolDeleted(ctx context.Context, service *v } } - klog.V(2).Infof("Ensure backendPoolIDs %q deleted from the VMSS VMs.", backendPoolIDs) - klog.V(2).Infof("go into fs.ensureBackendPoolDeletedFromNode, vmssFlexVMNameMap: %s, size: %d", vmssFlexVMNameMap, len(vmssFlexVMNameMap)) + logger.V(2).Info("Ensure backendPoolIDs deleted from the VMSS VMs", "backendPoolIDs", backendPoolIDs) + logger.V(2).Info("go into fs.ensureBackendPoolDeletedFromNode", "vmssFlexVMNameMap", vmssFlexVMNameMap, "size", len(vmssFlexVMNameMap)) nicUpdated, err := fs.ensureBackendPoolDeletedFromNode(ctx, vmssFlexVMNameMap, backendPoolIDs) - klog.V(2).Infof("exit from fs.ensureBackendPoolDeletedFromNode") + logger.V(2).Info("exit from fs.ensureBackendPoolDeletedFromNode") if err != nil { allErrs = append(allErrs, err) } @@ -945,6 +964,7 @@ func (fs *FlexScaleSet) EnsureBackendPoolDeleted(ctx context.Context, service *v } func (fs *FlexScaleSet) ensureBackendPoolDeletedFromNode(ctx context.Context, vmssFlexVMNameMap map[string]string, backendPoolIDs []string) (bool, error) { + logger := log.FromContextOrBackground(ctx).WithName("ensureBackendPoolDeletedFromNode") nicUpdaters := make([]func() error, 0) allErrs := make([]error, 0) nics := map[string]*armnetwork.Interface{} // nicName -> nic @@ -993,18 +1013,18 @@ func (fs *FlexScaleSet) ensureBackendPoolDeletedFromNode(ctx context.Context, vm nic.Properties.IPConfigurations = newIPConfigs nicUpdaters = append(nicUpdaters, func() error { - klog.V(2).Infof("EnsureBackendPoolDeleted begins to CreateOrUpdate for NIC(%s, %s) with backendPoolIDs %q", fs.ResourceGroup, ptr.Deref(nic.Name, ""), backendPoolIDs) + logger.V(2).Info("begins to CreateOrUpdate for NIC with backendPoolIDs", "resourceGroup", fs.ResourceGroup, "nicName", ptr.Deref(nic.Name, ""), "backendPoolIDs", backendPoolIDs) _, rerr := fs.ComputeClientFactory.GetInterfaceClient().CreateOrUpdate(ctx, fs.ResourceGroup, ptr.Deref(nic.Name, ""), *nic) if rerr != nil { - klog.Errorf("EnsureBackendPoolDeleted CreateOrUpdate for NIC(%s, %s) failed with error %v", fs.ResourceGroup, ptr.Deref(nic.Name, ""), rerr.Error()) + logger.Error(rerr, "CreateOrUpdate NIC failed", "resourceGroup", fs.ResourceGroup, "nicName", ptr.Deref(nic.Name, "")) return rerr } nicUpdated.Store(true) - klog.V(2).Infof("EnsureBackendPoolDeleted done") + logger.V(2).Info("done") return nil }) } - klog.V(2).Infof("nicUpdaters size: %d", len(nicUpdaters)) + logger.V(2).Info("NIC updaters size", "nicUpdatersSize", len(nicUpdaters)) errs := utilerrors.AggregateGoroutines(nicUpdaters...) if errs != nil { allErrs = append(allErrs, utilerrors.Flatten(errs)) diff --git a/pkg/provider/azure_vmssflex_cache.go b/pkg/provider/azure_vmssflex_cache.go index 5ef02346e3..5fcb24cefd 100644 --- a/pkg/provider/azure_vmssflex_cache.go +++ b/pkg/provider/azure_vmssflex_cache.go @@ -32,11 +32,13 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" ) func (fs *FlexScaleSet) newVmssFlexCache() (azcache.Resource, error) { getter := func(ctx context.Context, _ string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newVmssFlexCache") localCache := &sync.Map{} allResourceGroups, err := fs.GetResourceGroups() @@ -51,7 +53,7 @@ func (fs *FlexScaleSet) newVmssFlexCache() (azcache.Resource, error) { klog.Warningf("Skip caching vmss for resource group %s due to error: %v", resourceGroup, rerr.Error()) continue } - klog.Errorf("VirtualMachineScaleSetsClient.List failed: %v", rerr) + logger.Error(rerr, "VirtualMachineScaleSetsClient.List failed") return nil, rerr } @@ -79,6 +81,7 @@ func (fs *FlexScaleSet) newVmssFlexCache() (azcache.Resource, error) { func (fs *FlexScaleSet) newVmssFlexVMCache() (azcache.Resource, error) { getter := func(ctx context.Context, key string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("newVmssFlexVMCache") localCache := &sync.Map{} armResource, err := arm.ParseResourceID("/" + key) if err != nil { @@ -86,7 +89,7 @@ func (fs *FlexScaleSet) newVmssFlexVMCache() (azcache.Resource, error) { } vms, rerr := fs.ComputeClientFactory.GetVirtualMachineClient().ListVmssFlexVMsWithOutInstanceView(ctx, armResource.ResourceGroupName, key) if rerr != nil { - klog.Errorf("List failed: %v", rerr) + logger.Error(rerr, "List failed") return nil, rerr } @@ -101,7 +104,7 @@ func (fs *FlexScaleSet) newVmssFlexVMCache() (azcache.Resource, error) { vms, rerr = fs.ComputeClientFactory.GetVirtualMachineClient().ListVmssFlexVMsWithOnlyInstanceView(ctx, armResource.ResourceGroupName, key) if rerr != nil { - klog.Errorf("ListVMInstanceView failed: %v", rerr) + logger.Error(rerr, "ListVMInstanceView failed") return nil, rerr } @@ -131,6 +134,7 @@ func (fs *FlexScaleSet) newVmssFlexVMCache() (azcache.Resource, error) { } func (fs *FlexScaleSet) getNodeNameByVMName(ctx context.Context, vmName string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getNodeNameByVMName") fs.lockMap.LockEntry(consts.GetNodeVmssFlexIDLockKey) defer fs.lockMap.UnlockEntry(consts.GetNodeVmssFlexIDLockKey) cachedNodeName, isCached := fs.vmssFlexVMNameToNodeName.Load(vmName) @@ -149,7 +153,7 @@ func (fs *FlexScaleSet) getNodeNameByVMName(ctx context.Context, vmName string) vmssFlexID := key.(string) _, err := fs.vmssFlexVMCache.Get(ctx, vmssFlexID, azcache.CacheReadTypeForceRefresh) if err != nil { - klog.Errorf("failed to refresh vmss flex VM cache for vmssFlexID %s", vmssFlexID) + logger.Error(err, "failed to refresh vmss flex VM cache", "vmssFlexID", vmssFlexID) } return true }) @@ -163,7 +167,7 @@ func (fs *FlexScaleSet) getNodeNameByVMName(ctx context.Context, vmName string) nodeName, err := getter(ctx, vmName, azcache.CacheReadTypeDefault) if errors.Is(err, cloudprovider.InstanceNotFound) { - klog.V(2).Infof("Could not find node (%s) in the existing cache. Forcely freshing the cache to check again...", nodeName) + logger.V(2).Info("Could not find node in the existing cache. Forcely freshing the cache to check again...", "node", nodeName) return getter(ctx, vmName, azcache.CacheReadTypeForceRefresh) } return nodeName, err @@ -171,6 +175,7 @@ func (fs *FlexScaleSet) getNodeNameByVMName(ctx context.Context, vmName string) } func (fs *FlexScaleSet) getNodeVmssFlexID(ctx context.Context, nodeName string) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getNodeVmssFlexID") fs.lockMap.LockEntry(consts.GetNodeVmssFlexIDLockKey) defer fs.lockMap.UnlockEntry(consts.GetNodeVmssFlexIDLockKey) cachedVmssFlexID, isCached := fs.vmssFlexVMNameToVmssID.Load(nodeName) @@ -208,7 +213,7 @@ func (fs *FlexScaleSet) getNodeVmssFlexID(ctx context.Context, nodeName string) for _, vmssID := range vmssFlexIDs { if _, err := fs.vmssFlexVMCache.Get(ctx, vmssID, azcache.CacheReadTypeForceRefresh); err != nil { - klog.Errorf("failed to refresh vmss flex VM cache for vmssFlexID %s", vmssID) + logger.Error(err, "failed to refresh vmss flex VM cache for vmssFlexID", "vmssFlexID", vmssID) } // if the vm is cached stop refreshing cachedVmssFlexID, isCached = fs.vmssFlexVMNameToVmssID.Load(nodeName) @@ -221,7 +226,7 @@ func (fs *FlexScaleSet) getNodeVmssFlexID(ctx context.Context, nodeName string) vmssFlexID, err := getter(ctx, nodeName, azcache.CacheReadTypeDefault) if errors.Is(err, cloudprovider.InstanceNotFound) { - klog.V(2).Infof("Could not find node (%s) in the existing cache. Forcely freshing the cache to check again...", nodeName) + logger.V(2).Info("Could not find node in the existing cache. Forcely freshing the cache to check again...", "node", nodeName) return getter(ctx, nodeName, azcache.CacheReadTypeForceRefresh) } return vmssFlexID, err @@ -229,6 +234,7 @@ func (fs *FlexScaleSet) getNodeVmssFlexID(ctx context.Context, nodeName string) } func (fs *FlexScaleSet) getVmssFlexVM(ctx context.Context, nodeName string, crt azcache.AzureCacheReadType) (vm *armcompute.VirtualMachine, err error) { + logger := log.FromContextOrBackground(ctx).WithName("getVmssFlexVM") vmssFlexID, err := fs.getNodeVmssFlexID(ctx, nodeName) if err != nil { return vm, err @@ -241,7 +247,7 @@ func (fs *FlexScaleSet) getVmssFlexVM(ctx context.Context, nodeName string, crt vmMap := cached.(*sync.Map) cachedVM, ok := vmMap.Load(nodeName) if !ok { - klog.V(2).Infof("did not find node (%s) in the existing cache, which means it is deleted...", nodeName) + logger.V(2).Info("did not find node in the existing cache, which means it is deleted...", "node", nodeName) return vm, cloudprovider.InstanceNotFound } @@ -249,6 +255,7 @@ func (fs *FlexScaleSet) getVmssFlexVM(ctx context.Context, nodeName string, crt } func (fs *FlexScaleSet) getVmssFlexByVmssFlexID(ctx context.Context, vmssFlexID string, crt azcache.AzureCacheReadType) (*armcompute.VirtualMachineScaleSet, error) { + logger := log.FromContextOrBackground(ctx).WithName("getVmssFlexByVmssFlexID") cached, err := fs.vmssFlexCache.Get(ctx, consts.VmssFlexKey, crt) if err != nil { return nil, err @@ -259,7 +266,7 @@ func (fs *FlexScaleSet) getVmssFlexByVmssFlexID(ctx context.Context, vmssFlexID return result, nil } - klog.V(2).Infof("Couldn't find VMSS Flex with ID %s, refreshing the cache", vmssFlexID) + logger.V(2).Info("Couldn't find VMSS Flex, refreshing the cache", "vmssFlexID", vmssFlexID) cached, err = fs.vmssFlexCache.Get(ctx, consts.VmssFlexKey, azcache.CacheReadTypeForceRefresh) if err != nil { return nil, err @@ -337,12 +344,13 @@ func (fs *FlexScaleSet) getVmssFlexByName(ctx context.Context, vmssFlexName stri } func (fs *FlexScaleSet) DeleteCacheForNode(ctx context.Context, nodeName string) error { + logger := log.FromContextOrBackground(ctx).WithName("DeleteCacheForNode") if fs.Config.DisableAPICallCache { return nil } vmssFlexID, err := fs.getNodeVmssFlexID(ctx, nodeName) if err != nil { - klog.Errorf("getNodeVmssFlexID(%s) failed with %v", nodeName, err) + logger.Error(err, "getNodeVmssFlexID failed with node", "node", nodeName) return err } @@ -350,12 +358,12 @@ func (fs *FlexScaleSet) DeleteCacheForNode(ctx context.Context, nodeName string) defer fs.lockMap.UnlockEntry(vmssFlexID) cached, err := fs.vmssFlexVMCache.Get(ctx, vmssFlexID, azcache.CacheReadTypeDefault) if err != nil { - klog.Errorf("vmssFlexVMCache.Get(%s, %s) failed with %v", vmssFlexID, nodeName, err) + logger.Error(err, "vmssFlexVMCache.Get failed", "vmssFlexID", vmssFlexID, "node", nodeName) return err } if cached == nil { err := fmt.Errorf("nil cache returned from %s", vmssFlexID) - klog.Errorf("DeleteCacheForNode(%s, %s) failed with %v", vmssFlexID, nodeName, err) + logger.Error(err, "DeleteCacheForNode failed", "vmssFlexID", vmssFlexID, "node", nodeName) return err } vmMap := cached.(*sync.Map) @@ -364,6 +372,6 @@ func (fs *FlexScaleSet) DeleteCacheForNode(ctx context.Context, nodeName string) fs.vmssFlexVMCache.Update(vmssFlexID, vmMap) fs.vmssFlexVMNameToVmssID.Delete(nodeName) - klog.V(2).Infof("DeleteCacheForNode(%s, %s) successfully", vmssFlexID, nodeName) + logger.V(2).Info("successfully", "vmssFlexID", vmssFlexID, "node", nodeName) return nil } diff --git a/pkg/provider/azure_zones.go b/pkg/provider/azure_zones.go index c9de849d70..0a1c2a046c 100644 --- a/pkg/provider/azure_zones.go +++ b/pkg/provider/azure_zones.go @@ -31,21 +31,24 @@ import ( azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) var _ cloudprovider.Zones = (*Cloud)(nil) func (az *Cloud) refreshZones(ctx context.Context, refreshFunc func(ctx context.Context) error) { - klog.V(2).Info("refreshZones: refreshing zones every 30 minutes.") + logger := log.FromContextOrBackground(ctx).WithName("refreshZones") + logger.V(2).Info("refreshing zones every 30 minutes") err := wait.PollUntilContextCancel(ctx, consts.ZoneFetchingInterval, false, func(ctx context.Context) (bool, error) { _ = refreshFunc(ctx) return false, nil }) - klog.V(2).Infof("refreshZones: refresh zones finished with error: %s", err.Error()) + logger.V(2).Error(err, "refreshZones: refresh zones finished with error") } func (az *Cloud) syncRegionZonesMap(ctx context.Context) error { - klog.V(2).Infof("syncRegionZonesMap: starting to fetch all available zones for the subscription %s", az.SubscriptionID) + logger := log.FromContextOrBackground(ctx).WithName("syncRegionZonesMap") + logger.V(2).Info("starting to fetch all available zones for the subscription", "subscriptionID", az.SubscriptionID) zones, err := az.zoneRepo.ListZones(ctx) if err != nil { return fmt.Errorf("list zones: %w", err) @@ -74,10 +77,11 @@ func (az *Cloud) updateRegionZonesMap(zones map[string][]string) { } func (az *Cloud) getRegionZonesBackoff(ctx context.Context, region string) ([]*string, error) { + logger := log.FromContextOrBackground(ctx).WithName("getRegionZonesBackoff") if az.IsStackCloud() { // Azure Stack does not support zone at the moment // https://docs.microsoft.com/en-us/azure-stack/user/azure-stack-network-differences?view=azs-2102 - klog.V(3).Infof("getRegionZonesMapWrapper: Azure Stack does not support Zones at the moment, skipping") + logger.V(3).Info("Azure Stack does not support Zones at the moment, skipping") return to.SliceOfPtrs(az.regionZonesMap[region]...), nil } @@ -88,7 +92,7 @@ func (az *Cloud) getRegionZonesBackoff(ctx context.Context, region string) ([]*s return to.SliceOfPtrs(az.regionZonesMap[region]...), nil } - klog.V(2).Infof("getRegionZonesMapWrapper: the region-zones map is not initialized successfully, retrying immediately") + logger.V(2).Info("the region-zones map is not initialized successfully, retrying immediately") var ( zones map[string][]string @@ -97,7 +101,7 @@ func (az *Cloud) getRegionZonesBackoff(ctx context.Context, region string) ([]*s err := wait.ExponentialBackoffWithContext(ctx, az.RequestBackoff(), func(ctx context.Context) (done bool, err error) { zones, innerErr = az.zoneRepo.ListZones(ctx) if innerErr != nil { - klog.ErrorS(err, "Failed to list zones") + logger.Error(innerErr, "Failed to list zones") return false, nil } @@ -144,6 +148,7 @@ func (az *Cloud) GetZoneID(zoneLabel string) string { // This interface will not be called if InstancesV2 is enabled. // If the node is not running with availability zones, then it will fall back to fault domain. func (az *Cloud) GetZone(ctx context.Context) (cloudprovider.Zone, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetZone") if az.UseInstanceMetadata { metadata, err := az.Metadata.GetMetadata(ctx, azcache.CacheReadTypeUnsafe) if err != nil { @@ -164,7 +169,7 @@ func (az *Cloud) GetZone(ctx context.Context) (cloudprovider.Zone, error) { } zone = az.makeZone(location, zoneID) } else { - klog.V(3).Infof("Availability zone is not enabled for the node, falling back to fault domain") + logger.V(3).Info("Availability zone is not enabled for the node, falling back to fault domain") zone = metadata.Compute.FaultDomain } @@ -190,13 +195,14 @@ func (az *Cloud) GetZone(ctx context.Context) (cloudprovider.Zone, error) { // DEPRECATED: Zones is deprecated in favor of retrieving zone/region information from InstancesV2. // This interface will not be called if InstancesV2 is enabled. func (az *Cloud) GetZoneByProviderID(ctx context.Context, providerID string) (cloudprovider.Zone, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetZoneByProviderID") if providerID == "" { return cloudprovider.Zone{}, errNodeNotInitialized } // Returns nil for unmanaged nodes because azure cloud provider couldn't fetch information for them. if az.IsNodeUnmanagedByProviderID(providerID) { - klog.V(2).Infof("GetZoneByProviderID: omitting unmanaged node %q", providerID) + logger.V(2).Info("omitting unmanaged node", "providerID", providerID) return cloudprovider.Zone{}, nil } @@ -214,13 +220,14 @@ func (az *Cloud) GetZoneByProviderID(ctx context.Context, providerID string) (cl // DEPRECATED: Zones is deprecated in favor of retrieving zone/region information from InstancesV2. // This interface will not be called if InstancesV2 is enabled. func (az *Cloud) GetZoneByNodeName(ctx context.Context, nodeName types.NodeName) (cloudprovider.Zone, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetZoneByNodeName") // Returns "" for unmanaged nodes because azure cloud provider couldn't fetch information for them. unmanaged, err := az.IsNodeUnmanaged(string(nodeName)) if err != nil { return cloudprovider.Zone{}, err } if unmanaged { - klog.V(2).Infof("GetZoneByNodeName: omitting unmanaged node %q", nodeName) + logger.V(2).Info("omitting unmanaged node", "node", nodeName) return cloudprovider.Zone{}, nil } diff --git a/pkg/provider/securitygroup/azure_securitygroup_repo.go b/pkg/provider/securitygroup/azure_securitygroup_repo.go index 0c602b8ee2..168a38baa0 100644 --- a/pkg/provider/securitygroup/azure_securitygroup_repo.go +++ b/pkg/provider/securitygroup/azure_securitygroup_repo.go @@ -34,6 +34,7 @@ import ( "sigs.k8s.io/cloud-provider-azure/pkg/azclient/securitygroupclient" azcache "sigs.k8s.io/cloud-provider-azure/pkg/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" "sigs.k8s.io/cloud-provider-azure/pkg/util/errutils" ) @@ -56,6 +57,7 @@ type securityGroupRepo struct { func NewSecurityGroupRepo(securityGroupResourceGroup string, securityGroupName string, nsgCacheTTLInSeconds int, disableAPICallCache bool, securityGroupClient securitygroupclient.Interface) (Repository, error) { getter := func(ctx context.Context, key string) (interface{}, error) { + logger := log.FromContextOrBackground(ctx).WithName("NewSecurityGroupRepo.getter") nsg, err := securityGroupClient.Get(ctx, securityGroupResourceGroup, key) exists, rerr := errutils.CheckResourceExistsFromAzcoreError(err) if rerr != nil { @@ -63,7 +65,7 @@ func NewSecurityGroupRepo(securityGroupResourceGroup string, securityGroupName s } if !exists { - klog.V(2).Infof("Security group %q not found", key) + logger.V(2).Info("Security group not found", "securityGroup", key) return nil, nil } @@ -75,7 +77,8 @@ func NewSecurityGroupRepo(securityGroupResourceGroup string, securityGroupName s } cache, err := azcache.NewTimedCache(time.Duration(nsgCacheTTLInSeconds)*time.Second, getter, disableAPICallCache) if err != nil { - klog.Errorf("Failed to create cache for security group %q: %v", securityGroupName, err) + logger := log.Background().WithName("NewSecurityGroupRepo") + logger.Error(err, "Failed to create cache for security group", "securityGroupName", securityGroupName) return nil, err } @@ -90,8 +93,9 @@ func NewSecurityGroupRepo(securityGroupResourceGroup string, securityGroupName s // CreateOrUpdateSecurityGroup invokes az.SecurityGroupsClient.CreateOrUpdate with exponential backoff retry func (az *securityGroupRepo) CreateOrUpdateSecurityGroup(ctx context.Context, sg *armnetwork.SecurityGroup) error { + logger := log.FromContextOrBackground(ctx).WithName("CreateOrUpdateSecurityGroup") _, rerr := az.securigyGroupClient.CreateOrUpdate(ctx, az.securityGroupResourceGroup, *sg.Name, *sg) - klog.V(10).Infof("SecurityGroupsClient.CreateOrUpdate(%s): end", *sg.Name) + logger.V(10).Info("SecurityGroupsClient.CreateOrUpdate: end", "securityGroupName", *sg.Name) if rerr == nil { // Invalidate the cache right after updating _ = az.nsgCache.Delete(*sg.Name) @@ -104,13 +108,13 @@ func (az *securityGroupRepo) CreateOrUpdateSecurityGroup(ctx context.Context, sg // Invalidate the cache because ETAG precondition mismatch. if respError.StatusCode == http.StatusPreconditionFailed { - klog.V(3).Infof("SecurityGroup cache for %s is cleanup because of http.StatusPreconditionFailed", *sg.Name) + logger.V(3).Info("SecurityGroup cache is cleanup because of http.StatusPreconditionFailed", "securityGroupName", *sg.Name) _ = az.nsgCache.Delete(*sg.Name) } // Invalidate the cache because another new operation has canceled the current request. if strings.Contains(strings.ToLower(respError.Error()), consts.OperationCanceledErrorMessage) { - klog.V(3).Infof("SecurityGroup cache for %s is cleanup because CreateOrUpdateSecurityGroup is canceled by another operation", *sg.Name) + logger.V(3).Info("SecurityGroup cache is cleanup because CreateOrUpdateSecurityGroup is canceled by another operation", "securityGroupName", *sg.Name) _ = az.nsgCache.Delete(*sg.Name) } } diff --git a/pkg/provider/storage/azure_storageaccount.go b/pkg/provider/storage/azure_storageaccount.go index bb83d70552..ea750da252 100644 --- a/pkg/provider/storage/azure_storageaccount.go +++ b/pkg/provider/storage/azure_storageaccount.go @@ -38,6 +38,7 @@ import ( "sigs.k8s.io/cloud-provider-azure/pkg/azclient/accountclient" "sigs.k8s.io/cloud-provider-azure/pkg/azclient/cache" "sigs.k8s.io/cloud-provider-azure/pkg/consts" + "sigs.k8s.io/cloud-provider-azure/pkg/log" azureconfig "sigs.k8s.io/cloud-provider-azure/pkg/provider/config" "sigs.k8s.io/cloud-provider-azure/pkg/provider/storage/fileservice" "sigs.k8s.io/cloud-provider-azure/pkg/provider/subnet" @@ -233,6 +234,7 @@ func parseServiceAccountToken(tokenStr string) (string, error) { } func (az *AccountRepo) getStorageAccountWithCache(ctx context.Context, subsID, resourceGroup, account string) (armstorage.Account, error) { + logger := log.FromContextOrBackground(ctx).WithName("getStorageAccountWithCache") if az.ComputeClientFactory == nil { return armstorage.Account{}, fmt.Errorf("ComputeClientFactory is nil") } @@ -245,7 +247,7 @@ func (az *AccountRepo) getStorageAccountWithCache(ctx context.Context, subsID, r return armstorage.Account{}, err } if cache != nil { - klog.V(2).Infof("Get storage account(%s) from cache", account) + logger.V(2).Info("Get storage account from cache", "account", account) return *cache, nil } @@ -296,6 +298,7 @@ func (az *AccountRepo) GetStorageAccesskeyFromServiceAccountToken(ctx context.Co // GetStorageAccesskey gets the storage account access key // getLatestAccountKey: get the latest account key per CreationTime if true, otherwise get the first account key func (az *AccountRepo) GetStorageAccesskey(ctx context.Context, accountClient accountclient.Interface, account, resourceGroup string, getLatestAccountKey bool) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetStorageAccesskey") result, err := accountClient.ListKeys(ctx, resourceGroup, account) if err != nil { return "", err @@ -323,12 +326,12 @@ func (az *AccountRepo) GetStorageAccesskey(ctx context.Context, accountClient ac if k.CreationTime != nil { creationTime = *k.CreationTime } - klog.V(2).Infof("got storage account key with creation time: %v", creationTime) + logger.V(2).Info("got storage account key with creation time", "creationTime", creationTime) } else { if k.CreationTime != nil && creationTime.Before(*k.CreationTime) { key = v creationTime = *k.CreationTime - klog.V(2).Infof("got storage account key with latest creation time: %v", creationTime) + logger.V(2).Info("got storage account key with latest creation time", "creationTime", creationTime) } } } @@ -342,6 +345,7 @@ func (az *AccountRepo) GetStorageAccesskey(ctx context.Context, accountClient ac // EnsureStorageAccount search storage account, create one storage account(with genAccountNamePrefix) if not found, return accountName, accountKey func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions *AccountOptions, genAccountNamePrefix string) (string, string, error) { + logger := log.FromContextOrBackground(ctx).WithName("EnsureStorageAccount") if accountOptions == nil { return "", "", fmt.Errorf("account options is nil") } @@ -382,7 +386,7 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions } if ptr.Deref(accountOptions.CreatePrivateEndpoint, false) { if accountOptions.StorageType == "" { - klog.V(2).Info("set StorageType as file when not specified") + logger.V(2).Info("set StorageType as file when not specified") accountOptions.StorageType = StorageTypeFile } @@ -421,7 +425,7 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions } if len(accounts) > 0 { - klog.V(4).Infof("found %d matching accounts", len(accounts)) + logger.V(4).Info("found matching accounts", "count", len(accounts)) index := 0 if accountOptions.PickRandomMatchingAccount { // randomly pick one matching account @@ -430,21 +434,21 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions return "", "", err } index = int(n.Int64()) - klog.V(4).Infof("randomly pick one matching account, index: %d, matching accounts: %s", index, accounts) + logger.V(4).Info("randomly pick one matching account", "index", index, "matching accounts", accounts) } accountName = accounts[index].Name createNewAccount = false if accountOptions.SourceAccountName != "" { - klog.V(4).Infof("source account name(%s) is provided, try to find a matching account with source account name", accountOptions.SourceAccountName) + logger.V(4).Info("source account name is provided, try to find a matching account with source account name", "sourceAccountName", accountOptions.SourceAccountName) for _, acct := range accounts { if acct.Name == accountOptions.SourceAccountName { - klog.V(2).Infof("found a matching account %s type %s location %s with source account name", acct.Name, acct.StorageType, acct.Location) + logger.V(2).Info("found a matching account with source account name", "account", acct.Name, "type", acct.StorageType, "location", acct.Location) accountName = acct.Name break } } } - klog.V(4).Infof("found a matching account %s with account index %d", accountName, index) + logger.V(4).Info("found a matching account", "account", accountName, "index", index) } } @@ -456,7 +460,7 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions if accountOptions.CreateAccount { // check whether account exists if _, err := az.GetStorageAccesskey(ctx, storageAccountClient, accountName, resourceGroup, accountOptions.GetLatestAccountKey); err != nil { - klog.V(2).Infof("get storage key for storage account %s returned with %v", accountName, err) + logger.V(2).Error(err, "get storage key for storage account returned with error", "account", accountName) createNewAccount = true } } @@ -512,7 +516,7 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions Action: to.Ptr(string(armstorage.DefaultActionAllow)), } virtualNetworkRules = append(virtualNetworkRules, vnetRule) - klog.V(4).Infof("subnetID(%s) has been set", subnetID) + logger.V(4).Info("subnetID has been set", "subnetID", subnetID) } if len(virtualNetworkRules) > 0 { networkRuleSet = &armstorage.NetworkRuleSet{ @@ -540,13 +544,18 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions var publicNetworkAccess *armstorage.PublicNetworkAccess if accountOptions.PublicNetworkAccess != "" { - klog.V(2).Infof("set PublicNetworkAccess(%s) on account(%s), subscription(%s), resource group(%s)", accountOptions.PublicNetworkAccess, accountName, subsID, resourceGroup) + logger.V(2).Info("set PublicNetworkAccess on account", "PublicNetworkAccess", accountOptions.PublicNetworkAccess, "account", accountName, "subscription", subsID, "resourceGroup", resourceGroup) access := armstorage.PublicNetworkAccess(accountOptions.PublicNetworkAccess) publicNetworkAccess = &access } - klog.V(2).Infof("azure - no matching account found, begin to create a new account %s in resource group %s, location: %s, accountType: %s, accountKind: %s, tags: %+v", - accountName, resourceGroup, location, accountType, kind, accountOptions.Tags) + logger.V(2).Info("azure - no matching account found, begin to create a new account", + "accountName", accountName, + "resourceGroup", resourceGroup, + "location", location, + "accountType", accountType, + "accountKind", kind, + "tags", accountOptions.Tags) cp := &armstorage.AccountCreateParameters{ SKU: &armstorage.SKU{Name: to.Ptr(armstorage.SKUName(accountType))}, @@ -567,15 +576,15 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions if *accountOptions.EnableLargeFileShare { state = armstorage.LargeFileSharesStateEnabled } - klog.V(2).Infof("enable LargeFileShare(%s) for storage account(%s)", state, accountName) + logger.V(2).Info("enable LargeFileShare for storage account", "LargeFileShare", state, "account", accountName) cp.Properties.LargeFileSharesState = to.Ptr(state) } if accountOptions.AllowBlobPublicAccess != nil { - klog.V(2).Infof("set AllowBlobPublicAccess(%v) for storage account(%s)", *accountOptions.AllowBlobPublicAccess, accountName) + logger.V(2).Info("set AllowBlobPublicAccess for storage account", "AllowBlobPublicAccess", *accountOptions.AllowBlobPublicAccess, "account", accountName) cp.Properties.AllowBlobPublicAccess = accountOptions.AllowBlobPublicAccess } if accountOptions.RequireInfrastructureEncryption != nil { - klog.V(2).Infof("set RequireInfrastructureEncryption(%v) for storage account(%s)", *accountOptions.RequireInfrastructureEncryption, accountName) + logger.V(2).Info("set RequireInfrastructureEncryption for storage account", "RequireInfrastructureEncryption", *accountOptions.RequireInfrastructureEncryption, "account", accountName) cp.Properties.Encryption = &armstorage.Encryption{ RequireInfrastructureEncryption: accountOptions.RequireInfrastructureEncryption, KeySource: to.Ptr(armstorage.KeySourceMicrosoftStorage), @@ -586,11 +595,11 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions } } if accountOptions.AllowSharedKeyAccess != nil { - klog.V(2).Infof("set Allow SharedKeyAccess (%v) for storage account (%s)", *accountOptions.AllowSharedKeyAccess, accountName) + logger.V(2).Info("set Allow SharedKeyAccess for storage account", "allowSharedKeyAccess", *accountOptions.AllowSharedKeyAccess, "account", accountName) cp.Properties.AllowSharedKeyAccess = accountOptions.AllowSharedKeyAccess } if accountOptions.KeyVaultURI != nil { - klog.V(2).Infof("set KeyVault(%v) for storage account(%s)", accountOptions.KeyVaultURI, accountName) + logger.V(2).Info("set KeyVault for storage account", "KeyVault", accountOptions.KeyVaultURI, "account", accountName) cp.Properties.Encryption = &armstorage.Encryption{ KeyVaultProperties: &armstorage.KeyVaultProperties{ KeyName: accountOptions.KeyName, @@ -661,12 +670,15 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions prop.FileServiceProperties.Cors = nil if accountOptions.DisableFileServiceDeleteRetentionPolicy != nil { enable := !*accountOptions.DisableFileServiceDeleteRetentionPolicy - klog.V(2).Infof("set ShareDeleteRetentionPolicy(%v) on account(%s), subscription(%s), resource group(%s)", - enable, accountName, subsID, resourceGroup) + logger.V(2).Info("set ShareDeleteRetentionPolicy on account", + "ShareDeleteRetentionPolicy", enable, + "account", accountName, + "subscription", subsID, + "resourceGroup", resourceGroup) prop.FileServiceProperties.ShareDeleteRetentionPolicy = &armstorage.DeleteRetentionPolicy{Enabled: &enable} } if accountOptions.IsMultichannelEnabled != nil { - klog.V(2).Infof("enable SMB Multichannel setting on account(%s), subscription(%s), resource group(%s)", accountName, subsID, resourceGroup) + logger.V(2).Info("enable SMB Multichannel setting on account", "account", accountName, "subscription", subsID, "resourceGroup", resourceGroup) enabled := *accountOptions.IsMultichannelEnabled prop.FileServiceProperties.ProtocolSettings = &armstorage.ProtocolSettings{Smb: &armstorage.SmbSetting{Multichannel: &armstorage.Multichannel{Enabled: &enabled}}} } @@ -677,7 +689,7 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions } if accountOptions.AccessTier != "" { - klog.V(2).Infof("set AccessTier(%s) on account(%s), subscription(%s), resource group(%s)", accountOptions.AccessTier, accountName, subsID, resourceGroup) + logger.V(2).Info("set AccessTier on account", "AccessTier", accountOptions.AccessTier, "account", accountName, "subscription", subsID, "resourceGroup", resourceGroup) cp.Properties.AccessTier = to.Ptr(armstorage.AccessTier(accountOptions.AccessTier)) } } @@ -723,20 +735,21 @@ func (az *AccountRepo) EnsureStorageAccount(ctx context.Context, accountOptions } func (az *AccountRepo) createPrivateEndpoint(ctx context.Context, accountName string, accountID *string, privateEndpointName, vnetResourceGroup, vnetName, subnetName, location string, storageType Type) error { - klog.V(2).Infof("Creating private endpoint(%s) for account (%s)", privateEndpointName, accountName) + logger := log.FromContextOrBackground(ctx).WithName("createPrivateEndpoint") + logger.V(2).Info("Creating private endpoint", "privateEndpointName", privateEndpointName, "account", accountName) subnet, err := az.subnetRepo.Get(ctx, vnetResourceGroup, vnetName, subnetName) if err != nil { return err } if subnet.Properties == nil { - klog.Errorf("Properties of (%s, %s) is nil", vnetName, subnetName) + logger.Error(nil, "Properties of subnet is nil", "vnetName", vnetName, "subnetName", subnetName) } else { // Disable the private endpoint network policies before creating private endpoint if subnet.Properties.PrivateEndpointNetworkPolicies == nil || *subnet.Properties.PrivateEndpointNetworkPolicies == armnetwork.VirtualNetworkPrivateEndpointNetworkPoliciesEnabled { subnet.Properties.PrivateEndpointNetworkPolicies = to.Ptr(armnetwork.VirtualNetworkPrivateEndpointNetworkPoliciesDisabled) } else { - klog.V(2).Infof("PrivateEndpointNetworkPolicies is already set to %s for subnet (%s, %s)", *subnet.Properties.PrivateEndpointNetworkPolicies, vnetName, subnetName) + logger.V(2).Info("PrivateEndpointNetworkPolicies is already set for subnet", "policies", *subnet.Properties.PrivateEndpointNetworkPolicies, "vnetName", vnetName, "subnetName", subnetName) } } @@ -772,7 +785,8 @@ func (az *AccountRepo) createPrivateEndpoint(ctx context.Context, accountName st } func (az *AccountRepo) createPrivateDNSZone(ctx context.Context, vnetResourceGroup, privateDNSZoneName string) error { - klog.V(2).Infof("Creating private dns zone(%s) in resourceGroup (%s)", privateDNSZoneName, vnetResourceGroup) + logger := log.FromContextOrBackground(ctx).WithName("createPrivateDNSZone") + logger.V(2).Info("Creating private DNS zone", "privateDNSZone", privateDNSZoneName, "ResourceGroup", vnetResourceGroup) location := LocationGlobal privateDNSZone := privatedns.PrivateZone{Location: &location} clientFactory := az.NetworkClientFactory @@ -784,7 +798,7 @@ func (az *AccountRepo) createPrivateDNSZone(ctx context.Context, vnetResourceGro if _, err := privatednsclient.CreateOrUpdate(ctx, vnetResourceGroup, privateDNSZoneName, privateDNSZone); err != nil { if strings.Contains(err.Error(), "exists already") { - klog.V(2).Infof("private dns zone(%s) in resourceGroup (%s) already exists", privateDNSZoneName, vnetResourceGroup) + logger.V(2).Info("private dns zone in resourceGroup already exists", "privateDNSZone", privateDNSZoneName, "ResourceGroup", vnetResourceGroup) return nil } return err @@ -793,7 +807,8 @@ func (az *AccountRepo) createPrivateDNSZone(ctx context.Context, vnetResourceGro } func (az *AccountRepo) createVNetLink(ctx context.Context, vNetLinkName, vnetResourceGroup, vnetName, privateDNSZoneName string) error { - klog.V(2).Infof("Creating virtual link for vnet(%s) and DNS Zone(%s) in resourceGroup(%s)", vNetLinkName, privateDNSZoneName, vnetResourceGroup) + logger := log.FromContextOrBackground(ctx).WithName("createVNetLink") + logger.V(2).Info("Creating virtual network link", "vNetLinkName", vNetLinkName, "privateDNSZone", privateDNSZoneName, "ResourceGroup", vnetResourceGroup) clientFactory := az.NetworkClientFactory if clientFactory == nil { // multi-tenant support @@ -814,7 +829,8 @@ func (az *AccountRepo) createVNetLink(ctx context.Context, vNetLinkName, vnetRes } func (az *AccountRepo) createPrivateDNSZoneGroup(ctx context.Context, dnsZoneGroupName, privateEndpointName, vnetResourceGroup, vnetName, privateDNSZoneName string) error { - klog.V(2).Infof("Creating private DNS zone group(%s) with privateEndpoint(%s), vNetName(%s), resourceGroup(%s)", dnsZoneGroupName, privateEndpointName, vnetName, vnetResourceGroup) + logger := log.FromContextOrBackground(ctx).WithName("createPrivateDNSZoneGroup") + logger.V(2).Info("Creating private DNS zone group", "dnsZoneGroup", dnsZoneGroupName, "privateEndpoint", privateEndpointName, "vnetName", vnetName, "ResourceGroup", vnetResourceGroup) privateDNSZoneGroup := &armnetwork.PrivateDNSZoneGroup{ Properties: &armnetwork.PrivateDNSZoneGroupPropertiesFormat{ PrivateDNSZoneConfigs: []*armnetwork.PrivateDNSZoneConfig{ @@ -838,6 +854,7 @@ func (az *AccountRepo) createPrivateDNSZoneGroup(ctx context.Context, dnsZoneGro // AddStorageAccountTags add tags to storage account func (az *AccountRepo) AddStorageAccountTags(ctx context.Context, subsID, resourceGroup, account string, tags map[string]*string) error { + logger := log.FromContextOrBackground(ctx).WithName("AddStorageAccountTags") // add lock to avoid concurrent update on the cache az.lockMap.LockEntry(account) defer az.lockMap.UnlockEntry(account) @@ -860,7 +877,7 @@ func (az *AccountRepo) AddStorageAccountTags(ctx context.Context, subsID, resour // only update when newTags is different from old tags _ = az.storageAccountCache.Delete(account) // clean cache updateParams := &armstorage.AccountUpdateParameters{Tags: newTags} - klog.V(2).Infof("add storage account(%s) with tags(%+v)", account, newTags) + logger.V(2).Info("Add storage account with tags", "account", account, "tags", newTags) accountClient, err := az.ComputeClientFactory.GetAccountClientForSub(subsID) if err != nil { return err @@ -873,6 +890,7 @@ func (az *AccountRepo) AddStorageAccountTags(ctx context.Context, subsID, resour // RemoveStorageAccountTag remove tag from storage account func (az *AccountRepo) RemoveStorageAccountTag(ctx context.Context, subsID, resourceGroup, account, key string) error { + logger := log.FromContextOrBackground(ctx).WithName("RemoveStorageAccountTag") // add lock to avoid concurrent update on the cache az.lockMap.LockEntry(account) defer az.lockMap.UnlockEntry(account) @@ -892,7 +910,7 @@ func (az *AccountRepo) RemoveStorageAccountTag(ctx context.Context, subsID, reso // only update when newTags is different from old tags _ = az.storageAccountCache.Delete(account) // clean cache updateParams := &armstorage.AccountUpdateParameters{Tags: result.Tags} - klog.V(2).Infof("remove tag(%s) from storage account(%s)", key, account) + logger.V(2).Info("Remove tag from storage account", "tag", key, "account", account) accountClient, err := az.ComputeClientFactory.GetAccountClientForSub(subsID) if err != nil { return err @@ -925,6 +943,7 @@ func isLocationEqual(account *armstorage.Account, accountOptions *AccountOptions } func AreVNetRulesEqual(account *armstorage.Account, accountOptions *AccountOptions) bool { + logger := log.Background().WithName("AreVNetRulesEqual") if len(accountOptions.VirtualNetworkResourceIDs) > 0 { if account.Properties == nil || account.Properties.NetworkRuleSet == nil || account.Properties.NetworkRuleSet.VirtualNetworkRules == nil { @@ -943,7 +962,7 @@ func AreVNetRulesEqual(account *armstorage.Account, accountOptions *AccountOptio return false } } - klog.V(2).Infof("found all vnet rules(%v) in account %s", accountOptions.VirtualNetworkResourceIDs, ptr.Deref(account.Name, "")) + logger.V(2).Info("found all vnet rules in account", "rules", accountOptions.VirtualNetworkResourceIDs, "account", ptr.Deref(account.Name, "")) } return true } @@ -959,10 +978,11 @@ func isLargeFileSharesPropertyEqual(account *armstorage.Account, accountOptions } func isTaggedWithSkip(account *armstorage.Account) bool { + logger := log.Background().WithName("isTaggedWithSkip") if account.Tags != nil { // skip account with SkipMatchingTag tag if _, ok := account.Tags[SkipMatchingTag]; ok { - klog.V(2).Infof("found %s tag for account %s, skip matching", SkipMatchingTag, ptr.Deref(account.Name, "")) + logger.V(2).Info("found tag for account, skip matching", "tag", SkipMatchingTag, "account", ptr.Deref(account.Name, "")) return false } } diff --git a/pkg/provider/storage/fileservice/fileservice_repo.go b/pkg/provider/storage/fileservice/fileservice_repo.go index 80f68ee1b3..0f84b084fa 100644 --- a/pkg/provider/storage/fileservice/fileservice_repo.go +++ b/pkg/provider/storage/fileservice/fileservice_repo.go @@ -23,10 +23,10 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage" - "k8s.io/klog/v2" "sigs.k8s.io/cloud-provider-azure/pkg/azclient" "sigs.k8s.io/cloud-provider-azure/pkg/azclient/cache" + "sigs.k8s.io/cloud-provider-azure/pkg/log" azureconfig "sigs.k8s.io/cloud-provider-azure/pkg/provider/config" ) @@ -52,6 +52,7 @@ func NewRepository(config azureconfig.Config, clientFactory azclient.ClientFacto }, nil } func (az *fileServicePropertiesRepo) Get(ctx context.Context, subsID, resourceGroup, account string) (*armstorage.FileServiceProperties, error) { + logger := log.FromContextOrBackground(ctx).WithName("Get") if az.clientFactory == nil { return nil, fmt.Errorf("clientFactory is nil") } @@ -65,7 +66,7 @@ func (az *fileServicePropertiesRepo) Get(ctx context.Context, subsID, resourceGr return nil, err } if cache != nil { - klog.V(2).Infof("Get service properties(%s) from cache", account) + logger.V(2).Info("Get service properties from cache", "account", account) return cache, nil } diff --git a/pkg/provider/storage/storage_account.go b/pkg/provider/storage/storage_account.go index 1a8d3dc231..773cbe3863 100644 --- a/pkg/provider/storage/storage_account.go +++ b/pkg/provider/storage/storage_account.go @@ -22,14 +22,14 @@ import ( "strings" "time" - "k8s.io/klog/v2" - "sigs.k8s.io/cloud-provider-azure/pkg/azclient/accountclient" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // GetStorageAccesskey gets the storage account access key // getLatestAccountKey: get the latest account key per CreationTime if true, otherwise get the first account key func GetStorageAccesskey(ctx context.Context, saClient accountclient.Interface, account, resourceGroup string, getLatestAccountKey bool) (string, error) { + logger := log.FromContextOrBackground(ctx).WithName("GetStorageAccesskey") if saClient == nil { return "", fmt.Errorf("StorageAccountClient is nil") } @@ -61,12 +61,12 @@ func GetStorageAccesskey(ctx context.Context, saClient accountclient.Interface, if k.CreationTime != nil { creationTime = *k.CreationTime } - klog.V(2).Infof("got storage account key with creation time: %v", creationTime) + logger.V(2).Info("got storage account key with creation time", "creationTime", creationTime) } else { if k.CreationTime != nil && creationTime.Before(*k.CreationTime) { key = v creationTime = *k.CreationTime - klog.V(2).Infof("got storage account key with latest creation time: %v", creationTime) + logger.V(2).Info("got storage account key with latest creation time", "creationTime", creationTime) } } } diff --git a/pkg/provider/subnet/subnet.go b/pkg/provider/subnet/subnet.go index 940e2342b9..b6656c1fd5 100644 --- a/pkg/provider/subnet/subnet.go +++ b/pkg/provider/subnet/subnet.go @@ -20,9 +20,9 @@ import ( "context" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6" - "k8s.io/klog/v2" "sigs.k8s.io/cloud-provider-azure/pkg/azclient/subnetclient" + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) type Repository interface { @@ -42,10 +42,11 @@ func NewRepo(subnetsClient subnetclient.Interface) (Repository, error) { // CreateOrUpdateSubnet invokes az.SubnetClient.CreateOrUpdate with exponential backoff retry func (az *repo) CreateOrUpdate(ctx context.Context, rg string, vnetName string, subnetName string, subnet armnetwork.Subnet) error { + logger := log.FromContextOrBackground(ctx).WithName("SubnetsClient.CreateOrUpdate") _, rerr := az.SubnetsClient.CreateOrUpdate(ctx, rg, vnetName, subnetName, subnet) - klog.V(10).Infof("SubnetsClient.CreateOrUpdate(%s): end", subnetName) + logger.V(10).Info("end", "subnetName", subnetName) if rerr != nil { - klog.Errorf("SubnetClient.CreateOrUpdate(%s) failed: %s", subnetName, rerr.Error()) + logger.Error(rerr, "SubnetClient.CreateOrUpdate failed", "subnetName", subnetName) return rerr } @@ -53,9 +54,10 @@ func (az *repo) CreateOrUpdate(ctx context.Context, rg string, vnetName string, } func (az *repo) Get(ctx context.Context, rg string, vnetName string, subnetName string) (*armnetwork.Subnet, error) { + logger := log.FromContextOrBackground(ctx).WithName("SubnetsClient.Get") subnet, err := az.SubnetsClient.Get(ctx, rg, vnetName, subnetName, nil) if err != nil { - klog.Errorf("SubnetClient.Get(%s) failed: %s", subnetName, err.Error()) + logger.Error(err, "SubnetClient.Get failed", "subnetName", subnetName) return nil, err } return subnet, nil diff --git a/pkg/util/controller/node/controller_utils.go b/pkg/util/controller/node/controller_utils.go index 6111010365..d2f3c8a277 100644 --- a/pkg/util/controller/node/controller_utils.go +++ b/pkg/util/controller/node/controller_utils.go @@ -23,7 +23,8 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" - "k8s.io/klog/v2" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // CreateAddNodeHandler creates an add node handler. @@ -51,18 +52,19 @@ func CreateUpdateNodeHandler(f func(oldNode, newNode *v1.Node) error) func(oldOb // CreateDeleteNodeHandler creates a delete node handler. (Common to lifecycle and ipam) func CreateDeleteNodeHandler(f func(node *v1.Node) error) func(obj interface{}) { return func(originalObj interface{}) { + logger := log.Background().WithName("CreateDeleteNodeHandler") originalNode, isNode := originalObj.(*v1.Node) // We can get DeletedFinalStateUnknown instead of *v1.Node here and // we need to handle that correctly. #34692 if !isNode { deletedState, ok := originalObj.(cache.DeletedFinalStateUnknown) if !ok { - klog.Errorf("Received unexpected object: %v", originalObj) + logger.Error(nil, "Received unexpected object", "object", originalObj) return } originalNode, ok = deletedState.Obj.(*v1.Node) if !ok { - klog.Errorf("DeletedFinalStateUnknown contained non-Node object: %v", deletedState.Obj) + logger.Error(nil, "DeletedFinalStateUnknown contained non-Node object", "object", deletedState.Obj) return } } @@ -89,6 +91,7 @@ func GetNodeCondition(status *v1.NodeStatus, conditionType v1.NodeConditionType) // RecordNodeStatusChange records a event related to a node status change. (Common to lifecycle and ipam) func RecordNodeStatusChange(recorder record.EventRecorder, node *v1.Node, newStatus string) { + logger := log.Background().WithName("RecordNodeStatusChange") ref := &v1.ObjectReference{ APIVersion: "v1", Kind: "Node", @@ -96,7 +99,7 @@ func RecordNodeStatusChange(recorder record.EventRecorder, node *v1.Node, newSta UID: node.UID, Namespace: "", } - klog.V(2).Infof("Recording status change %s event message for node %s", newStatus, node.Name) + logger.V(2).Info("Recording status change event message for node", "status", newStatus, "node", node.Name) // TODO: This requires a transaction, either both node status is updated // and event is recorded or neither should happen, see issue #6055. recorder.Eventf(ref, v1.EventTypeNormal, newStatus, "Node %s status is now: %s", node.Name, newStatus) diff --git a/pkg/util/controller/testutil/test_utils.go b/pkg/util/controller/testutil/test_utils.go index a4f5162be6..e06a3f5f6c 100644 --- a/pkg/util/controller/testutil/test_utils.go +++ b/pkg/util/controller/testutil/test_utils.go @@ -38,11 +38,12 @@ import ( "k8s.io/client-go/kubernetes/scheme" v1core "k8s.io/client-go/kubernetes/typed/core/v1" ref "k8s.io/client-go/tools/reference" - "k8s.io/klog/v2" clocks "k8s.io/utils/clock" testingclocks "k8s.io/utils/clock/testing" jsonpatch "github.com/evanphx/json-patch" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) // FakeNodeHandler is a fake implementation of NodesInterface and NodeInterface. It @@ -266,7 +267,8 @@ func (m *FakeNodeHandler) Watch(_ context.Context, _ metav1.ListOptions) (watch. } // Patch patches a Node in the fake store. -func (m *FakeNodeHandler) Patch(_ context.Context, name string, pt types.PatchType, data []byte, _ metav1.PatchOptions, _ ...string) (*v1.Node, error) { +func (m *FakeNodeHandler) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, _ metav1.PatchOptions, _ ...string) (*v1.Node, error) { + logger := log.FromContextOrBackground(ctx).WithName("Patch") m.lock.Lock() defer func() { m.RequestCount++ @@ -296,12 +298,12 @@ func (m *FakeNodeHandler) Patch(_ context.Context, name string, pt types.PatchTy originalObjJS, err := json.Marshal(nodeCopy) if err != nil { - klog.Errorf("Failed to marshal %v", nodeCopy) + logger.Error(err, "Failed to marshal", "nodeCopy", nodeCopy) return nil, nil } var originalNode v1.Node if err = json.Unmarshal(originalObjJS, &originalNode); err != nil { - klog.Errorf("Failed to unmarshal original object: %v", err) + logger.Error(err, "Failed to unmarshal original object") return nil, nil } @@ -310,31 +312,31 @@ func (m *FakeNodeHandler) Patch(_ context.Context, name string, pt types.PatchTy case types.JSONPatchType: patchObj, err := jsonpatch.DecodePatch(data) if err != nil { - klog.Error(err.Error()) + logger.Error(err, "Failed to decode JSON patch") return nil, nil } if patchedObjJS, err = patchObj.Apply(originalObjJS); err != nil { - klog.Error(err.Error()) + logger.Error(err, "Failed to apply JSON patch") return nil, nil } case types.MergePatchType: if patchedObjJS, err = jsonpatch.MergePatch(originalObjJS, data); err != nil { - klog.Error(err.Error()) + logger.Error(err, "Failed to apply Merge patch") return nil, nil } case types.StrategicMergePatchType: if patchedObjJS, err = strategicpatch.StrategicMergePatch(originalObjJS, data, originalNode); err != nil { - klog.Error(err.Error()) + logger.Error(err, "Failed to apply Strategic Merge patch") return nil, nil } default: - klog.Errorf("unknown Content-Type header for patch: %v", pt) + logger.Error(nil, "unknown Content-Type header for patch", "patchType", pt) return nil, nil } var updatedNode v1.Node if err = json.Unmarshal(patchedObjJS, &updatedNode); err != nil { - klog.Errorf("Failed to unmarshal patched object: %v", err) + logger.Error(err, "Failed to unmarshal patched object") return nil, nil } @@ -371,11 +373,12 @@ func (f *FakeRecorder) AnnotatedEventf(obj runtime.Object, _ map[string]string, } func (f *FakeRecorder) generateEvent(obj runtime.Object, _ metav1.Time, eventtype, reason, message string) { + logger := log.Background().WithName("FakeRecorder.generateEvent") f.Lock() defer f.Unlock() ref, err := ref.GetReference(scheme.Scheme, obj) if err != nil { - klog.Errorf("Encountered error while getting reference: %v", err) + logger.Error(err, "Encountered error while getting reference") return } event := f.makeEvent(ref, eventtype, reason, message) diff --git a/pkg/util/node/node.go b/pkg/util/node/node.go index 714f1eb120..950f4e251d 100644 --- a/pkg/util/node/node.go +++ b/pkg/util/node/node.go @@ -26,7 +26,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" clientset "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) type nodeForCIDRMergePatch struct { @@ -66,6 +67,7 @@ func PatchNodeCIDR(c clientset.Interface, node types.NodeName, cidr string) erro // PatchNodeCIDRs patches the specified node.CIDR=cidrs[0] and node.CIDRs to the given value. func PatchNodeCIDRs(c clientset.Interface, node types.NodeName, cidrs []string) error { + logger := log.Background().WithName("PatchNodeCIDRs") // set the pod cidrs list and set the old pod cidr field patch := nodeForCIDRMergePatch{ Spec: nodeSpecForMergePatch{ @@ -78,7 +80,7 @@ func PatchNodeCIDRs(c clientset.Interface, node types.NodeName, cidrs []string) if err != nil { return fmt.Errorf("failed to json.Marshal CIDR: %w", err) } - klog.V(4).Infof("cidrs patch bytes for node %s are:%s", string(node), string(patchBytes)) + logger.V(4).Info("cidrs patch bytes for node", "node", string(node), "cidrsPatchBytes", string(patchBytes)) if _, err := c.CoreV1().Nodes().Patch(context.TODO(), string(node), types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{}); err != nil { return fmt.Errorf("failed to patch node CIDR: %w", err) } diff --git a/pkg/windows/service/service.go b/pkg/windows/service/service.go index 55a6dcfac3..27f0fa97c9 100644 --- a/pkg/windows/service/service.go +++ b/pkg/windows/service/service.go @@ -26,10 +26,11 @@ import ( "time" "k8s.io/apiserver/pkg/server" - "k8s.io/klog/v2" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" + + "sigs.k8s.io/cloud-provider-azure/pkg/log" ) type handler struct { @@ -41,6 +42,7 @@ type handler struct { // service. It returns an indication of whether it is running as a service; // and an error. func InitService(serviceName string) error { + logger := log.Background().WithName("InitService") h := &handler{ tosvc: make(chan bool), fromsvc: make(chan error), @@ -57,17 +59,18 @@ func InitService(serviceName string) error { if err != nil { return err } - klog.Infof("Running %s as a Windows service!", serviceName) + logger.Info("Running as a Windows service", "serviceName", serviceName) return nil } func (h *handler) Execute(_ []string, r <-chan svc.ChangeRequest, s chan<- svc.Status) (bool, uint32) { + logger := log.Background().WithName("Execute") s <- svc.Status{State: svc.StartPending, Accepts: 0} // Unblock initService() h.fromsvc <- nil s <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown | svc.Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE)} - klog.Infof("Service running") + logger.Info("Service running") Loop: for { select { @@ -80,7 +83,7 @@ Loop: case svc.Interrogate: s <- c.CurrentStatus case svc.Stop, svc.Shutdown: - klog.Infof("Service stopping") + logger.Info("Service stopping") // We need to translate this request into a signal that can be handled by the signal handler // handling shutdowns normally (currently apiserver/pkg/server/signal.go). // If we do not do this, our main threads won't be notified of the upcoming shutdown. diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 27e0e1fb3c..b5bb183d02 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -28,6 +28,7 @@ import ( "k8s.io/klog/v2" + "sigs.k8s.io/cloud-provider-azure/pkg/log" _ "sigs.k8s.io/cloud-provider-azure/tests/e2e/auth" _ "sigs.k8s.io/cloud-provider-azure/tests/e2e/autoscaling" _ "sigs.k8s.io/cloud-provider-azure/tests/e2e/network" @@ -47,6 +48,7 @@ const ( ) func TestAzureTest(t *testing.T) { + logger := log.Background().WithName("TestAzureTest") RegisterFailHandler(Fail) reportDir := os.Getenv(reportDirEnv) if reportDir == "" { @@ -59,7 +61,8 @@ func TestAzureTest(t *testing.T) { } if reportDir != "" { if err := os.MkdirAll(reportDir, 0755); err != nil { - klog.Fatalf("Failed creating report directory: %v", err) + logger.Error(err, "Failed creating report directory") + klog.FlushAndExit(klog.ExitFlushTimeout, 1) } } @@ -112,8 +115,8 @@ func TestAzureTest(t *testing.T) { return } - klog.Infof("Ingesting test result to kusto") + logger.Info("Ingesting test result to kusto") if err := utils.KustoIngest(passed, suiteConfig.LabelFilter, os.Getenv(utils.AKSClusterType), reporterConfig.JUnitReport); err != nil { - klog.Error(err) + logger.Error(err, "Failed to ingest test result to kusto") } } diff --git a/tests/e2e/utils/kustoIngest.go b/tests/e2e/utils/kustoIngest.go index ad40d47e13..e7e656edc1 100644 --- a/tests/e2e/utils/kustoIngest.go +++ b/tests/e2e/utils/kustoIngest.go @@ -26,8 +26,7 @@ import ( "github.com/Azure/azure-kusto-go/azkustodata" "github.com/Azure/azure-kusto-go/azkustoingest" - - "k8s.io/klog/v2" + logr "sigs.k8s.io/cloud-provider-azure/pkg/log" ) var ( @@ -67,6 +66,7 @@ func validate() error { // | Timestamp | TestScenario | ClusterType | BranchName | Passed | ErrorDetails | // | 2023-01-09T01:00:00Z | Feature:Autoscaling || !Serial && !Slow | autoscaling | release-1.26 | true | | func KustoIngest(passed bool, labelFilter, clusterType, junitReportPath string) error { + logger := logr.Background().WithName("KustoIngest") if err := validate(); err != nil { return err } @@ -101,7 +101,7 @@ func KustoIngest(passed bool, labelFilter, clusterType, junitReportPath string) if err := enc.Encode(data); err != nil { panic(fmt.Errorf("failed to json encode data: %w", err)) } - klog.Infof("ingested data: %s", data) + logger.Info("ingested data", "data", data) }() if _, err := in.FromReader(context.Background(), r); err != nil {