Skip to content

Commit d76eb6b

Browse files
authored
Merge pull request #4882 from k0sproject/backport-4860-to-release-1.29
[Backport release-1.29] Detect --hostname-override flag in Autopilot for controller+worker nodes
2 parents 6b9fe73 + cec950b commit d76eb6b

File tree

9 files changed

+74
-21
lines changed

9 files changed

+74
-21
lines changed

cmd/controller/controller.go

+1
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ func (c *command) start(ctx context.Context) error {
528528

529529
clusterComponents.Add(ctx, &controller.Autopilot{
530530
K0sVars: c.K0sVars,
531+
KubeletExtraArgs: c.KubeletExtraArgs,
531532
AdminClientFactory: adminClientFactory,
532533
EnableWorker: c.EnableWorker,
533534
})

inttest/ap-controllerworker/controllerworker_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ spec:
4646
peerAddress: %s
4747
`
4848

49+
// TODO: Update this test after the https://github.com/k0sproject/k0s/pull/4860 is merged, backported and released.
50+
// Apply this commit to properly test controller+worker update process:
51+
// https://github.com/makhov/k0s/commit/bf702a829f958b04b7a6119ff03960e90100d4c9
52+
4953
// SetupTest prepares the controller and filesystem, getting it into a consistent
5054
// state which we can run tests against.
5155
func (s *controllerworkerSuite) SetupTest() {

pkg/autopilot/common/hostname.go

+14
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package common
1717
import (
1818
"os"
1919

20+
"github.com/k0sproject/k0s/internal/pkg/flags"
2021
"github.com/k0sproject/k0s/pkg/node"
2122
)
2223

@@ -30,3 +31,16 @@ const (
3031
func FindEffectiveHostname() (string, error) {
3132
return node.GetNodename(os.Getenv(envAutopilotHostname))
3233
}
34+
35+
func FindKubeletHostname(kubeletExtraArgs string) string {
36+
defaultNodename, _ := node.GetNodename("")
37+
if kubeletExtraArgs != "" {
38+
extras := flags.Split(kubeletExtraArgs)
39+
nodeName, ok := extras["--hostname-override"]
40+
if ok {
41+
return nodeName
42+
}
43+
}
44+
45+
return defaultNodename
46+
}

pkg/autopilot/controller/root/root.go

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
type RootConfig struct {
2424
KubeConfig string
2525
K0sDataDir string
26+
KubeletExtraArgs string
2627
Mode string
2728
ManagerPort int
2829
MetricsBindAddr string

pkg/autopilot/controller/root_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func NewRootController(cfg aproot.RootConfig, logger *logrus.Entry, enableWorker
7575
c.stopSubHandler = c.stopSubControllers
7676
c.leaseWatcherCreator = NewLeaseWatcher
7777
c.setupHandler = func(ctx context.Context, cf apcli.FactoryInterface) error {
78-
setupController := NewSetupController(c.log, cf, cfg.K0sDataDir, enableWorker)
78+
setupController := NewSetupController(c.log, cf, cfg.K0sDataDir, cfg.KubeletExtraArgs, enableWorker)
7979
return setupController.Run(ctx)
8080
}
8181

pkg/autopilot/controller/setup.go

+25-18
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,23 @@ type SetupController interface {
4343
}
4444

4545
type setupController struct {
46-
log *logrus.Entry
47-
clientFactory apcli.FactoryInterface
48-
k0sDataDir string
49-
enableWorker bool
46+
log *logrus.Entry
47+
clientFactory apcli.FactoryInterface
48+
k0sDataDir string
49+
enableWorker bool
50+
kubeletExtraArgs string
5051
}
5152

5253
var _ SetupController = (*setupController)(nil)
5354

5455
// NewSetupController creates a `SetupController`
55-
func NewSetupController(logger *logrus.Entry, cf apcli.FactoryInterface, k0sDataDir string, enableWorker bool) SetupController {
56+
func NewSetupController(logger *logrus.Entry, cf apcli.FactoryInterface, k0sDataDir, kubeletExtraArgs string, enableWorker bool) SetupController {
5657
return &setupController{
57-
log: logger.WithField("controller", "setup"),
58-
clientFactory: cf,
59-
k0sDataDir: k0sDataDir,
60-
enableWorker: enableWorker,
58+
log: logger.WithField("controller", "setup"),
59+
clientFactory: cf,
60+
k0sDataDir: k0sDataDir,
61+
kubeletExtraArgs: kubeletExtraArgs,
62+
enableWorker: enableWorker,
6163
}
6264
}
6365

@@ -74,23 +76,28 @@ func (sc *setupController) Run(ctx context.Context) error {
7476
}
7577
}
7678

77-
hostname, err := apcomm.FindEffectiveHostname()
79+
controlNodeName, err := apcomm.FindEffectiveHostname()
7880
if err != nil {
7981
return fmt.Errorf("unable to determine hostname for signal node setup: %w", err)
8082
}
8183

82-
logger.Infof("Using effective hostname = '%v'", hostname)
84+
kubeletNodeName := controlNodeName
85+
if sc.enableWorker {
86+
kubeletNodeName = apcomm.FindKubeletHostname(sc.kubeletExtraArgs)
87+
}
88+
89+
logger.Infof("Using effective hostname = '%v', kubelet hostname = '%v'", controlNodeName, kubeletNodeName)
8390

8491
if err := retry.Do(func() error {
85-
logger.Infof("Attempting to create controlnode '%s'", hostname)
86-
if err := sc.createControlNode(ctx, sc.clientFactory, hostname); err != nil {
87-
return fmt.Errorf("create controlnode '%s' attempt failed, retrying: %w", hostname, err)
92+
logger.Infof("Attempting to create controlnode '%s'", controlNodeName)
93+
if err := sc.createControlNode(ctx, sc.clientFactory, controlNodeName, kubeletNodeName); err != nil {
94+
return fmt.Errorf("create controlnode '%s' attempt failed, retrying: %w", controlNodeName, err)
8895
}
8996

9097
return nil
9198

9299
}); err != nil {
93-
return fmt.Errorf("failed to create controlnode '%s' after max attempts: %w", hostname, err)
100+
return fmt.Errorf("failed to create controlnode '%s' after max attempts: %w", controlNodeName, err)
94101
}
95102

96103
return nil
@@ -114,7 +121,7 @@ func createNamespace(ctx context.Context, cf apcli.FactoryInterface, name string
114121

115122
// createControlNode creates a new control node, ignoring errors if one already exists
116123
// for this physical host.
117-
func (sc *setupController) createControlNode(ctx context.Context, cf apcli.FactoryInterface, name string) error {
124+
func (sc *setupController) createControlNode(ctx context.Context, cf apcli.FactoryInterface, name, nodeName string) error {
118125
logger := sc.log.WithField("component", "setup")
119126
client, err := sc.clientFactory.GetAutopilotClient()
120127
if err != nil {
@@ -141,7 +148,7 @@ func (sc *setupController) createControlNode(ctx context.Context, cf apcli.Facto
141148
Name: name,
142149
// Create the usual os and arch labels as this describes a controller node
143150
Labels: map[string]string{
144-
corev1.LabelHostname: name,
151+
corev1.LabelHostname: nodeName,
145152
corev1.LabelOSStable: runtime.GOOS,
146153
corev1.LabelArchStable: runtime.GOARCH,
147154
},
@@ -160,7 +167,7 @@ func (sc *setupController) createControlNode(ctx context.Context, cf apcli.Facto
160167
return err
161168
}
162169

163-
addresses, err := getControlNodeAddresses(name)
170+
addresses, err := getControlNodeAddresses(nodeName)
164171
if err != nil {
165172
return err
166173
}

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"fmt"
2020
"time"
2121

22+
autopilotv1beta2 "github.com/k0sproject/k0s/pkg/apis/autopilot/v1beta2"
2223
apcomm "github.com/k0sproject/k0s/pkg/autopilot/common"
2324
apdel "github.com/k0sproject/k0s/pkg/autopilot/controller/delegate"
2425
apsigpred "github.com/k0sproject/k0s/pkg/autopilot/controller/signal/common/predicate"
@@ -157,8 +158,19 @@ func (r *cordoning) drainNode(ctx context.Context, signalNode crcli.Object) erro
157158
return fmt.Errorf("failed to cast signalNode to *corev1.Node")
158159
}
159160
} else {
161+
nodeName := signalNode.GetName()
162+
controlNode, ok := signalNode.(*autopilotv1beta2.ControlNode)
163+
if ok {
164+
for _, addr := range controlNode.Status.Addresses {
165+
if addr.Type == corev1.NodeHostName {
166+
nodeName = addr.Address
167+
break
168+
}
169+
}
170+
}
171+
160172
//otherwise get node from client
161-
if err := r.client.Get(ctx, crcli.ObjectKey{Name: signalNode.GetName()}, node); err != nil {
173+
if err := r.client.Get(ctx, crcli.ObjectKey{Name: nodeName}, node); err != nil {
162174
return fmt.Errorf("failed to get node: %w", err)
163175
}
164176
}

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"fmt"
2020
"time"
2121

22+
autopilotv1beta2 "github.com/k0sproject/k0s/pkg/apis/autopilot/v1beta2"
2223
apcomm "github.com/k0sproject/k0s/pkg/autopilot/common"
2324
apdel "github.com/k0sproject/k0s/pkg/autopilot/controller/delegate"
2425
apsigcomm "github.com/k0sproject/k0s/pkg/autopilot/controller/signal/common"
@@ -157,8 +158,19 @@ func (r *uncordoning) unCordonNode(ctx context.Context, signalNode crcli.Object)
157158
return fmt.Errorf("failed to convert signalNode to Node")
158159
}
159160
} else {
161+
nodeName := signalNode.GetName()
162+
controlNode, ok := signalNode.(*autopilotv1beta2.ControlNode)
163+
if ok {
164+
for _, addr := range controlNode.Status.Addresses {
165+
if addr.Type == corev1.NodeHostName {
166+
nodeName = addr.Address
167+
break
168+
}
169+
}
170+
}
171+
160172
//otherwise get node from client
161-
if err := r.client.Get(ctx, crcli.ObjectKey{Name: signalNode.GetName()}, node); err != nil {
173+
if err := r.client.Get(ctx, crcli.ObjectKey{Name: nodeName}, node); err != nil {
162174
return fmt.Errorf("failed to get node: %w", err)
163175
}
164176
}

pkg/component/controller/autopilot.go

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ var _ manager.Component = (*Autopilot)(nil)
3434

3535
type Autopilot struct {
3636
K0sVars *config.CfgVars
37+
KubeletExtraArgs string
3738
AdminClientFactory kubernetes.ClientFactoryInterface
3839
EnableWorker bool
3940
}
@@ -53,6 +54,7 @@ func (a *Autopilot) Start(ctx context.Context) error {
5354
autopilotRoot, err := apcont.NewRootController(aproot.RootConfig{
5455
KubeConfig: a.K0sVars.AdminKubeConfigPath,
5556
K0sDataDir: a.K0sVars.DataDir,
57+
KubeletExtraArgs: a.KubeletExtraArgs,
5658
Mode: "controller",
5759
ManagerPort: 8899,
5860
MetricsBindAddr: "0",

0 commit comments

Comments
 (0)