Add feature gates support for Kubeadm

pull/2980/merge
kairen 2018-07-01 02:05:58 +08:00 committed by dlorenc
parent 33fce13254
commit ccaec1db0e
5 changed files with 54 additions and 13 deletions

View File

@ -65,6 +65,7 @@ const (
keepContext = "keep-context"
createMount = "mount"
featureGates = "feature-gates"
kubeadmFeatureGates = "kubeadm-feature-gates"
apiServerName = "apiserver-name"
dnsDomain = "dns-domain"
mountString = "mount-string"
@ -223,6 +224,7 @@ func runStart(cmd *cobra.Command, args []string) {
APIServerIPs: apiServerIPs,
DNSDomain: viper.GetString(dnsDomain),
FeatureGates: viper.GetString(featureGates),
KubeadmFeatureGates: viper.GetString(kubeadmFeatureGates),
ContainerRuntime: viper.GetString(containerRuntime),
NetworkPlugin: viper.GetString(networkPlugin),
ServiceCIDR: pkgutil.DefaultServiceCIDR,
@ -417,6 +419,7 @@ func init() {
startCmd.Flags().String(containerRuntime, "", "The container runtime to be used")
startCmd.Flags().String(networkPlugin, "", "The name of the network plugin")
startCmd.Flags().String(featureGates, "", "A set of key=value pairs that describe feature gates for alpha/experimental features.")
startCmd.Flags().String(kubeadmFeatureGates, "", "A set of key=value pairs that describe feature gates for kubeadm alpha/experimental features.")
startCmd.Flags().Bool(cacheImages, false, "If true, cache docker images for the current bootstrapper and load them into the machine.")
startCmd.Flags().Var(&extraOptions, "extra-config",
`A set of key=value pairs that describe configuration that may be passed to different components.

View File

@ -340,6 +340,12 @@ func generateConfig(k8s config.KubernetesConfig) (string, error) {
return "", errors.Wrap(err, "generating extra component config for kubeadm")
}
// generates a map of the feature gates for kubeadm
kubeadmFeatureArgs, err := ParseKubeadmFeatureArgs(k8s.KubeadmFeatureGates)
if err != nil {
return "", errors.Wrap(err, "generating feature gate config for kubeadm")
}
opts := struct {
CertDir string
ServiceCIDR string
@ -349,6 +355,7 @@ func generateConfig(k8s config.KubernetesConfig) (string, error) {
EtcdDataDir string
NodeName string
ExtraArgs []ComponentExtraArgs
FeatureArgs FeatureArgs
}{
CertDir: util.DefaultCertPath,
ServiceCIDR: util.DefaultServiceCIDR,
@ -358,6 +365,7 @@ func generateConfig(k8s config.KubernetesConfig) (string, error) {
EtcdDataDir: "/data/minikube", //TODO(r2d4): change to something else persisted
NodeName: k8s.NodeName,
ExtraArgs: extraComponentConfig,
FeatureArgs: kubeadmFeatureArgs,
}
b := bytes.Buffer{}

View File

@ -38,7 +38,9 @@ etcd:
dataDir: {{.EtcdDataDir}}
nodeName: {{.NodeName}}
{{range .ExtraArgs}}{{.Component}}:{{range $i, $val := printMapInOrder .Options ": " }}
{{$val}}{{end}}
{{$val}}{{end}}{{end}}
{{if .FeatureArgs}}featureGates: {{range $i, $val := .FeatureArgs}}
{{$i}}: {{$val}}{{end}}
{{end}}`))
var kubeletSystemdTemplate = template.Must(template.New("kubeletSystemdTemplate").Parse(`

View File

@ -20,6 +20,7 @@ import (
"fmt"
"path"
"sort"
"strconv"
"strings"
"github.com/blang/semver"
@ -63,6 +64,8 @@ type ComponentExtraArgs struct {
Options map[string]string
}
type FeatureArgs map[string]bool
var componentToKubeadmConfigKey = map[string]string{
Apiserver: "apiServerExtraArgs",
ControllerManager: "controllerManagerExtraArgs",
@ -108,6 +111,30 @@ func NewComponentExtraArgs(opts util.ExtraOptionSlice, version semver.Version, f
return kubeadmExtraArgs, nil
}
func ParseKubeadmFeatureArgs(featureGates string) (FeatureArgs, error) {
featureArgs := map[string]bool{}
for _, s := range strings.Split(featureGates, ",") {
if len(s) == 0 {
continue
}
fg := strings.SplitN(s, "=", 2)
if len(fg) != 2 {
return nil, fmt.Errorf("missing value for key \"%v\"", s)
}
k := strings.TrimSpace(fg[0])
v := strings.TrimSpace(fg[1])
boolValue, err := strconv.ParseBool(v)
if err != nil {
return nil, errors.Wrapf(err, "failed to convert bool value \"%v\"", v)
}
featureArgs[k] = boolValue
}
return featureArgs, nil
}
func ParseKubernetesVersion(version string) (semver.Version, error) {
// Strip leading 'v' prefix from version for semver parsing
v, err := semver.Make(version[1:])

View File

@ -55,18 +55,19 @@ type MachineConfig struct {
// KubernetesConfig contains the parameters used to configure the VM Kubernetes.
type KubernetesConfig struct {
KubernetesVersion string
NodeIP string
NodeName string
APIServerName string
APIServerNames []string
APIServerIPs []net.IP
DNSDomain string
ContainerRuntime string
NetworkPlugin string
FeatureGates string
ServiceCIDR string
ExtraOptions util.ExtraOptionSlice
KubernetesVersion string
NodeIP string
NodeName string
APIServerName string
APIServerNames []string
APIServerIPs []net.IP
DNSDomain string
ContainerRuntime string
NetworkPlugin string
FeatureGates string
KubeadmFeatureGates string
ServiceCIDR string
ExtraOptions util.ExtraOptionSlice
ShouldLoadCachedImages bool
}