From 342f98d51642cea01355583cd169ee7c3e5d294d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Wed, 7 Dec 2016 16:24:02 +0200 Subject: [PATCH] Create a new cloud-provider flag in order to catch wrong args directly and don't import the cloudprovider package and save ~50% in binary size --- cmd/kubeadm/app/cmd/BUILD | 3 +- cmd/kubeadm/app/cmd/flags/BUILD | 18 ++++++ cmd/kubeadm/app/cmd/flags/cloudprovider.go | 70 ++++++++++++++++++++++ cmd/kubeadm/app/cmd/init.go | 19 +++--- cmd/kubeadm/app/master/manifests.go | 12 +++- 5 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 cmd/kubeadm/app/cmd/flags/BUILD create mode 100644 cmd/kubeadm/app/cmd/flags/cloudprovider.go diff --git a/cmd/kubeadm/app/cmd/BUILD b/cmd/kubeadm/app/cmd/BUILD index bc5ecf0a578..884451e5d8b 100644 --- a/cmd/kubeadm/app/cmd/BUILD +++ b/cmd/kubeadm/app/cmd/BUILD @@ -24,13 +24,12 @@ go_library( deps = [ "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", + "//cmd/kubeadm/app/cmd/flags:go_default_library", "//cmd/kubeadm/app/master:go_default_library", "//cmd/kubeadm/app/node:go_default_library", "//cmd/kubeadm/app/preflight:go_default_library", "//cmd/kubeadm/app/util:go_default_library", "//pkg/api:go_default_library", - "//pkg/cloudprovider:go_default_library", - "//pkg/cloudprovider/providers:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", "//pkg/runtime:go_default_library", "//pkg/util/flag:go_default_library", diff --git a/cmd/kubeadm/app/cmd/flags/BUILD b/cmd/kubeadm/app/cmd/flags/BUILD new file mode 100644 index 00000000000..2f28f57efca --- /dev/null +++ b/cmd/kubeadm/app/cmd/flags/BUILD @@ -0,0 +1,18 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_binary", + "go_library", + "go_test", + "cgo_library", +) + +go_library( + name = "go_default_library", + srcs = ["cloudprovider.go"], + tags = ["automanaged"], + deps = ["//vendor:github.com/spf13/pflag"], +) diff --git a/cmd/kubeadm/app/cmd/flags/cloudprovider.go b/cmd/kubeadm/app/cmd/flags/cloudprovider.go new file mode 100644 index 00000000000..0058344fb79 --- /dev/null +++ b/cmd/kubeadm/app/cmd/flags/cloudprovider.go @@ -0,0 +1,70 @@ +/* +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 flags + +import ( + "fmt" + + "github.com/spf13/pflag" +) + +var cloudproviders = []string{ + "aws", + "azure", + "cloudstack", + "gce", + "mesos", + "openstack", + "ovirt", + "photon", + "rackspace", + "vsphere", +} + +func NewCloudProviderFlag(provider *string) pflag.Value { + return &cloudProviderValue{provider: provider} +} + +type cloudProviderValue struct { + provider *string +} + +func (c *cloudProviderValue) String() string { + return *c.provider +} + +func (c *cloudProviderValue) Set(s string) error { + if ValidateCloudProvider(s) { + *c.provider = s + return nil + } + + return fmt.Errorf("cloud provider %q is not supported, you can use any of %v", s, cloudproviders) +} + +func (c *cloudProviderValue) Type() string { + return "cloudprovider" +} + +func ValidateCloudProvider(provider string) bool { + for _, supported := range cloudproviders { + if provider == supported { + return true + } + } + return false +} diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index aa889816701..ec070e2bd1c 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -28,12 +28,11 @@ import ( kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/flags" kubemaster "k8s.io/kubernetes/cmd/kubeadm/app/master" "k8s.io/kubernetes/cmd/kubeadm/app/preflight" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/cloudprovider" - _ "k8s.io/kubernetes/pkg/cloudprovider/providers" "k8s.io/kubernetes/pkg/runtime" netutil "k8s.io/kubernetes/pkg/util/net" ) @@ -103,9 +102,9 @@ func NewCmdInit(out io.Writer) *cobra.Command { &cfg.Networking.DNSDomain, "service-dns-domain", cfg.Networking.DNSDomain, `Use alternative domain for services, e.g. "myorg.internal"`, ) - cmd.PersistentFlags().StringVar( - &cfg.CloudProvider, "cloud-provider", cfg.CloudProvider, - `Enable cloud provider features (external load-balancers, storage, etc), e.g. "gce"`, + cmd.PersistentFlags().Var( + flags.NewCloudProviderFlag(&cfg.CloudProvider), "cloud-provider", + `Enable cloud provider features (external load-balancers, storage, etc). Note that you have to configure all kubelets manually`, ) cmd.PersistentFlags().StringVar( @@ -205,14 +204,12 @@ func NewInit(cfgPath string, cfg *kubeadmapi.MasterConfiguration, skipPreFlight cfg.KubernetesVersion = ver fmt.Println("Using Kubernetes version:", ver) - // TODO(phase1+) create a custom flag + // Warn about the limitations with the current cloudprovider solution. if cfg.CloudProvider != "" { - if cloudprovider.IsCloudProvider(cfg.CloudProvider) { - fmt.Printf("cloud provider %q initialized for the control plane. Remember to set the same cloud provider flag on the kubelet.\n", cfg.CloudProvider) - } else { - return nil, fmt.Errorf("cloud provider %q is not supported, you can use any of %v, or leave it unset.\n", cfg.CloudProvider, cloudprovider.CloudProviders()) - } + fmt.Println("WARNING: For cloudprovider integrations to work --cloud-provider must be set for all kubelets in the cluster.") + fmt.Println("\t(/etc/systemd/system/kubelet.service.d/10-kubeadm.conf should be edited for this purpose)") } + return &Init{cfg: cfg}, nil } diff --git a/cmd/kubeadm/app/master/manifests.go b/cmd/kubeadm/app/master/manifests.go index 71f96f4c176..b3ac7c222b6 100644 --- a/cmd/kubeadm/app/master/manifests.go +++ b/cmd/kubeadm/app/master/manifests.go @@ -34,10 +34,9 @@ import ( ) // Static pod definitions in golang form are included below so that `kubeadm init` can get going. - const ( DefaultClusterName = "kubernetes" - DefaultCloudConfigPath = "/etc/kubernetes/cloud-config.json" + DefaultCloudConfigPath = "/etc/kubernetes/cloud-config" etcd = "etcd" apiServer = "apiserver" @@ -264,6 +263,15 @@ func getAPIServerCommand(cfg *kubeadmapi.MasterConfiguration) (command []string) command = append(command, etcdClientFileArg, etcdKeyFileArg) } + if cfg.CloudProvider != "" { + command = append(command, "--cloud-provider="+cfg.CloudProvider) + + // Only append the --cloud-config option if there's a such file + if _, err := os.Stat(DefaultCloudConfigPath); err == nil { + command = append(command, "--cloud-config="+DefaultCloudConfigPath) + } + } + return }