From a42ad6a913e1ef1e288ab2f7de4826d85a5b738b Mon Sep 17 00:00:00 2001 From: Ilya Dmitrichenko Date: Sun, 18 Sep 2016 12:25:42 +0100 Subject: [PATCH] Move `pkg/kubadm` to `cmd/kubeadm/app`, remove `cmd/manual.go` --- {pkg => cmd}/kubeadm/README.md | 0 {pkg/kubeadm => cmd/kubeadm/app}/api/types.go | 0 {pkg/kubeadm => cmd/kubeadm/app}/cmd/cmd.go | 7 +- {pkg/kubeadm => cmd/kubeadm/app}/cmd/init.go | 6 +- {pkg/kubeadm => cmd/kubeadm/app}/cmd/join.go | 6 +- .../kubeadm/app}/images/images.go | 0 cmd/kubeadm/app/kubeadm.go | 4 +- .../kubeadm/app}/master/addons.go | 4 +- .../kubeadm/app}/master/apiclient.go | 0 .../kubeadm/app}/master/discovery.go | 2 +- .../kubeadm/app}/master/kubeconfig.go | 4 +- .../kubeadm/app}/master/manifests.go | 4 +- .../kubeadm => cmd/kubeadm/app}/master/pki.go | 2 +- .../kubeadm/app}/master/tokens.go | 4 +- {pkg/kubeadm => cmd/kubeadm/app}/node/csr.go | 4 +- .../kubeadm/app}/node/discovery.go | 2 +- .../kubeadm/app}/util/kubeconfig.go | 2 +- .../kubeadm/app}/util/tokens.go | 2 +- pkg/kubeadm/.gitignore | 1 - pkg/kubeadm/cmd/manual.go | 250 ------------------ 20 files changed, 24 insertions(+), 280 deletions(-) rename {pkg => cmd}/kubeadm/README.md (100%) rename {pkg/kubeadm => cmd/kubeadm/app}/api/types.go (100%) rename {pkg/kubeadm => cmd/kubeadm/app}/cmd/cmd.go (95%) rename {pkg/kubeadm => cmd/kubeadm/app}/cmd/init.go (96%) rename {pkg/kubeadm => cmd/kubeadm/app}/cmd/join.go (94%) rename {pkg/kubeadm => cmd/kubeadm/app}/images/images.go (100%) rename {pkg/kubeadm => cmd/kubeadm/app}/master/addons.go (98%) rename {pkg/kubeadm => cmd/kubeadm/app}/master/apiclient.go (100%) rename {pkg/kubeadm => cmd/kubeadm/app}/master/discovery.go (98%) rename {pkg/kubeadm => cmd/kubeadm/app}/master/kubeconfig.go (94%) rename {pkg/kubeadm => cmd/kubeadm/app}/master/manifests.go (98%) rename {pkg/kubeadm => cmd/kubeadm/app}/master/pki.go (99%) rename {pkg/kubeadm => cmd/kubeadm/app}/master/tokens.go (94%) rename {pkg/kubeadm => cmd/kubeadm/app}/node/csr.go (97%) rename {pkg/kubeadm => cmd/kubeadm/app}/node/discovery.go (98%) rename {pkg/kubeadm => cmd/kubeadm/app}/util/kubeconfig.go (98%) rename {pkg/kubeadm => cmd/kubeadm/app}/util/tokens.go (97%) delete mode 100644 pkg/kubeadm/.gitignore delete mode 100644 pkg/kubeadm/cmd/manual.go diff --git a/pkg/kubeadm/README.md b/cmd/kubeadm/README.md similarity index 100% rename from pkg/kubeadm/README.md rename to cmd/kubeadm/README.md diff --git a/pkg/kubeadm/api/types.go b/cmd/kubeadm/app/api/types.go similarity index 100% rename from pkg/kubeadm/api/types.go rename to cmd/kubeadm/app/api/types.go diff --git a/pkg/kubeadm/cmd/cmd.go b/cmd/kubeadm/app/cmd/cmd.go similarity index 95% rename from pkg/kubeadm/cmd/cmd.go rename to cmd/kubeadm/app/cmd/cmd.go index 8fbebe62a9..83fbca97ce 100644 --- a/pkg/kubeadm/cmd/cmd.go +++ b/cmd/kubeadm/app/cmd/cmd.go @@ -25,7 +25,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/util/flag" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" ) func NewKubeadmCommand(f *cmdutil.Factory, in io.Reader, out, err io.Writer, envParams map[string]string) *cobra.Command { @@ -84,16 +84,11 @@ func NewKubeadmCommand(f *cmdutil.Factory, in io.Reader, out, err io.Writer, env s := new(kubeadmapi.KubeadmConfig) s.EnvParams = envParams - //s.InitFlags, s.JoinFlags = new(kubeadmapi.InitFlags), new(kubeadmapi.JoinFlags) - - //s.ManualFlags = new(kubeadmapi.ManualFlags) - cmds.ResetFlags() cmds.SetGlobalNormalizationFunc(flag.WarnWordSepNormalizeFunc) cmds.AddCommand(NewCmdInit(out, s)) cmds.AddCommand(NewCmdJoin(out, s)) - cmds.AddCommand(NewCmdManual(out, s)) return cmds } diff --git a/pkg/kubeadm/cmd/init.go b/cmd/kubeadm/app/cmd/init.go similarity index 96% rename from pkg/kubeadm/cmd/init.go rename to cmd/kubeadm/app/cmd/init.go index 691ef9d3e3..ce3e95f20d 100644 --- a/pkg/kubeadm/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -24,9 +24,9 @@ import ( "github.com/renstrom/dedent" "github.com/spf13/cobra" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - kubemaster "k8s.io/kubernetes/pkg/kubeadm/master" - kubeadmutil "k8s.io/kubernetes/pkg/kubeadm/util" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" + kubemaster "k8s.io/kubernetes/cmd/kubeadm/app/master" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" netutil "k8s.io/kubernetes/pkg/util/net" ) diff --git a/pkg/kubeadm/cmd/join.go b/cmd/kubeadm/app/cmd/join.go similarity index 94% rename from pkg/kubeadm/cmd/join.go rename to cmd/kubeadm/app/cmd/join.go index c83f666306..b8f60a1766 100644 --- a/pkg/kubeadm/cmd/join.go +++ b/cmd/kubeadm/app/cmd/join.go @@ -24,9 +24,9 @@ import ( "github.com/renstrom/dedent" "github.com/spf13/cobra" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - kubenode "k8s.io/kubernetes/pkg/kubeadm/node" - kubeadmutil "k8s.io/kubernetes/pkg/kubeadm/util" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" + kubenode "k8s.io/kubernetes/cmd/kubeadm/app/node" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" ) diff --git a/pkg/kubeadm/images/images.go b/cmd/kubeadm/app/images/images.go similarity index 100% rename from pkg/kubeadm/images/images.go rename to cmd/kubeadm/app/images/images.go diff --git a/cmd/kubeadm/app/kubeadm.go b/cmd/kubeadm/app/kubeadm.go index 6b180b7e08..a6580e3c59 100644 --- a/cmd/kubeadm/app/kubeadm.go +++ b/cmd/kubeadm/app/kubeadm.go @@ -23,7 +23,7 @@ import ( "github.com/spf13/pflag" - "k8s.io/kubernetes/pkg/kubeadm/cmd" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/util/logs" ) @@ -37,7 +37,7 @@ func getEnvParams() map[string]string { envParams := map[string]string{ // TODO(phase1): Mode prefix and host_pki_path to another place as constants, and use them everywhere // Right now they're used here and there, but not consequently - "kubernetes_dir": "/etc/kubernetes", + "kubernetes_dir": "/etc/kubernetes", "host_pki_path": "/etc/kubernetes/pki", "host_etcd_path": "/var/lib/etcd", "hyperkube_image": "", diff --git a/pkg/kubeadm/master/addons.go b/cmd/kubeadm/app/master/addons.go similarity index 98% rename from pkg/kubeadm/master/addons.go rename to cmd/kubeadm/app/master/addons.go index 44aa05ec5c..5e395052c7 100644 --- a/pkg/kubeadm/master/addons.go +++ b/cmd/kubeadm/app/master/addons.go @@ -24,8 +24,8 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/resource" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - "k8s.io/kubernetes/pkg/kubeadm/images" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" + "k8s.io/kubernetes/cmd/kubeadm/app/images" ipallocator "k8s.io/kubernetes/pkg/registry/service/ipallocator" "k8s.io/kubernetes/pkg/util/intstr" ) diff --git a/pkg/kubeadm/master/apiclient.go b/cmd/kubeadm/app/master/apiclient.go similarity index 100% rename from pkg/kubeadm/master/apiclient.go rename to cmd/kubeadm/app/master/apiclient.go diff --git a/pkg/kubeadm/master/discovery.go b/cmd/kubeadm/app/master/discovery.go similarity index 98% rename from pkg/kubeadm/master/discovery.go rename to cmd/kubeadm/app/master/discovery.go index 4ae8dcf13e..39ddb6e60b 100644 --- a/pkg/kubeadm/master/discovery.go +++ b/cmd/kubeadm/app/master/discovery.go @@ -25,7 +25,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" certutil "k8s.io/kubernetes/pkg/util/cert" ) diff --git a/pkg/kubeadm/master/kubeconfig.go b/cmd/kubeadm/app/master/kubeconfig.go similarity index 94% rename from pkg/kubeadm/master/kubeconfig.go rename to cmd/kubeadm/app/master/kubeconfig.go index 3287ea7a70..d9efe35147 100644 --- a/pkg/kubeadm/master/kubeconfig.go +++ b/cmd/kubeadm/app/master/kubeconfig.go @@ -23,8 +23,8 @@ import ( // TODO: "k8s.io/client-go/client/tools/clientcmd/api" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - kubeadmutil "k8s.io/kubernetes/pkg/kubeadm/util" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" certutil "k8s.io/kubernetes/pkg/util/cert" ) diff --git a/pkg/kubeadm/master/manifests.go b/cmd/kubeadm/app/master/manifests.go similarity index 98% rename from pkg/kubeadm/master/manifests.go rename to cmd/kubeadm/app/master/manifests.go index a81f1eb793..b08adda1e8 100644 --- a/pkg/kubeadm/master/manifests.go +++ b/cmd/kubeadm/app/master/manifests.go @@ -26,8 +26,8 @@ import ( "k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/unversioned" api "k8s.io/kubernetes/pkg/api/v1" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - "k8s.io/kubernetes/pkg/kubeadm/images" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" + "k8s.io/kubernetes/cmd/kubeadm/app/images" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/util/intstr" ) diff --git a/pkg/kubeadm/master/pki.go b/cmd/kubeadm/app/master/pki.go similarity index 99% rename from pkg/kubeadm/master/pki.go rename to cmd/kubeadm/app/master/pki.go index a28189c10a..e904d41673 100644 --- a/pkg/kubeadm/master/pki.go +++ b/cmd/kubeadm/app/master/pki.go @@ -22,7 +22,7 @@ import ( "fmt" "path" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" ipallocator "k8s.io/kubernetes/pkg/registry/service/ipallocator" certutil "k8s.io/kubernetes/pkg/util/cert" ) diff --git a/pkg/kubeadm/master/tokens.go b/cmd/kubeadm/app/master/tokens.go similarity index 94% rename from pkg/kubeadm/master/tokens.go rename to cmd/kubeadm/app/master/tokens.go index f741105d58..8f0cfd1c5e 100644 --- a/pkg/kubeadm/master/tokens.go +++ b/cmd/kubeadm/app/master/tokens.go @@ -22,8 +22,8 @@ import ( "os" "path" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - kubeadmutil "k8s.io/kubernetes/pkg/kubeadm/util" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/util/uuid" ) diff --git a/pkg/kubeadm/node/csr.go b/cmd/kubeadm/app/node/csr.go similarity index 97% rename from pkg/kubeadm/node/csr.go rename to cmd/kubeadm/app/node/csr.go index 28fb584e56..012bd573d0 100644 --- a/pkg/kubeadm/node/csr.go +++ b/cmd/kubeadm/app/node/csr.go @@ -28,8 +28,8 @@ import ( "k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - kubeadmutil "k8s.io/kubernetes/pkg/kubeadm/util" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" + kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" "k8s.io/kubernetes/pkg/kubelet/util/csr" certutil "k8s.io/kubernetes/pkg/util/cert" ) diff --git a/pkg/kubeadm/node/discovery.go b/cmd/kubeadm/app/node/discovery.go similarity index 98% rename from pkg/kubeadm/node/discovery.go rename to cmd/kubeadm/app/node/discovery.go index 8ec04b10d1..1f837fb231 100644 --- a/pkg/kubeadm/node/discovery.go +++ b/cmd/kubeadm/app/node/discovery.go @@ -25,7 +25,7 @@ import ( jose "github.com/square/go-jose" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" ) func RetrieveTrustedClusterInfo(s *kubeadmapi.KubeadmConfig) (*clientcmdapi.Config, error) { diff --git a/pkg/kubeadm/util/kubeconfig.go b/cmd/kubeadm/app/util/kubeconfig.go similarity index 98% rename from pkg/kubeadm/util/kubeconfig.go rename to cmd/kubeadm/app/util/kubeconfig.go index b7f3919fc0..e419a3a833 100644 --- a/pkg/kubeadm/util/kubeconfig.go +++ b/cmd/kubeadm/app/util/kubeconfig.go @@ -24,7 +24,7 @@ import ( // TODO: "k8s.io/client-go/client/tools/clientcmd/api" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" ) func CreateBasicClientConfig(clusterName string, serverURL string, caCert []byte) *clientcmdapi.Config { diff --git a/pkg/kubeadm/util/tokens.go b/cmd/kubeadm/app/util/tokens.go similarity index 97% rename from pkg/kubeadm/util/tokens.go rename to cmd/kubeadm/app/util/tokens.go index 1e016088b4..44bc4e69f0 100644 --- a/pkg/kubeadm/util/tokens.go +++ b/cmd/kubeadm/app/util/tokens.go @@ -22,7 +22,7 @@ import ( "fmt" "strings" - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api" ) const ( diff --git a/pkg/kubeadm/.gitignore b/pkg/kubeadm/.gitignore deleted file mode 100644 index a8a20d9f1b..0000000000 --- a/pkg/kubeadm/.gitignore +++ /dev/null @@ -1 +0,0 @@ -kubeadm diff --git a/pkg/kubeadm/cmd/manual.go b/pkg/kubeadm/cmd/manual.go deleted file mode 100644 index 2b397a47a8..0000000000 --- a/pkg/kubeadm/cmd/manual.go +++ /dev/null @@ -1,250 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package cmd - -import ( - "fmt" - "io" - "net" - - "github.com/renstrom/dedent" - "github.com/spf13/cobra" - - kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api" - kubemaster "k8s.io/kubernetes/pkg/kubeadm/master" - kubenode "k8s.io/kubernetes/pkg/kubeadm/node" - kubeadmutil "k8s.io/kubernetes/pkg/kubeadm/util" - cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" - netutil "k8s.io/kubernetes/pkg/util/net" -) - -var ( - manual_init_done_msgf = dedent.Dedent(` - Master initialization complete: - - * Static pods written and kubelet's kubeconfig written. - * Kubelet should start soon. Try 'systemctl restart kubelet' - or equivalent if it doesn't. - - CA cert is written to: - /etc/kubernetes/pki/ca.pem. - - **Please copy this file (scp, rsync or through other means) to - all your nodes and then run on them**: - - kubeadm manual bootstrap join-node --ca-cert-file \ - --token %s --api-server-urls https://%s:443/ - `) - manual_join_done_msgf = dedent.Dedent(` - Node join complete: - * Certificate signing request sent to master and response - received. - * Kubelet informed of new secure connection details. - - Run 'kubectl get nodes' on the master to see this node join. - `) -) - -// TODO --token here becomes `s.Secrets.BearerToken` and not `s.Secrets.GivenToken` -// may be we should make it the same and ask user to pass dot-separated tokens -// in any of the modes; we could also enable discovery API in the manual mode just -// as well, there is no reason we shouldn't let user mix and match modes, unless -// it is too difficult to support - -func NewCmdManual(out io.Writer, s *kubeadmapi.KubeadmConfig) *cobra.Command { - cmd := &cobra.Command{ - Use: "manual", - Short: "Advanced, less-automated functionality, for power users.", - // TODO put example usage in the Long description here - } - cmd.AddCommand(NewCmdManualBootstrap(out, s)) - return cmd -} - -func NewCmdManualBootstrap(out io.Writer, s *kubeadmapi.KubeadmConfig) *cobra.Command { - cmd := &cobra.Command{ - Use: "bootstrap", - Short: "Manually bootstrap a cluster 'out-of-band'", - Long: dedent.Dedent(` - Manually bootstrap a cluster 'out-of-band', by generating and distributing a CA - certificate to all your servers and specifying and (list of) API server URLs. - `), - Run: func(cmd *cobra.Command, args []string) { - }, - } - cmd.AddCommand(NewCmdManualBootstrapInitMaster(out, s)) - cmd.AddCommand(NewCmdManualBootstrapJoinNode(out, s)) - - return cmd -} - -func NewCmdManualBootstrapInitMaster(out io.Writer, s *kubeadmapi.KubeadmConfig) *cobra.Command { - advertiseAddrs := &[]string{} - cmd := &cobra.Command{ - Use: "init-master", - Short: "Manually bootstrap a master 'out-of-band'", - Long: dedent.Dedent(` - Manually bootstrap a master 'out-of-band'. - Will create TLS certificates and set up static pods for Kubernetes master - components. - `), - Run: func(cmd *cobra.Command, args []string) { - err := RunManualBootstrapInitMaster(out, cmd, args, s, advertiseAddrs) - cmdutil.CheckErr(err) - }, - } - - cmd.PersistentFlags().StringVar( - &s.Secrets.BearerToken, "token", "", - `(optional) Shared secret used to secure bootstrap. Will be generated and displayed if not provided.`, - ) - cmd.PersistentFlags().StringSliceVar( - advertiseAddrs, "api-advertise-addr", nil, - `(optional) IP address to advertise, in case autodetection fails.`, - ) - cmd.PersistentFlags().StringSliceVar( - &s.InitFlags.API.ExternalDNSName, "api-external-dns-name", []string{}, - `(optional) DNS name to advertise, in case you have configured one yourself.`, - ) - cmd.PersistentFlags().IPNetVar( - &s.InitFlags.Services.CIDR, "service-cidr", *kubeadmapi.DefaultServicesCIDR, - `(optional) use alterantive range of IP address for service VIPs, e.g. "10.16.0.0/12"`, - ) - cmd.PersistentFlags().StringVar( - &s.InitFlags.Services.DNSDomain, "service-dns-domain", "cluster.local", - `(optional) use alterantive domain name for services, e.g. "myorg.internal"`, - ) - cmd.PersistentFlags().BoolVar( - &s.InitFlags.Schedulable, "schedule-workload", false, - `(optional) allow to schedule workload to the node`, - ) - - return cmd -} - -func RunManualBootstrapInitMaster(out io.Writer, cmd *cobra.Command, args []string, s *kubeadmapi.KubeadmConfig, advertiseAddrs *[]string) error { - // Auto-detect the IP - if len(*advertiseAddrs) == 0 { - // TODO(phase1+) perhaps we could actually grab eth0 and eth1 - ip, err := netutil.ChooseHostInterface() - if err != nil { - return err - } - s.InitFlags.API.AdvertiseAddrs = []net.IP{ip} - } else { - for _, i := range *advertiseAddrs { - addr := net.ParseIP(i) - if addr == nil { - return fmt.Errorf(" failed to parse flag (%q) as an IP address", "--api-advertise-addr="+i) - } - s.InitFlags.API.AdvertiseAddrs = append(s.InitFlags.API.AdvertiseAddrs, addr) - } - } - - if err := kubemaster.CreateTokenAuthFile(s); err != nil { - return err - } - if err := kubemaster.WriteStaticPodManifests(s); err != nil { - return err - } - caKey, caCert, err := kubemaster.CreatePKIAssets(s) - if err != nil { - return err - } - kubeconfigs, err := kubemaster.CreateCertsAndConfigForClients(s, []string{"kubelet", "admin"}, caKey, caCert) - if err != nil { - return err - } - for name, kubeconfig := range kubeconfigs { - if err := kubeadmutil.WriteKubeconfigIfNotExists(s, name, kubeconfig); err != nil { - return err - } - } - - // TODO we have most of cmd/init functionality here, except for `CreateDiscoveryDeploymentAndSecret()` - // it may be a good idea to just merge the two commands into one, and it's something we have started talking - // about, the only question is where disco service should be an opt-out... - - client, err := kubemaster.CreateClientAndWaitForAPI(kubeconfigs["admin"]) - if err != nil { - return err - } - - if err := kubemaster.UpdateMasterRoleLabelsAndTaints(client, s.Schedulable); err != nil { - return err - } - - if err := kubemaster.CreateEssentialAddons(s, client); err != nil { - return err - } - - // TODO use templates to reference struct fields directly as order of args is fragile - fmt.Fprintf(out, manual_init_done_msgf, - s.Secrets.BearerToken, - s.InitFlags.API.AdvertiseAddrs[0].String(), - ) - return nil -} - -func NewCmdManualBootstrapJoinNode(out io.Writer, s *kubeadmapi.KubeadmConfig) *cobra.Command { - cmd := &cobra.Command{ - Use: "join-node", - Short: "Manually bootstrap a node 'out-of-band', joining it into a cluster with extant control plane", - - Run: func(cmd *cobra.Command, args []string) { - err := RunManualBootstrapJoinNode(out, cmd, args, s) - cmdutil.CheckErr(err) - }, - } - cmd.PersistentFlags().StringVarP(&s.ManualFlags.CaCertFile, "ca-cert-file", "", "", - `Path to a CA cert file in PEM format. The same CA cert must be distributed to - all servers.`) - cmd.PersistentFlags().StringVarP(&s.ManualFlags.ApiServerURLs, "api-server-urls", "", "", - `Comma separated list of API server URLs. Typically this might be just - https://:8080/`) - cmd.PersistentFlags().StringVarP(&s.ManualFlags.BearerToken, "token", "", "", - `Shared secret used to secure bootstrap. Must match output of 'init-master'.`) - - return cmd -} - -func RunManualBootstrapJoinNode(out io.Writer, cmd *cobra.Command, args []string, s *kubeadmapi.KubeadmConfig) error { - if s.ManualFlags.CaCertFile == "" { - fmt.Fprintf(out, "Must specify --ca-cert-file (see --help)\n") - return nil - } - - if s.ManualFlags.ApiServerURLs == "" { - fmt.Fprintf(out, "Must specify --api-server-urls (see --help)\n") - return nil - } - - kubeconfig, err := kubenode.PerformTLSBootstrapFromConfig(s) - if err != nil { - fmt.Fprintf(out, "Failed to perform TLS bootstrap: %s\n", err) - return err - } - - err = kubeadmutil.WriteKubeconfigIfNotExists(s, "kubelet", kubeconfig) - if err != nil { - fmt.Fprintf(out, "Unable to write config for node:\n%s\n", err) - return err - } - - fmt.Fprintf(out, manual_join_done_msgf) - return nil -}