mirror of https://github.com/k3s-io/k3s
Move `pkg/kubadm` to `cmd/kubeadm/app`, remove `cmd/manual.go`
parent
ca8a7a2c1c
commit
a42ad6a913
|
@ -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
|
||||
}
|
|
@ -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"
|
||||
)
|
|
@ -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"
|
||||
)
|
||||
|
|
@ -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"
|
||||
)
|
||||
|
|
|
@ -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"
|
||||
)
|
|
@ -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"
|
||||
)
|
||||
|
|
@ -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"
|
||||
)
|
||||
|
|
@ -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"
|
||||
)
|
|
@ -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"
|
||||
)
|
|
@ -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"
|
||||
)
|
|
@ -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"
|
||||
)
|
|
@ -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) {
|
|
@ -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 {
|
|
@ -22,7 +22,7 @@ import (
|
|||
"fmt"
|
||||
"strings"
|
||||
|
||||
kubeadmapi "k8s.io/kubernetes/pkg/kubeadm/api"
|
||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/api"
|
||||
)
|
||||
|
||||
const (
|
|
@ -1 +0,0 @@
|
|||
kubeadm
|
|
@ -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 <path-to-ca-cert> \
|
||||
--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("<cmd/init> 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://<address-of-master>: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
|
||||
}
|
Loading…
Reference in New Issue