Skip to content

Commit 4165c83

Browse files
authored
Merge pull request #5507 from twz123/more-unique-controller-names
Use unique controller names for Autopilot
2 parents 9c30564 + 793f682 commit 4165c83

15 files changed

+100
-73
lines changed

pkg/autopilot/controller/plans/init.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ func RegisterControllers(ctx context.Context, logger *logrus.Entry, mgr crman.Ma
4646

4747
if leaderMode {
4848
if err := registerNewPlanStateController(logger, mgr, cmdProviders); err != nil {
49-
return fmt.Errorf("unable to register 'newplan' controller: %w", err)
49+
return fmt.Errorf("unable to register newplan controller: %w", err)
5050
}
5151

5252
if err := registerSchedulableWaitStateController(logger, mgr, cmdProviders); err != nil {
53-
return fmt.Errorf("unable to register 'schedulablewait' controller: %w", err)
53+
return fmt.Errorf("unable to register schedulablewait controller: %w", err)
5454
}
5555

5656
if err := registerSchedulableStateController(logger, mgr, cmdProviders); err != nil {
57-
return fmt.Errorf("unable to register 'schedulable' controller: %w", err)
57+
return fmt.Errorf("unable to register schedulable controller: %w", err)
5858
}
5959
}
6060

@@ -108,7 +108,7 @@ func registerSchedulableStateController(logger *logrus.Entry, mgr crman.Manager,
108108
// controller-runtime.
109109
func registerPlanStateController(name string, logger *logrus.Entry, mgr crman.Manager, eventFilter crpred.Predicate, handler appc.PlanStateHandler) error {
110110
return cr.NewControllerManagedBy(mgr).
111-
Named("planstate-" + name).
111+
Named("planstate_" + name).
112112
For(&apv1beta2.Plan{}).
113113
WithEventFilter(eventFilter).
114114
Complete(

pkg/autopilot/controller/root_controller.go

+22-18
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ import (
2525
apcli "github.com/k0sproject/k0s/pkg/autopilot/client"
2626
apconst "github.com/k0sproject/k0s/pkg/autopilot/constant"
2727
apdel "github.com/k0sproject/k0s/pkg/autopilot/controller/delegate"
28-
applan "github.com/k0sproject/k0s/pkg/autopilot/controller/plans"
28+
"github.com/k0sproject/k0s/pkg/autopilot/controller/plans"
2929
aproot "github.com/k0sproject/k0s/pkg/autopilot/controller/root"
30-
apsig "github.com/k0sproject/k0s/pkg/autopilot/controller/signal"
31-
apupdate "github.com/k0sproject/k0s/pkg/autopilot/controller/updates"
30+
"github.com/k0sproject/k0s/pkg/autopilot/controller/signal"
31+
"github.com/k0sproject/k0s/pkg/autopilot/controller/updates"
3232
"github.com/k0sproject/k0s/pkg/kubernetes"
3333

3434
"github.com/sirupsen/logrus"
@@ -60,6 +60,8 @@ type rootController struct {
6060
stopSubHandler subControllerStopFunc
6161
leaseWatcherCreator leaseWatcherCreatorFunc
6262
setupHandler setupFunc
63+
64+
initialized bool
6365
}
6466

6567
var _ aproot.Root = (*rootController)(nil)
@@ -153,15 +155,14 @@ func (c *rootController) startSubControllerRoutine(ctx context.Context, logger *
153155
managerOpts := crman.Options{
154156
Scheme: scheme,
155157
Controller: crconfig.Controller{
156-
// Controller-runtime maintains a global checklist of controller
157-
// names and does not currently provide a way to unregister the
158-
// controller names used by discarded managers. The autopilot
159-
// controller and worker components accidentally share some
160-
// controller names. So it's necessary to suppress the global name
161-
// check because the order in which components are started is not
162-
// fully guaranteed for k0s controller nodes running an embedded
163-
// worker.
164-
SkipNameValidation: ptr.To(true),
158+
// If this controller is already initialized, this means that all
159+
// controller-runtime controllers have already been successfully
160+
// registered to another manager. However, controller-runtime
161+
// maintains a global checklist of controller names and doesn't
162+
// currently provide a way to unregister names from discarded
163+
// managers. So it's necessary to suppress the global name check
164+
// whenever things are restarted for reconfiguration.
165+
SkipNameValidation: ptr.To(c.initialized),
165166
},
166167
WebhookServer: crwebhook.NewServer(crwebhook.Options{
167168
Port: c.cfg.ManagerPort,
@@ -222,21 +223,24 @@ func (c *rootController) startSubControllerRoutine(ctx context.Context, logger *
222223
}
223224
clusterID := string(ns.UID)
224225

225-
if err := apsig.RegisterControllers(ctx, logger, mgr, delegateMap[apdel.ControllerDelegateController], c.cfg.K0sDataDir, clusterID); err != nil {
226-
logger.WithError(err).Error("unable to register 'signal' controllers")
226+
if err := signal.RegisterControllers(ctx, logger, mgr, delegateMap[apdel.ControllerDelegateController], c.cfg.K0sDataDir, clusterID); err != nil {
227+
logger.WithError(err).Error("unable to register signal controllers")
227228
return err
228229
}
229230

230-
if err := applan.RegisterControllers(ctx, logger, mgr, c.kubeClientFactory, leaderMode, delegateMap, c.cfg.ExcludeFromPlans); err != nil {
231-
logger.WithError(err).Error("unable to register 'plans' controllers")
231+
if err := plans.RegisterControllers(ctx, logger, mgr, c.kubeClientFactory, leaderMode, delegateMap, c.cfg.ExcludeFromPlans); err != nil {
232+
logger.WithError(err).Error("unable to register plans controllers")
232233
return err
233234
}
234235

235-
if err := apupdate.RegisterControllers(ctx, logger, mgr, c.autopilotClientFactory, leaderMode, clusterID); err != nil {
236-
logger.WithError(err).Error("unable to register 'update' controllers")
236+
if err := updates.RegisterControllers(ctx, logger, mgr, c.autopilotClientFactory, leaderMode, clusterID); err != nil {
237+
logger.WithError(err).Error("unable to register updates controllers")
237238
return err
238239
}
239240

241+
// All the controller-runtime controllers have been registered.
242+
c.initialized = true
243+
240244
// The controller-runtime start blocks until the context is cancelled.
241245
if err := mgr.Start(ctx); err != nil {
242246
logger.WithError(err).Error("unable to run controller-runtime manager")

pkg/autopilot/controller/root_worker.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
apcli "github.com/k0sproject/k0s/pkg/autopilot/client"
2525
apdel "github.com/k0sproject/k0s/pkg/autopilot/controller/delegate"
2626
aproot "github.com/k0sproject/k0s/pkg/autopilot/controller/root"
27-
apsig "github.com/k0sproject/k0s/pkg/autopilot/controller/signal"
27+
"github.com/k0sproject/k0s/pkg/autopilot/controller/signal"
2828

2929
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3030
"k8s.io/apimachinery/pkg/util/wait"
@@ -43,6 +43,8 @@ type rootWorker struct {
4343
cfg aproot.RootConfig
4444
log *logrus.Entry
4545
clientFactory apcli.FactoryInterface
46+
47+
initialized bool
4648
}
4749

4850
var _ aproot.Root = (*rootWorker)(nil)
@@ -64,15 +66,14 @@ func (w *rootWorker) Run(ctx context.Context) error {
6466
managerOpts := crman.Options{
6567
Scheme: scheme,
6668
Controller: crconfig.Controller{
67-
// Controller-runtime maintains a global checklist of controller
68-
// names and does not currently provide a way to unregister the
69-
// controller names used by discarded managers. The autopilot
70-
// controller and worker components accidentally share some
71-
// controller names. So it's necessary to suppress the global name
72-
// check because the order in which components are started is not
73-
// fully guaranteed for k0s controller nodes running an embedded
74-
// worker.
75-
SkipNameValidation: ptr.To(true),
69+
// If this controller is already initialized, this means that all
70+
// controller-runtime controllers have already been successfully
71+
// registered to another manager. However, controller-runtime
72+
// maintains a global checklist of controller names and doesn't
73+
// currently provide a way to unregister names from discarded
74+
// managers. So it's necessary to suppress the global name check
75+
// whenever things retried.
76+
SkipNameValidation: ptr.To(w.initialized),
7677
},
7778
WebhookServer: crwebhook.NewServer(crwebhook.Options{
7879
Port: w.cfg.ManagerPort,
@@ -120,9 +121,13 @@ func (w *rootWorker) Run(ctx context.Context) error {
120121
return fmt.Errorf("unable to register indexers: %w", err)
121122
}
122123

123-
if err := apsig.RegisterControllers(ctx, logger, mgr, apdel.NodeControllerDelegate(), w.cfg.K0sDataDir, clusterID); err != nil {
124-
return fmt.Errorf("unable to register 'controlnodes' controllers: %w", err)
124+
if err := signal.RegisterControllers(ctx, logger, mgr, apdel.NodeControllerDelegate(), w.cfg.K0sDataDir, clusterID); err != nil {
125+
return fmt.Errorf("unable to register signal controllers: %w", err)
125126
}
127+
128+
// All the controller-runtime controllers have been registered.
129+
w.initialized = true
130+
126131
// The controller-runtime start blocks until the context is cancelled.
127132
if err := mgr.Start(ctx); err != nil {
128133
return fmt.Errorf("unable to run controller-runtime manager for workers: %w", err)

pkg/autopilot/controller/signal/airgap/download.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package airgap
1717
import (
1818
"crypto/sha256"
1919
"path"
20+
"strings"
2021

2122
apdel "github.com/k0sproject/k0s/pkg/autopilot/controller/delegate"
2223
apsigcomm "github.com/k0sproject/k0s/pkg/autopilot/controller/signal/common"
@@ -43,10 +44,11 @@ var _ apsigcomm.DownloadManifestBuilder = (*downloadManfiestBuilderAirgap)(nil)
4344
// moved to a `Downloading` status. At this point, it will attempt to download
4445
// the file provided in the update request.
4546
func registerDownloading(logger *logrus.Entry, mgr crman.Manager, eventFilter crpred.Predicate, delegate apdel.ControllerDelegate, k0sDataDir string) error {
46-
logger.Infof("Registering 'airgap-downloading' reconciler for '%s'", delegate.Name())
47+
name := strings.ToLower(delegate.Name()) + "_airgap_downloading"
48+
logger.Info("Registering reconciler: ", name)
4749

4850
return cr.NewControllerManagedBy(mgr).
49-
Named("airgap-downloading").
51+
Named(name).
5052
For(delegate.CreateObject()).
5153
WithEventFilter(eventFilter).
5254
Complete(

pkg/autopilot/controller/signal/airgap/init.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ func RegisterControllers(ctx context.Context, logger *logrus.Entry, mgr crman.Ma
3838

3939
hostname, err := apcomm.FindEffectiveHostname()
4040
if err != nil {
41-
return fmt.Errorf("unable to determine hostname for controlnode airgap 'signal' reconciler: %w", err)
41+
return fmt.Errorf("unable to determine hostname: %w", err)
4242
}
4343

4444
if err := registerSignalController(logger, mgr, SignalControllerEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "signal")), delegate); err != nil {
45-
return fmt.Errorf("unable to register 'airgap-signal' controller: %w", err)
45+
return fmt.Errorf("unable to register signal controller: %w", err)
4646
}
4747

4848
if err := registerDownloading(logger, mgr, SignalControllerEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "airgap download")), delegate, k0sDataDir); err != nil {
49-
return fmt.Errorf("unable to register 'airgap-downloading' controller: %w", err)
49+
return fmt.Errorf("unable to register downloading controller: %w", err)
5050
}
5151

5252
return nil

pkg/autopilot/controller/signal/airgap/signal.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package airgap
1717
import (
1818
"context"
1919
"fmt"
20+
"strings"
2021

2122
apcomm "github.com/k0sproject/k0s/pkg/autopilot/common"
2223
apdel "github.com/k0sproject/k0s/pkg/autopilot/controller/delegate"
@@ -64,11 +65,12 @@ type signalControllerHandler struct {
6465
// updates.
6566
func registerSignalController(logger *logrus.Entry, mgr crman.Manager, eventFilter crpred.Predicate, delegate apdel.ControllerDelegate) error {
6667
logr := logger.WithFields(logrus.Fields{"updatetype": "airgap"})
68+
name := strings.ToLower(delegate.Name()) + "_airgap_signal"
6769

68-
logr.Infof("Registering 'airgap-signal' reconciler for '%s'", delegate.Name())
70+
logr.Info("Registering reconciler: ", name)
6971

7072
return cr.NewControllerManagedBy(mgr).
71-
Named("airgap-signal").
73+
Named(name).
7274
For(delegate.CreateObject()).
7375
WithEventFilter(eventFilter).
7476
Complete(

pkg/autopilot/controller/signal/init.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import (
2121
"fmt"
2222

2323
apdel "github.com/k0sproject/k0s/pkg/autopilot/controller/delegate"
24-
apsigag "github.com/k0sproject/k0s/pkg/autopilot/controller/signal/airgap"
25-
apsigk0s "github.com/k0sproject/k0s/pkg/autopilot/controller/signal/k0s"
24+
"github.com/k0sproject/k0s/pkg/autopilot/controller/signal/airgap"
25+
"github.com/k0sproject/k0s/pkg/autopilot/controller/signal/k0s"
2626

2727
"github.com/sirupsen/logrus"
2828
crman "sigs.k8s.io/controller-runtime/pkg/manager"
@@ -31,11 +31,11 @@ import (
3131
// RegisterControllers registers all of the autopilot controllers used by both controller
3232
// and worker modes.
3333
func RegisterControllers(ctx context.Context, logger *logrus.Entry, mgr crman.Manager, delegate apdel.ControllerDelegate, k0sDataDir, clusterID string) error {
34-
if err := apsigk0s.RegisterControllers(ctx, logger, mgr, delegate, clusterID); err != nil {
34+
if err := k0s.RegisterControllers(ctx, logger, mgr, delegate, clusterID); err != nil {
3535
return fmt.Errorf("unable to register k0s controllers: %w", err)
3636
}
3737

38-
if err := apsigag.RegisterControllers(ctx, logger, mgr, delegate, k0sDataDir); err != nil {
38+
if err := airgap.RegisterControllers(ctx, logger, mgr, delegate, k0sDataDir); err != nil {
3939
return fmt.Errorf("unable to register airgap controllers: %w", err)
4040
}
4141

pkg/autopilot/controller/signal/k0s/apply.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"os"
2222
"path"
2323
"path/filepath"
24+
"strings"
2425

2526
apcomm "github.com/k0sproject/k0s/pkg/autopilot/common"
2627
apconst "github.com/k0sproject/k0s/pkg/autopilot/constant"
@@ -78,15 +79,16 @@ func registerApplyingUpdate(
7879
delegate apdel.ControllerDelegate,
7980
k0sBinaryDir string,
8081
) error {
81-
logger.Infof("Registering 'applying-update' reconciler for '%s'", delegate.Name())
82+
name := strings.ToLower(delegate.Name()) + "_k0s_applying_update"
83+
logger.Info("Registering reconciler: ", name)
8284

8385
return cr.NewControllerManagedBy(mgr).
84-
Named(delegate.Name() + "-applying-update").
86+
Named(name).
8587
For(delegate.CreateObject()).
8688
WithEventFilter(eventFilter).
8789
Complete(
8890
&applyingUpdate{
89-
log: logger.WithFields(logrus.Fields{"reconciler": "applying-update", "object": delegate.Name()}),
91+
log: logger.WithFields(logrus.Fields{"reconciler": "k0s-applying-update", "object": delegate.Name()}),
9092
client: mgr.GetClient(),
9193
delegate: delegate,
9294
k0sBinaryDir: k0sBinaryDir,

pkg/autopilot/controller/signal/k0s/cordon.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"errors"
2020
"fmt"
21+
"strings"
2122
"time"
2223

2324
autopilotv1beta2 "github.com/k0sproject/k0s/pkg/apis/autopilot/v1beta2"
@@ -77,7 +78,8 @@ type cordoning struct {
7778
// moved to a `Cordoning` status. At this point, it will attempt to cordong & drain
7879
// the node.
7980
func registerCordoning(logger *logrus.Entry, mgr crman.Manager, eventFilter crpred.Predicate, delegate apdel.ControllerDelegate) error {
80-
logger.Infof("Registering 'cordoning' reconciler for '%s'", delegate.Name())
81+
name := strings.ToLower(delegate.Name()) + "_k0s_cordoning"
82+
logger.Info("Registering reconciler: ", name)
8183

8284
// create the clientset
8385
clientset, err := kubernetes.NewForConfig(mgr.GetConfig())
@@ -86,12 +88,12 @@ func registerCordoning(logger *logrus.Entry, mgr crman.Manager, eventFilter crpr
8688
}
8789

8890
return cr.NewControllerManagedBy(mgr).
89-
Named(delegate.Name() + "-cordoning").
91+
Named(name).
9092
For(delegate.CreateObject()).
9193
WithEventFilter(eventFilter).
9294
Complete(
9395
&cordoning{
94-
log: logger.WithFields(logrus.Fields{"reconciler": "cordoning", "object": delegate.Name()}),
96+
log: logger.WithFields(logrus.Fields{"reconciler": "k0s-cordoning", "object": delegate.Name()}),
9597
client: mgr.GetClient(),
9698
delegate: delegate,
9799
clientset: clientset,

pkg/autopilot/controller/signal/k0s/download.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package k0s
1616

1717
import (
1818
"crypto/sha256"
19+
"strings"
1920

2021
apcomm "github.com/k0sproject/k0s/pkg/autopilot/common"
2122
apconst "github.com/k0sproject/k0s/pkg/autopilot/constant"
@@ -69,10 +70,11 @@ var _ apsigcomm.DownloadManifestBuilder = (*downloadManifestBuilderK0s)(nil)
6970
// moved to a `Downloading` status. At this point, it will attempt to download
7071
// the file provided in the update request.
7172
func registerDownloading(logger *logrus.Entry, mgr crman.Manager, eventFilter crpred.Predicate, delegate apdel.ControllerDelegate, k0sBinaryDir string) error {
72-
logger.Infof("Registering k0s 'downloading' reconciler for '%s'", delegate.Name())
73+
name := strings.ToLower(delegate.Name()) + "_k0s_downloading"
74+
logger.Info("Registering reconciler: ", name)
7375

7476
return cr.NewControllerManagedBy(mgr).
75-
Named(delegate.Name() + "-downloading").
77+
Named(name).
7678
For(delegate.CreateObject()).
7779
WithEventFilter(eventFilter).
7880
Complete(

pkg/autopilot/controller/signal/k0s/init.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ func RegisterControllers(ctx context.Context, logger *logrus.Entry, mgr crman.Ma
3838

3939
hostname, err := apcomm.FindEffectiveHostname()
4040
if err != nil {
41-
return fmt.Errorf("unable to determine hostname for controlnode 'signal' reconciler: %w", err)
41+
return fmt.Errorf("unable to determine hostname: %w", err)
4242
}
4343

4444
k0sBinaryPath, err := os.Executable()
4545
if err != nil {
46-
return fmt.Errorf("unable to determine k0s binary path for controlnode 'signal' reconciler: %w", err)
46+
return fmt.Errorf("unable to determine k0s binary path: %w", err)
4747
}
4848
k0sBinaryDir := filepath.Dir(k0sBinaryPath)
4949

@@ -54,31 +54,31 @@ func RegisterControllers(ctx context.Context, logger *logrus.Entry, mgr crman.Ma
5454
}
5555

5656
if err := registerSignalController(logger, mgr, signalControllerEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "k0s signal")), delegate, clusterID, k0sVersionHandler); err != nil {
57-
return fmt.Errorf("unable to register k0s 'signal' controller: %w", err)
57+
return fmt.Errorf("unable to register signal controller: %w", err)
5858
}
5959

6060
if err := registerDownloading(logger, mgr, downloadEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "k0s downloading")), delegate, k0sBinaryDir); err != nil {
61-
return fmt.Errorf("unable to register k0s 'downloading' controller: %w", err)
61+
return fmt.Errorf("unable to register downloading controller: %w", err)
6262
}
6363

6464
if err := registerCordoning(logger, mgr, cordoningEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "k0s cordoning")), delegate); err != nil {
65-
return fmt.Errorf("unable to register k0s 'cordoning' controller: %w", err)
65+
return fmt.Errorf("unable to register cordoning controller: %w", err)
6666
}
6767

6868
if err := registerApplyingUpdate(logger, mgr, applyingUpdateEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "k0s applying-update")), delegate, k0sBinaryDir); err != nil {
69-
return fmt.Errorf("unable to register k0s 'applying-update' controller: %w", err)
69+
return fmt.Errorf("unable to register applying-update controller: %w", err)
7070
}
7171

7272
if err := registerRestart(logger, mgr, restartEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "k0s restart")), delegate); err != nil {
73-
return fmt.Errorf("unable to register k0s 'restart' controller: %w", err)
73+
return fmt.Errorf("unable to register restart controller: %w", err)
7474
}
7575

7676
if err := registerRestarted(logger, mgr, restartedEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "k0s restarted")), delegate); err != nil {
77-
return fmt.Errorf("unable to register k0s 'restarted' controller: %w", err)
77+
return fmt.Errorf("unable to register restarted controller: %w", err)
7878
}
7979

8080
if err := registerUncordoning(logger, mgr, unCordoningEventFilter(hostname, apsigpred.DefaultErrorHandler(logger, "k0s uncordoning")), delegate); err != nil {
81-
return fmt.Errorf("unable to register k0s 'uncordoning' controller: %w", err)
81+
return fmt.Errorf("unable to register uncordoning controller: %w", err)
8282
}
8383

8484
return nil

0 commit comments

Comments
 (0)