Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kubeadm: Detect CRIs automatically #69366

Merged
merged 1 commit into from
Jan 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions cmd/kubeadm/app/apis/kubeadm/v1alpha3/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error {
// SetDefaults_InitConfiguration assigns default values for the InitConfiguration
func SetDefaults_InitConfiguration(obj *InitConfiguration) {
SetDefaults_ClusterConfiguration(&obj.ClusterConfiguration)
SetDefaults_NodeRegistrationOptions(&obj.NodeRegistration)
SetDefaults_BootstrapTokens(obj)
SetDefaults_APIEndpoint(&obj.APIEndpoint)
}
Expand Down Expand Up @@ -139,16 +138,9 @@ func SetDefaults_JoinConfiguration(obj *JoinConfiguration) {
}
}

SetDefaults_NodeRegistrationOptions(&obj.NodeRegistration)
SetDefaults_APIEndpoint(&obj.APIEndpoint)
}

func SetDefaults_NodeRegistrationOptions(obj *NodeRegistrationOptions) {
if obj.CRISocket == "" {
obj.CRISocket = DefaultCRISocket
}
}

// SetDefaults_AuditPolicyConfiguration sets default values for the AuditPolicyConfiguration
func SetDefaults_AuditPolicyConfiguration(obj *ClusterConfiguration) {
if obj.AuditPolicyConfiguration.LogDir == "" {
Expand Down
4 changes: 0 additions & 4 deletions cmd/kubeadm/app/apis/kubeadm/v1alpha3/defaults_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,4 @@ package v1alpha3
const (
// DefaultCACertPath defines default location of CA certificate on Linux
DefaultCACertPath = "/etc/kubernetes/pki/ca.crt"
// DefaultUrlScheme defines default socket url prefix
DefaultUrlScheme = "unix"
// DefaultCRISocket defines the default cri socket
DefaultCRISocket = "/var/run/dockershim.sock"
)
4 changes: 0 additions & 4 deletions cmd/kubeadm/app/apis/kubeadm/v1alpha3/defaults_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,4 @@ package v1alpha3
const (
// DefaultCACertPath defines default location of CA certificate on Windows
DefaultCACertPath = "C:/etc/kubernetes/pki/ca.crt"
// DefaultUrlScheme defines default socket url prefix
DefaultUrlScheme = "tcp"
// DefaultCRISocket defines the default cri socket
DefaultCRISocket = "tcp://localhost:2375"
)

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 0 additions & 8 deletions cmd/kubeadm/app/apis/kubeadm/v1beta1/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error {
// SetDefaults_InitConfiguration assigns default values for the InitConfiguration
func SetDefaults_InitConfiguration(obj *InitConfiguration) {
SetDefaults_ClusterConfiguration(&obj.ClusterConfiguration)
SetDefaults_NodeRegistrationOptions(&obj.NodeRegistration)
SetDefaults_BootstrapTokens(obj)
SetDefaults_APIEndpoint(&obj.LocalAPIEndpoint)
}
Expand Down Expand Up @@ -138,17 +137,10 @@ func SetDefaults_JoinConfiguration(obj *JoinConfiguration) {
obj.CACertPath = DefaultCACertPath
}

SetDefaults_NodeRegistrationOptions(&obj.NodeRegistration)
SetDefaults_JoinControlPlane(obj.ControlPlane)
SetDefaults_Discovery(&obj.Discovery)
}

func SetDefaults_NodeRegistrationOptions(obj *NodeRegistrationOptions) {
if obj.CRISocket == "" {
obj.CRISocket = DefaultCRISocket
}
}

func SetDefaults_JoinControlPlane(obj *JoinControlPlane) {
if obj != nil {
SetDefaults_APIEndpoint(&obj.LocalAPIEndpoint)
Expand Down
2 changes: 0 additions & 2 deletions cmd/kubeadm/app/apis/kubeadm/v1beta1/defaults_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,4 @@ const (
DefaultCACertPath = "/etc/kubernetes/pki/ca.crt"
// DefaultUrlScheme defines default socket url prefix
DefaultUrlScheme = "unix"
// DefaultCRISocket defines the default cri socket
DefaultCRISocket = "/var/run/dockershim.sock"
)
2 changes: 0 additions & 2 deletions cmd/kubeadm/app/apis/kubeadm/v1beta1/defaults_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,4 @@ const (
DefaultCACertPath = "C:/etc/kubernetes/pki/ca.crt"
// DefaultUrlScheme defines default socket url prefix
DefaultUrlScheme = "tcp"
// DefaultCRISocket defines the default cri socket
DefaultCRISocket = "tcp://localhost:2375"
)
2 changes: 0 additions & 2 deletions cmd/kubeadm/app/apis/kubeadm/v1beta1/zz_generated.defaults.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 7 additions & 8 deletions cmd/kubeadm/app/cmd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@ func getDefaultedInitConfig() (*kubeadmapi.InitConfiguration, error) {
KubernetesVersion: fmt.Sprintf("v1.%d.0", constants.MinimumControlPlaneVersion.Minor()+1),
},
BootstrapTokens: []kubeadmapiv1beta1.BootstrapToken{placeholderToken},
NodeRegistration: kubeadmapiv1beta1.NodeRegistrationOptions{
CRISocket: constants.DefaultDockerCRISocket, // avoid CRI detection
},
})
}

Expand All @@ -206,6 +209,9 @@ func getDefaultNodeConfigBytes() ([]byte, error) {
UnsafeSkipCAVerification: true, // TODO: UnsafeSkipCAVerification: true needs to be set for validation to pass, but shouldn't be recommended as the default
},
},
NodeRegistration: kubeadmapiv1beta1.NodeRegistrationOptions{
CRISocket: constants.DefaultDockerCRISocket, // avoid CRI detection
},
})
if err != nil {
return []byte{}, err
Expand Down Expand Up @@ -430,7 +436,7 @@ func NewCmdConfigImagesPull() *cobra.Command {
},
}
AddImagesCommonConfigFlags(cmd.PersistentFlags(), externalcfg, &cfgPath, &featureGatesString)
AddImagesPullFlags(cmd.PersistentFlags(), externalcfg)
cmdutil.AddCRISocketFlag(cmd.PersistentFlags(), &externalcfg.NodeRegistration.CRISocket)

return cmd
}
Expand Down Expand Up @@ -525,10 +531,3 @@ func AddImagesCommonConfigFlags(flagSet *flag.FlagSet, cfg *kubeadmapiv1beta1.In
"Options are:\n"+strings.Join(features.KnownFeatures(&features.InitFeatureGates), "\n"))
flagSet.StringVar(cfgPath, "config", *cfgPath, "Path to kubeadm config file.")
}

// AddImagesPullFlags adds flags related to the `kubeadm config images pull` command
func AddImagesPullFlags(flagSet *flag.FlagSet, cfg *kubeadmapiv1beta1.InitConfiguration) {
flagSet.StringVar(&cfg.NodeRegistration.CRISocket, "cri-socket", cfg.NodeRegistration.CRISocket, "Specify the CRI socket to connect to.")
flagSet.StringVar(&cfg.NodeRegistration.CRISocket, "cri-socket-path", cfg.NodeRegistration.CRISocket, "Path to the CRI socket.")
rosti marked this conversation as resolved.
Show resolved Hide resolved
flagSet.MarkDeprecated("cri-socket-path", "Please, use --cri-socket instead")
}
14 changes: 13 additions & 1 deletion cmd/kubeadm/app/cmd/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,9 @@ func TestConfigImagesListRunWithoutPath(t *testing.T) {
ClusterConfiguration: kubeadmapiv1beta1.ClusterConfiguration{
KubernetesVersion: dummyKubernetesVersion,
},
NodeRegistration: kubeadmapiv1beta1.NodeRegistrationOptions{
CRISocket: constants.DefaultDockerCRISocket,
},
},
},
{
Expand All @@ -158,6 +161,9 @@ func TestConfigImagesListRunWithoutPath(t *testing.T) {
},
KubernetesVersion: dummyKubernetesVersion,
},
NodeRegistration: kubeadmapiv1beta1.NodeRegistrationOptions{
CRISocket: constants.DefaultDockerCRISocket,
},
},
expectedImages: defaultNumberOfImages - 1,
},
Expand All @@ -167,6 +173,9 @@ func TestConfigImagesListRunWithoutPath(t *testing.T) {
ClusterConfiguration: kubeadmapiv1beta1.ClusterConfiguration{
KubernetesVersion: dummyKubernetesVersion,
},
NodeRegistration: kubeadmapiv1beta1.NodeRegistrationOptions{
CRISocket: constants.DefaultDockerCRISocket,
},
},
expectedImages: defaultNumberOfImages,
},
Expand All @@ -179,6 +188,9 @@ func TestConfigImagesListRunWithoutPath(t *testing.T) {
Type: kubeadmapiv1beta1.KubeDNS,
},
},
NodeRegistration: kubeadmapiv1beta1.NodeRegistrationOptions{
CRISocket: constants.DefaultDockerCRISocket,
},
},
expectedImages: defaultNumberOfImages + 2,
},
Expand Down Expand Up @@ -226,7 +238,7 @@ func TestImagesPull(t *testing.T) {
LookPathFunc: func(cmd string) (string, error) { return "/usr/bin/docker", nil },
}

containerRuntime, err := utilruntime.NewContainerRuntime(&fexec, kubeadmapiv1beta1.DefaultCRISocket)
containerRuntime, err := utilruntime.NewContainerRuntime(&fexec, constants.DefaultDockerCRISocket)
if err != nil {
t.Errorf("unexpected NewContainerRuntime error: %v", err)
}
Expand Down
7 changes: 2 additions & 5 deletions cmd/kubeadm/app/cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,10 +230,7 @@ func AddInitConfigFlags(flagSet *flag.FlagSet, cfg *kubeadmapiv1beta1.InitConfig
&cfg.NodeRegistration.Name, options.NodeName, cfg.NodeRegistration.Name,
`Specify the node name.`,
)
flagSet.StringVar(
&cfg.NodeRegistration.CRISocket, options.NodeCRISocket, cfg.NodeRegistration.CRISocket,
`Specify the CRI socket to connect to.`,
)
cmdutil.AddCRISocketFlag(flagSet, &cfg.NodeRegistration.CRISocket)
flagSet.StringVar(featureGatesString, options.FeatureGatesString, *featureGatesString, "A set of key=value pairs that describe feature gates for various features. "+
"Options are:\n"+strings.Join(features.KnownFeatures(&features.InitFeatureGates), "\n"))
}
Expand Down Expand Up @@ -316,7 +313,7 @@ func newInitData(cmd *cobra.Command, options *initOptions, out io.Writer) (initD
if options.externalcfg.NodeRegistration.Name != "" {
cfg.NodeRegistration.Name = options.externalcfg.NodeRegistration.Name
}
if options.externalcfg.NodeRegistration.CRISocket != kubeadmapiv1beta1.DefaultCRISocket {
if options.externalcfg.NodeRegistration.CRISocket != "" {
cfg.NodeRegistration.CRISocket = options.externalcfg.NodeRegistration.CRISocket
}

Expand Down
8 changes: 3 additions & 5 deletions cmd/kubeadm/app/cmd/join.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
"k8s.io/kubernetes/cmd/kubeadm/app/discovery"
certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs"
Expand Down Expand Up @@ -232,17 +233,14 @@ func AddJoinConfigFlags(flagSet *flag.FlagSet, cfg *kubeadmapiv1beta1.JoinConfig
&cfg.NodeRegistration.Name, options.NodeName, cfg.NodeRegistration.Name,
`Specify the node name.`,
)
flagSet.StringVar(
&cfg.NodeRegistration.CRISocket, options.NodeCRISocket, cfg.NodeRegistration.CRISocket,
`Specify the CRI socket to connect to.`,
)
flagSet.StringVar(
&cfg.Discovery.TLSBootstrapToken, options.TLSBootstrapToken, cfg.Discovery.TLSBootstrapToken,
`Specify the token used to temporarily authenticate with the Kubernetes Master while joining the node.`,
)
AddControlPlaneFlags(flagSet, cfg.ControlPlane)
AddJoinBootstrapTokenDiscoveryFlags(flagSet, cfg.Discovery.BootstrapToken)
AddJoinFileDiscoveryFlags(flagSet, cfg.Discovery.File)
cmdutil.AddCRISocketFlag(flagSet, &cfg.NodeRegistration.CRISocket)
}

// AddJoinBootstrapTokenDiscoveryFlags adds bootstrap token specific discovery flags to the specified flagset
Expand Down Expand Up @@ -388,7 +386,7 @@ func newJoinData(cmd *cobra.Command, options *joinOptions, out io.Writer) (joinD
if options.externalcfg.NodeRegistration.Name != "" {
cfg.NodeRegistration.Name = options.externalcfg.NodeRegistration.Name
}
if options.externalcfg.NodeRegistration.CRISocket != kubeadmapiv1beta1.DefaultCRISocket {
if options.externalcfg.NodeRegistration.CRISocket != "" {
cfg.NodeRegistration.CRISocket = options.externalcfg.NodeRegistration.CRISocket
}

Expand Down
22 changes: 18 additions & 4 deletions cmd/kubeadm/app/cmd/reset.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ func NewCmdReset(in io.Reader, out io.Writer) *cobra.Command {
kubeadmutil.CheckErr(err)
}

if criSocketPath != "" {
criSocketPath, err = resetDetectCRISocket(client)
kubeadmutil.CheckErr(err)
klog.V(1).Infof("[reset] detected and using CRI socket: %s", criSocketPath)
}

r, err := NewReset(in, ignorePreflightErrorsSet, forceReset, certsDir, criSocketPath)
kubeadmutil.CheckErr(err)
kubeadmutil.CheckErr(r.Run(out, client))
Expand All @@ -81,10 +87,7 @@ func NewCmdReset(in io.Reader, out io.Writer) *cobra.Command {
"The path to the directory where the certificates are stored. If specified, clean this directory.",
)

cmd.PersistentFlags().StringVar(
&criSocketPath, "cri-socket", kubeadmapiv1beta1.DefaultCRISocket,
"The path to the CRI socket to use with crictl when cleaning up containers.",
)
cmdutil.AddCRISocketFlag(cmd.PersistentFlags(), &criSocketPath)

cmd.PersistentFlags().BoolVarP(
&forceReset, "force", "f", false,
Expand Down Expand Up @@ -295,3 +298,14 @@ func resetConfigDir(configPathDir, pkiPathDir string) {
}
}
}

func resetDetectCRISocket(client clientset.Interface) (string, error) {
// first try to connect to the cluster for the CRI socket
cfg, err := configutil.FetchConfigFromFileOrCluster(client, os.Stdout, "reset", "", false)
if err == nil {
return cfg.NodeRegistration.CRISocket, nil
}

// if this fails, try to detect it
return utilruntime.DetectCRISocket()
}
2 changes: 1 addition & 1 deletion cmd/kubeadm/app/cmd/reset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func assertDirEmpty(t *testing.T, path string) {
func TestNewReset(t *testing.T) {
var in io.Reader
certsDir := kubeadmapiv1beta1.DefaultCertificatesDir
criSocketPath := kubeadmapiv1beta1.DefaultCRISocket
criSocketPath := kubeadmconstants.DefaultDockerCRISocket
forceReset := true

ignorePreflightErrors := []string{"all"}
Expand Down
10 changes: 7 additions & 3 deletions cmd/kubeadm/app/cmd/upgrade/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
"k8s.io/kubernetes/cmd/kubeadm/app/features"
Expand Down Expand Up @@ -70,7 +71,7 @@ func NewCmdApply(apf *applyPlanFlags) *cobra.Command {
applyPlanFlags: apf,
imagePullTimeout: defaultImagePullTimeout,
etcdUpgrade: true,
criSocket: kubeadmapiv1beta1.DefaultCRISocket,
// Don't set criSocket to a default value here, as this will override the setting in the stored config in RunApply below.
rosti marked this conversation as resolved.
Show resolved Hide resolved
}

cmd := &cobra.Command{
Expand Down Expand Up @@ -127,8 +128,11 @@ func NewCmdApply(apf *applyPlanFlags) *cobra.Command {
cmd.Flags().BoolVar(&flags.dryRun, "dry-run", flags.dryRun, "Do not change any state, just output what actions would be performed.")
cmd.Flags().BoolVar(&flags.etcdUpgrade, "etcd-upgrade", flags.etcdUpgrade, "Perform the upgrade of etcd.")
cmd.Flags().DurationVar(&flags.imagePullTimeout, "image-pull-timeout", flags.imagePullTimeout, "The maximum amount of time to wait for the control plane pods to be downloaded.")
// TODO: Register this flag in a generic place
cmd.Flags().StringVar(&flags.criSocket, "cri-socket", flags.criSocket, "Specify the CRI socket to connect to.")

// The CRI socket flag is deprecated here, since it should be taken from the NodeRegistrationOptions for the current
// node instead of the command line. This prevents errors by the users (such as attempts to use wrong CRI during upgrade).
cmdutil.AddCRISocketFlag(cmd.Flags(), &flags.criSocket)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this mean there will be no way to force a specific CRI? In that case, what would happen if users have docker and crio running at the same time?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i had concerns about this myself but forgot to mention at today's office hours. :
maybe we still want a flag that is set to a value of "auto" by default.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is error prone and is there only for historical reasons. It's there, because in the past we did not keep the CRI socket in the cluster on per node basis.
As long as the option is still there, you can use it, but it's now deprecated.
Anyway, forcing the CRI should be done upon init/join and then leave kubeadm to use that socket for all other operations. In fact, strictly speaking, the only operations that should allow passing of CRI sockets should be init, join and reset.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In fact, strictly speaking, the only operations that should allow passing of CRI sockets should be init, join and reset.

do you think we should undeprecated the flag and have it with a value of "auto" by default?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think so, it's best that this flag is removed altogether. The only thing, that users can attempt to do with this flag is to change the CRI upon upgrade. However, I don't think, that this is going to work properly and I don't think, that we should support such user story.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but how would we handle the scenario @inercia mentioned:

Does this mean there will be no way to force a specific CRI? In that case, what would happen if users have docker and crio running at the same time?

i.e. multiple CRIs installed. how would the user pick one of the sockets?

Copy link
Contributor Author

@rosti rosti Jan 24, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The persisted NodeRegistrationOptions in the cluster for this node is going to contain a CRI socket, that was setup upon init/join. Hence, no detection will be required.

cmd.Flags().MarkDeprecated(options.NodeCRISocket, "This flag is deprecated. Please, avoid using it.")
return cmd
}

Expand Down
2 changes: 2 additions & 0 deletions cmd/kubeadm/app/cmd/util/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ go_library(
importpath = "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util",
visibility = ["//visibility:public"],
deps = [
"//cmd/kubeadm/app/cmd/options:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
"//cmd/kubeadm/app/util/pubkeypin:go_default_library",
Expand All @@ -18,6 +19,7 @@ go_library(
"//staging/src/k8s.io/client-go/util/cert:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/github.com/spf13/pflag:go_default_library",
],
)

Expand Down
10 changes: 10 additions & 0 deletions cmd/kubeadm/app/cmd/util/cmdutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ package util
import (
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/spf13/pflag"

"k8s.io/client-go/tools/clientcmd"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
)

Expand Down Expand Up @@ -73,3 +75,11 @@ func FindExistingKubeConfig(file string) string {
rules.Precedence = append(rules.Precedence, kubeadmconstants.GetAdminKubeConfigPath())
return rules.GetDefaultFilename()
}

// AddCRISocketFlag adds the cri-socket flag to the supplied flagSet
func AddCRISocketFlag(flagSet *pflag.FlagSet, criSocket *string) {
flagSet.StringVar(
criSocket, options.NodeCRISocket, *criSocket,
"Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket.",
)
}
6 changes: 5 additions & 1 deletion cmd/kubeadm/app/constants/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ load(

go_library(
name = "go_default_library",
srcs = ["constants.go"],
srcs = [
"constants.go",
"constants_unix.go",
"constants_windows.go",
],
importpath = "k8s.io/kubernetes/cmd/kubeadm/app/constants",
deps = [
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
Expand Down
Loading