Skip to content

Commit 4f90253

Browse files
authored
Merge pull request kubernetes#89596 from neolit123/1.19-fix-misleading-warning-on-jcp
kubeadm: remove misleading warning on kubeadm join
2 parents 873fe14 + 63b3bd1 commit 4f90253

File tree

3 files changed

+48
-17
lines changed

3 files changed

+48
-17
lines changed

cmd/kubeadm/app/cmd/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ go_test(
8787
"//cmd/kubeadm/app/constants:go_default_library",
8888
"//cmd/kubeadm/app/util:go_default_library",
8989
"//cmd/kubeadm/app/util/config:go_default_library",
90+
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
9091
"//cmd/kubeadm/app/util/output:go_default_library",
9192
"//cmd/kubeadm/app/util/runtime:go_default_library",
9293
"//staging/src/k8s.io/api/core/v1:go_default_library",

cmd/kubeadm/app/cmd/join.go

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"io"
2222
"os"
23+
"strings"
2324
"text/template"
2425

2526
"github.com/lithammer/dedent"
@@ -127,6 +128,7 @@ type joinOptions struct {
127128
controlPlane bool
128129
ignorePreflightErrors []string
129130
externalcfg *kubeadmapiv1beta2.JoinConfiguration
131+
joinControlPlane *kubeadmapiv1beta2.JoinControlPlane
130132
kustomizeDir string
131133
}
132134

@@ -199,7 +201,7 @@ func NewCmdJoin(out io.Writer, joinOptions *joinOptions) *cobra.Command {
199201
Args: cobra.MaximumNArgs(1),
200202
}
201203

202-
addJoinConfigFlags(cmd.Flags(), joinOptions.externalcfg)
204+
addJoinConfigFlags(cmd.Flags(), joinOptions.externalcfg, joinOptions.joinControlPlane)
203205
addJoinOtherFlags(cmd.Flags(), joinOptions)
204206

205207
joinRunner.AppendPhase(phases.NewPreflightPhase())
@@ -211,7 +213,7 @@ func NewCmdJoin(out io.Writer, joinOptions *joinOptions) *cobra.Command {
211213
// sets the data builder function, that will be used by the runner
212214
// both when running the entire workflow or single phases
213215
joinRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) {
214-
return newJoinData(cmd, args, joinOptions, out)
216+
return newJoinData(cmd, args, joinOptions, out, kubeadmconstants.GetAdminKubeConfigPath())
215217
})
216218

217219
// binds the Runner to kubeadm join command by altering
@@ -222,22 +224,22 @@ func NewCmdJoin(out io.Writer, joinOptions *joinOptions) *cobra.Command {
222224
}
223225

224226
// addJoinConfigFlags adds join flags bound to the config to the specified flagset
225-
func addJoinConfigFlags(flagSet *flag.FlagSet, cfg *kubeadmapiv1beta2.JoinConfiguration) {
227+
func addJoinConfigFlags(flagSet *flag.FlagSet, cfg *kubeadmapiv1beta2.JoinConfiguration, jcp *kubeadmapiv1beta2.JoinControlPlane) {
226228
flagSet.StringVar(
227229
&cfg.NodeRegistration.Name, options.NodeName, cfg.NodeRegistration.Name,
228230
`Specify the node name.`,
229231
)
230232
flagSet.StringVar(
231-
&cfg.ControlPlane.CertificateKey, options.CertificateKey, "",
233+
&jcp.CertificateKey, options.CertificateKey, jcp.CertificateKey,
232234
"Use this key to decrypt the certificate secrets uploaded by init.",
233235
)
234236
// add control plane endpoint flags to the specified flagset
235237
flagSet.StringVar(
236-
&cfg.ControlPlane.LocalAPIEndpoint.AdvertiseAddress, options.APIServerAdvertiseAddress, cfg.ControlPlane.LocalAPIEndpoint.AdvertiseAddress,
238+
&jcp.LocalAPIEndpoint.AdvertiseAddress, options.APIServerAdvertiseAddress, jcp.LocalAPIEndpoint.AdvertiseAddress,
237239
"If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used.",
238240
)
239241
flagSet.Int32Var(
240-
&cfg.ControlPlane.LocalAPIEndpoint.BindPort, options.APIServerBindPort, cfg.ControlPlane.LocalAPIEndpoint.BindPort,
242+
&jcp.LocalAPIEndpoint.BindPort, options.APIServerBindPort, jcp.LocalAPIEndpoint.BindPort,
241243
"If the node should host a new control plane instance, the port for the API Server to bind to.",
242244
)
243245
// adds bootstrap token specific discovery flags to the specified flagset
@@ -297,18 +299,29 @@ func newJoinOptions() *joinOptions {
297299
externalcfg.Discovery.BootstrapToken = &kubeadmapiv1beta2.BootstrapTokenDiscovery{}
298300
externalcfg.ControlPlane = &kubeadmapiv1beta2.JoinControlPlane{}
299301

302+
// This object is used for storage of control-plane flags.
303+
joinControlPlane := &kubeadmapiv1beta2.JoinControlPlane{}
304+
300305
// Apply defaults
301306
kubeadmscheme.Scheme.Default(externalcfg)
307+
kubeadmapiv1beta2.SetDefaults_JoinControlPlane(joinControlPlane)
302308

303309
return &joinOptions{
304-
externalcfg: externalcfg,
310+
externalcfg: externalcfg,
311+
joinControlPlane: joinControlPlane,
305312
}
306313
}
307314

308315
// newJoinData returns a new joinData struct to be used for the execution of the kubeadm join workflow.
309316
// This func takes care of validating joinOptions passed to the command, and then it converts
310317
// options into the internal JoinConfiguration type that is used as input all the phases in the kubeadm join workflow
311-
func newJoinData(cmd *cobra.Command, args []string, opt *joinOptions, out io.Writer) (*joinData, error) {
318+
func newJoinData(cmd *cobra.Command, args []string, opt *joinOptions, out io.Writer, adminKubeConfigPath string) (*joinData, error) {
319+
320+
// Validate the mixed arguments with --config and return early on errors
321+
if err := validation.ValidateMixedArguments(cmd.Flags()); err != nil {
322+
return nil, err
323+
}
324+
312325
// Re-apply defaults to the public kubeadm API (this will set only values not exposed/not set as a flags)
313326
kubeadmscheme.Scheme.Default(opt.externalcfg)
314327

@@ -340,17 +353,32 @@ func newJoinData(cmd *cobra.Command, args []string, opt *joinOptions, out io.Wri
340353
opt.externalcfg.Discovery.BootstrapToken.APIServerEndpoint = args[0]
341354
}
342355

343-
// if not joining a control plane, unset the ControlPlane object
356+
// Include the JoinControlPlane with user flags
357+
opt.externalcfg.ControlPlane = opt.joinControlPlane
358+
359+
// If not passing --control-plane, unset the ControlPlane object
344360
if !opt.controlPlane {
345-
if opt.externalcfg.ControlPlane != nil {
346-
klog.Warningf("[preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when %s flag is not set.", options.ControlPlane)
361+
// Use a defaulted JoinControlPlane object to detect if the user has passed
362+
// other control-plane related flags.
363+
defaultJCP := &kubeadmapiv1beta2.JoinControlPlane{}
364+
kubeadmapiv1beta2.SetDefaults_JoinControlPlane(defaultJCP)
365+
366+
// This list must match the JCP flags in addJoinConfigFlags()
367+
joinControlPlaneFlags := []string{
368+
options.CertificateKey,
369+
options.APIServerAdvertiseAddress,
370+
options.APIServerBindPort,
371+
}
372+
373+
if *opt.joinControlPlane != *defaultJCP {
374+
klog.Warningf("[preflight] WARNING: --%s is also required when passing control-plane "+
375+
"related flags such as [%s]", options.ControlPlane, strings.Join(joinControlPlaneFlags, ", "))
347376
}
348377
opt.externalcfg.ControlPlane = nil
349378
}
350379

351380
// if the admin.conf file already exists, use it for skipping the discovery process.
352381
// NB. this case can happen when we are joining a control-plane node only (and phases are invoked atomically)
353-
var adminKubeConfigPath = kubeadmconstants.GetAdminKubeConfigPath()
354382
var tlsBootstrapCfg *clientcmdapi.Config
355383
if _, err := os.Stat(adminKubeConfigPath); err == nil && opt.controlPlane {
356384
// use the admin.conf as tlsBootstrapCfg, that is the kubeconfig file used for reading the kubeadm-config during discovery
@@ -361,10 +389,6 @@ func newJoinData(cmd *cobra.Command, args []string, opt *joinOptions, out io.Wri
361389
}
362390
}
363391

364-
if err := validation.ValidateMixedArguments(cmd.Flags()); err != nil {
365-
return nil, err
366-
}
367-
368392
// Either use the config file if specified, or convert public kubeadm API to the internal JoinConfiguration
369393
// and validates JoinConfiguration
370394
if opt.externalcfg.NodeRegistration.Name == "" {

cmd/kubeadm/app/cmd/join_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
"k8s.io/apimachinery/pkg/util/sets"
2626
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
27+
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
2728
)
2829

2930
const (
@@ -51,6 +52,11 @@ func TestNewJoinData(t *testing.T) {
5152
}
5253
defer os.RemoveAll(tmpDir)
5354

55+
// create kubeconfig
56+
kubeconfigFilePath := filepath.Join(tmpDir, "test-kubeconfig-file")
57+
kubeconfig := kubeconfigutil.CreateBasic("", "", "", []byte{})
58+
kubeconfigutil.WriteToDisk(kubeconfigFilePath, kubeconfig)
59+
5460
// create config file
5561
configFilePath := filepath.Join(tmpDir, "test-config-file")
5662
cfgFile, err := os.Create(configFilePath)
@@ -257,7 +263,7 @@ func TestNewJoinData(t *testing.T) {
257263
}
258264

259265
// test newJoinData method
260-
data, err := newJoinData(cmd, tc.args, joinOptions, nil)
266+
data, err := newJoinData(cmd, tc.args, joinOptions, nil, kubeconfigFilePath)
261267
if err != nil && !tc.expectError {
262268
t.Fatalf("newJoinData returned unexpected error: %v", err)
263269
}

0 commit comments

Comments
 (0)