Skip to content

Commit d4583d9

Browse files
authored
Merge pull request #5454 from twz123/load-nodeconfig-once
Load node configuration only once
2 parents 8b01a4b + 265dbfb commit d4583d9

File tree

9 files changed

+48
-65
lines changed

9 files changed

+48
-65
lines changed

cmd/backup/backup_unix.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"strings"
2727

2828
"github.com/k0sproject/k0s/internal/pkg/dir"
29+
k0sv1beta1 "github.com/k0sproject/k0s/pkg/apis/k0s/v1beta1"
2930
"github.com/k0sproject/k0s/pkg/backup"
3031
"github.com/k0sproject/k0s/pkg/component/status"
3132
"github.com/k0sproject/k0s/pkg/config"
@@ -56,7 +57,7 @@ func NewBackupCmd() *cobra.Command {
5657
if nodeConfig.Spec.Storage.Etcd.IsExternalClusterUsed() {
5758
return errors.New("command 'k0s backup' does not support external etcd cluster")
5859
}
59-
return c.backup(savePath, cmd.OutOrStdout())
60+
return c.backup(nodeConfig, savePath, cmd.OutOrStdout())
6061
},
6162
}
6263

@@ -67,7 +68,7 @@ func NewBackupCmd() *cobra.Command {
6768
return cmd
6869
}
6970

70-
func (c *command) backup(savePath string, out io.Writer) error {
71+
func (c *command) backup(nodeConfig *k0sv1beta1.ClusterConfig, savePath string, out io.Writer) error {
7172
if os.Geteuid() != 0 {
7273
return errors.New("this command must be run as root!")
7374
}
@@ -86,11 +87,6 @@ func (c *command) backup(savePath string, out io.Writer) error {
8687
}
8788
logrus.Debugf("detected role for backup operations: %v", status.Role)
8889

89-
nodeConfig, err := c.K0sVars.NodeConfig()
90-
if err != nil {
91-
return err
92-
}
93-
9490
if strings.Contains(status.Role, "controller") {
9591
mgr, err := backup.NewBackupManager()
9692
if err != nil {

cmd/controller/controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ func (c *command) start(ctx context.Context) error {
160160
return fmt.Errorf("failed to initialize dir: %w", err)
161161
}
162162

163-
rtc, err := config.NewRuntimeConfig(c.K0sVars)
163+
rtc, err := config.NewRuntimeConfig(c.K0sVars, nodeConfig)
164164
if err != nil {
165165
return fmt.Errorf("failed to initialize runtime config: %w", err)
166166
}

cmd/reset/reset.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (c *command) reset() error {
7676
}
7777

7878
// Get Cleanup Config
79-
cfg, err := cleanup.NewConfig(c.Debug, c.K0sVars, c.WorkerOptions.CriSocket)
79+
cfg, err := cleanup.NewConfig(c.Debug, c.K0sVars, nodeCfg.Spec.Install.SystemUsers, c.WorkerOptions.CriSocket)
8080
if err != nil {
8181
return fmt.Errorf("failed to configure cleanup: %w", err)
8282
}

cmd/token/create.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ k0s token create --role worker --expiry 10m //sets expiration time to 10 minute
6161
return err
6262
}
6363

64+
nodeConfig, err := opts.K0sVars.NodeConfig()
65+
if err != nil {
66+
return err
67+
}
68+
6469
var bootstrapToken string
6570
// we will retry every second for two minutes and then error
6671
err = retry.OnError(wait.Backoff{
@@ -83,11 +88,6 @@ k0s token create --role worker --expiry 10m //sets expiration time to 10 minute
8388
return err
8489
}
8590

86-
nodeConfig, err := opts.K0sVars.NodeConfig()
87-
if err != nil {
88-
return err
89-
}
90-
9191
bootstrapToken, err = token.CreateKubeletBootstrapToken(cmd.Context(), nodeConfig.Spec.API, opts.K0sVars, createTokenRole, expiry)
9292
return err
9393
})

pkg/backup/manager_unix.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (bm *Manager) RunRestore(archivePath string, k0sVars *config.CfgVars, desir
164164
return fmt.Errorf("failed to unpack backup archive `%s`: %w", archivePath, err)
165165
}
166166
defer os.RemoveAll(bm.tmpDir)
167-
cfg, err := bm.getConfigForRestore(k0sVars)
167+
cfg, err := bm.getConfigForRestore()
168168
if err != nil {
169169
return fmt.Errorf("failed to parse backed-up configuration file, check the backup archive: %w", err)
170170
}
@@ -180,11 +180,16 @@ func (bm *Manager) RunRestore(archivePath string, k0sVars *config.CfgVars, desir
180180
return nil
181181
}
182182

183-
func (bm Manager) getConfigForRestore(k0sVars *config.CfgVars) (*v1beta1.ClusterConfig, error) {
183+
func (bm Manager) getConfigForRestore() (*v1beta1.ClusterConfig, error) {
184184
configFromBackup := path.Join(bm.tmpDir, "k0s.yaml")
185185
logrus.Debugf("Using k0s.yaml from: %s", configFromBackup)
186186

187-
cfg, err := k0sVars.NodeConfig()
187+
bytes, err := os.ReadFile(configFromBackup)
188+
if err != nil {
189+
return nil, err
190+
}
191+
192+
cfg, err := v1beta1.ConfigFromString(string(bytes))
188193
if err != nil {
189194
return nil, err
190195
}

pkg/cleanup/cleanup.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,15 @@ type Config struct {
3737
cleanupSteps []Step
3838
}
3939

40-
func NewConfig(debug bool, k0sVars *config.CfgVars, criSocketFlag string) (*Config, error) {
41-
cfg, err := k0sVars.NodeConfig()
42-
if err != nil {
43-
logrus.Errorf("failed to get cluster setup: %v", err)
44-
}
45-
40+
func NewConfig(debug bool, k0sVars *config.CfgVars, systemUsers *k0sv1beta1.SystemUser, criSocketFlag string) (*Config, error) {
4641
containers, err := newContainersStep(debug, k0sVars, criSocketFlag)
4742
if err != nil {
4843
return nil, err
4944
}
5045

5146
cleanupSteps := []Step{
5247
containers,
53-
&users{
54-
systemUsers: cfg.Spec.Install.SystemUsers,
55-
},
48+
&users{systemUsers: systemUsers},
5649
&services{},
5750
&directories{
5851
dataDir: k0sVars.DataDir,

pkg/component/controller/coredns.go

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,8 @@ var _ manager.Reconciler = (*CoreDNS)(nil)
274274

275275
// CoreDNS is the component implementation to manage CoreDNS
276276
type CoreDNS struct {
277-
K0sVars *config.CfgVars
278-
NodeConfig *v1beta1.ClusterConfig
279-
277+
dnsAddress string
278+
clusterDomain string
280279
client kubernetes.Interface
281280
log *logrus.Entry
282281
manifestDir string
@@ -298,19 +297,22 @@ type coreDNSConfig struct {
298297

299298
// NewCoreDNS creates new instance of CoreDNS component
300299
func NewCoreDNS(k0sVars *config.CfgVars, clientFactory k8sutil.ClientFactoryInterface, nodeConfig *v1beta1.ClusterConfig) (*CoreDNS, error) {
301-
manifestDir := path.Join(k0sVars.ManifestsDir, "coredns")
300+
dnsAddress, err := nodeConfig.Spec.Network.DNSAddress()
301+
if err != nil {
302+
return nil, err
303+
}
302304

303305
client, err := clientFactory.GetClient()
304306
if err != nil {
305307
return nil, err
306308
}
307-
log := logrus.WithFields(logrus.Fields{"component": "coredns"})
309+
308310
return &CoreDNS{
309-
client: client,
310-
log: log,
311-
K0sVars: k0sVars,
312-
manifestDir: manifestDir,
313-
NodeConfig: nodeConfig,
311+
dnsAddress: dnsAddress,
312+
clusterDomain: nodeConfig.Spec.Network.ClusterDomain,
313+
client: client,
314+
log: logrus.WithField("component", "coredns"),
315+
manifestDir: path.Join(k0sVars.ManifestsDir, "coredns"),
314316
}, nil
315317
}
316318

@@ -348,16 +350,6 @@ func (c *CoreDNS) Start(ctx context.Context) error {
348350
}
349351

350352
func (c *CoreDNS) getConfig(ctx context.Context, clusterConfig *v1beta1.ClusterConfig) (coreDNSConfig, error) {
351-
nodeConfig, err := c.K0sVars.NodeConfig()
352-
if err != nil {
353-
return coreDNSConfig{}, fmt.Errorf("failed to get node config: %w", err)
354-
}
355-
356-
dns, err := nodeConfig.Spec.Network.DNSAddress()
357-
if err != nil {
358-
return coreDNSConfig{}, err
359-
}
360-
361353
nodes, err := c.client.CoreV1().Nodes().List(ctx, v1.ListOptions{})
362354
if err != nil {
363355
return coreDNSConfig{}, err
@@ -367,8 +359,8 @@ func (c *CoreDNS) getConfig(ctx context.Context, clusterConfig *v1beta1.ClusterC
367359

368360
config := coreDNSConfig{
369361
Replicas: replicaCount(nodeCount),
370-
ClusterDomain: nodeConfig.Spec.Network.ClusterDomain,
371-
ClusterDNSIP: dns,
362+
ClusterDomain: c.clusterDomain,
363+
ClusterDNSIP: c.dnsAddress,
372364
Image: clusterConfig.Spec.Images.CoreDNS.URI(),
373365
PullPolicy: clusterConfig.Spec.Images.DefaultPullPolicy,
374366
}

pkg/config/runtime.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,11 @@ func ParseRuntimeConfig(content []byte) (*RuntimeConfig, error) {
107107
return &config, nil
108108
}
109109

110-
func NewRuntimeConfig(k0sVars *CfgVars) (*RuntimeConfig, error) {
110+
func NewRuntimeConfig(k0sVars *CfgVars, nodeConfig *v1beta1.ClusterConfig) (*RuntimeConfig, error) {
111111
if _, err := LoadRuntimeConfig(k0sVars.RuntimeConfigPath); err == nil {
112112
return nil, ErrK0sAlreadyRunning
113113
}
114114

115-
nodeConfig, err := k0sVars.NodeConfig()
116-
if err != nil {
117-
return nil, fmt.Errorf("load node config: %w", err)
118-
}
119-
120115
cfg := &RuntimeConfig{
121116
ObjectMeta: metav1.ObjectMeta{
122117
CreationTimestamp: metav1.Now(),

pkg/config/runtime_test.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,21 +69,23 @@ func TestNewRuntimeConfig(t *testing.T) {
6969
DataDir: tempDir,
7070
}
7171

72+
// Check if the node config can be loaded properly
73+
nodeConfig, err := k0sVars.NodeConfig()
74+
if assert.NoError(t, err) {
75+
assert.Equal(t, "10.0.0.1", nodeConfig.Spec.API.Address)
76+
}
77+
7278
// create a new runtime config and check if it's valid
73-
cfg, err := NewRuntimeConfig(k0sVars)
74-
spec := cfg.Spec
75-
assert.NoError(t, err)
76-
assert.NotNil(t, spec)
77-
assert.Same(t, k0sVars, spec.K0sVars)
78-
assert.Equal(t, os.Getpid(), spec.Pid)
79-
assert.NotNil(t, spec.NodeConfig)
80-
nodeConfig, err := spec.K0sVars.NodeConfig()
81-
assert.NoError(t, err)
82-
assert.Equal(t, "10.0.0.1", nodeConfig.Spec.API.Address)
79+
cfg, err := NewRuntimeConfig(k0sVars, nodeConfig)
80+
if assert.NoError(t, err) && assert.NotNil(t, cfg) && assert.NotNil(t, cfg.Spec) {
81+
assert.Same(t, k0sVars, cfg.Spec.K0sVars)
82+
assert.Same(t, nodeConfig, cfg.Spec.NodeConfig)
83+
assert.Equal(t, os.Getpid(), cfg.Spec.Pid)
84+
}
8385
assert.FileExists(t, rtConfigPath)
8486

8587
// try to create a new runtime config when one is already active and check if it returns an error
86-
_, err = NewRuntimeConfig(k0sVars)
88+
_, err = NewRuntimeConfig(k0sVars, nil)
8789
assert.Error(t, err)
8890
assert.ErrorIs(t, err, ErrK0sAlreadyRunning)
8991
}

0 commit comments

Comments
 (0)