Add feature gates support for Kubeadm
parent
33fce13254
commit
ccaec1db0e
|
@ -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.
|
||||
|
|
|
@ -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{}
|
||||
|
|
|
@ -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(`
|
||||
|
|
|
@ -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:])
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue