diff --git a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go index e73495384e9..38b7358d48a 100644 --- a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go +++ b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go @@ -87,10 +87,10 @@ func fuzzClusterConfiguration(obj *kubeadm.ClusterConfiguration, c fuzz.Continue obj.APIServer.TimeoutForControlPlane = &metav1.Duration{ Duration: constants.DefaultControlPlaneTimeout, } - obj.ControllerManager.ExtraEnvs = []corev1.EnvVar{} - obj.APIServer.ExtraEnvs = []corev1.EnvVar{} - obj.Scheduler.ExtraEnvs = []corev1.EnvVar{} - obj.Etcd.Local.ExtraEnvs = []corev1.EnvVar{} + obj.ControllerManager.ExtraEnvs = []kubeadm.EnvVar{} + obj.APIServer.ExtraEnvs = []kubeadm.EnvVar{} + obj.Scheduler.ExtraEnvs = []kubeadm.EnvVar{} + obj.Etcd.Local.ExtraEnvs = []kubeadm.EnvVar{} } func fuzzDNS(obj *kubeadm.DNS, c fuzz.Continue) { diff --git a/cmd/kubeadm/app/apis/kubeadm/types.go b/cmd/kubeadm/app/apis/kubeadm/types.go index e2ac31cbacb..8b845239173 100644 --- a/cmd/kubeadm/app/apis/kubeadm/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/types.go @@ -157,7 +157,7 @@ type ControlPlaneComponent struct { // ExtraEnvs is an extra set of environment variables to pass to the control plane component. // Environment variables passed using ExtraEnvs will override any existing environment variables, or *_proxy environment variables that kubeadm adds by default. // +optional - ExtraEnvs []v1.EnvVar + ExtraEnvs []EnvVar } // APIServer holds settings necessary for API server deployments in the cluster @@ -275,7 +275,7 @@ type LocalEtcd struct { // ExtraEnvs is an extra set of environment variables to pass to the control plane component. // Environment variables passed using ExtraEnvs will override any existing environment variables, or *_proxy environment variables that kubeadm adds by default. // +optional - ExtraEnvs []v1.EnvVar + ExtraEnvs []EnvVar // ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. ServerCertSANs []string @@ -513,3 +513,8 @@ type Arg struct { Name string Value string } + +// EnvVar represents an environment variable present in a Container. +type EnvVar struct { + v1.EnvVar +} diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta3/conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta3/conversion.go index 1b19007104e..7114c938778 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta3/conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta3/conversion.go @@ -19,7 +19,6 @@ package v1beta3 import ( "sort" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/conversion" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" @@ -44,7 +43,7 @@ func Convert_v1beta3_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConf // Convert_v1beta3_ControlPlaneComponent_To_kubeadm_ControlPlaneComponent is required due to the missing ControlPlaneComponent.ExtraEnvs in v1beta3. func Convert_v1beta3_ControlPlaneComponent_To_kubeadm_ControlPlaneComponent(in *ControlPlaneComponent, out *kubeadm.ControlPlaneComponent, s conversion.Scope) error { - out.ExtraEnvs = []v1.EnvVar{} + out.ExtraEnvs = []kubeadm.EnvVar{} out.ExtraArgs = convertToArgs(in.ExtraArgs) return autoConvert_v1beta3_ControlPlaneComponent_To_kubeadm_ControlPlaneComponent(in, out, s) } @@ -56,7 +55,7 @@ func Convert_kubeadm_ControlPlaneComponent_To_v1beta3_ControlPlaneComponent(in * // Convert_v1beta3_LocalEtcd_To_kubeadm_LocalEtcd is required due to the missing LocalEtcd.ExtraEnvs in v1beta3. func Convert_v1beta3_LocalEtcd_To_kubeadm_LocalEtcd(in *LocalEtcd, out *kubeadm.LocalEtcd, s conversion.Scope) error { - out.ExtraEnvs = []v1.EnvVar{} + out.ExtraEnvs = []kubeadm.EnvVar{} out.ExtraArgs = convertToArgs(in.ExtraArgs) return autoConvert_v1beta3_LocalEtcd_To_kubeadm_LocalEtcd(in, out, s) } diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta4/defaults.go b/cmd/kubeadm/app/apis/kubeadm/v1beta4/defaults.go index 314be0b30c7..53433863cdf 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta4/defaults.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta4/defaults.go @@ -205,3 +205,15 @@ func SetDefaults_ResetConfiguration(obj *ResetConfiguration) { obj.CertificatesDir = DefaultCertificatesDir } } + +// SetDefaults_EnvVar assigns default values for EnvVar. +// +k8s:defaulter-gen=covers +func SetDefaults_EnvVar(obj *EnvVar) { + if obj.ValueFrom != nil { + if obj.ValueFrom.FieldRef != nil { + if obj.ValueFrom.FieldRef.APIVersion == "" { + obj.ValueFrom.FieldRef.APIVersion = "v1" + } + } + } +} diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta4/types.go b/cmd/kubeadm/app/apis/kubeadm/v1beta4/types.go index 54217a03bcf..8008d3b54d6 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta4/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta4/types.go @@ -158,7 +158,7 @@ type ControlPlaneComponent struct { // ExtraEnvs is an extra set of environment variables to pass to the control plane component. // Environment variables passed using ExtraEnvs will override any existing environment variables, or *_proxy environment variables that kubeadm adds by default. // +optional - ExtraEnvs []corev1.EnvVar `json:"extraEnvs,omitempty"` + ExtraEnvs []EnvVar `json:"extraEnvs,omitempty"` } // APIServer holds settings necessary for API server deployments in the cluster @@ -296,7 +296,7 @@ type LocalEtcd struct { // ExtraEnvs is an extra set of environment variables to pass to the control plane component. // Environment variables passed using ExtraEnvs will override any existing environment variables, or *_proxy environment variables that kubeadm adds by default. // +optional - ExtraEnvs []corev1.EnvVar `json:"extraEnvs,omitempty"` + ExtraEnvs []EnvVar `json:"extraEnvs,omitempty"` // ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. // +optional @@ -508,3 +508,8 @@ type Arg struct { Name string `json:"name"` Value string `json:"value"` } + +// EnvVar represents an environment variable present in a Container. +type EnvVar struct { + corev1.EnvVar `json:",inline"` +} diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.conversion.go index a203ddf12bb..67bebb9bd95 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.conversion.go @@ -119,6 +119,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*EnvVar)(nil), (*kubeadm.EnvVar)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta4_EnvVar_To_kubeadm_EnvVar(a.(*EnvVar), b.(*kubeadm.EnvVar), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*kubeadm.EnvVar)(nil), (*EnvVar)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_kubeadm_EnvVar_To_v1beta4_EnvVar(a.(*kubeadm.EnvVar), b.(*EnvVar), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*Etcd)(nil), (*kubeadm.Etcd)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta4_Etcd_To_kubeadm_Etcd(a.(*Etcd), b.(*kubeadm.Etcd), scope) }); err != nil { @@ -422,7 +432,7 @@ func Convert_kubeadm_ClusterConfiguration_To_v1beta4_ClusterConfiguration(in *ku func autoConvert_v1beta4_ControlPlaneComponent_To_kubeadm_ControlPlaneComponent(in *ControlPlaneComponent, out *kubeadm.ControlPlaneComponent, s conversion.Scope) error { out.ExtraArgs = *(*[]kubeadm.Arg)(unsafe.Pointer(&in.ExtraArgs)) out.ExtraVolumes = *(*[]kubeadm.HostPathMount)(unsafe.Pointer(&in.ExtraVolumes)) - out.ExtraEnvs = *(*[]corev1.EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) + out.ExtraEnvs = *(*[]kubeadm.EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) return nil } @@ -434,7 +444,7 @@ func Convert_v1beta4_ControlPlaneComponent_To_kubeadm_ControlPlaneComponent(in * func autoConvert_kubeadm_ControlPlaneComponent_To_v1beta4_ControlPlaneComponent(in *kubeadm.ControlPlaneComponent, out *ControlPlaneComponent, s conversion.Scope) error { out.ExtraArgs = *(*[]Arg)(unsafe.Pointer(&in.ExtraArgs)) out.ExtraVolumes = *(*[]HostPathMount)(unsafe.Pointer(&in.ExtraVolumes)) - out.ExtraEnvs = *(*[]corev1.EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) + out.ExtraEnvs = *(*[]EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) return nil } @@ -493,6 +503,26 @@ func Convert_kubeadm_Discovery_To_v1beta4_Discovery(in *kubeadm.Discovery, out * return autoConvert_kubeadm_Discovery_To_v1beta4_Discovery(in, out, s) } +func autoConvert_v1beta4_EnvVar_To_kubeadm_EnvVar(in *EnvVar, out *kubeadm.EnvVar, s conversion.Scope) error { + out.EnvVar = in.EnvVar + return nil +} + +// Convert_v1beta4_EnvVar_To_kubeadm_EnvVar is an autogenerated conversion function. +func Convert_v1beta4_EnvVar_To_kubeadm_EnvVar(in *EnvVar, out *kubeadm.EnvVar, s conversion.Scope) error { + return autoConvert_v1beta4_EnvVar_To_kubeadm_EnvVar(in, out, s) +} + +func autoConvert_kubeadm_EnvVar_To_v1beta4_EnvVar(in *kubeadm.EnvVar, out *EnvVar, s conversion.Scope) error { + out.EnvVar = in.EnvVar + return nil +} + +// Convert_kubeadm_EnvVar_To_v1beta4_EnvVar is an autogenerated conversion function. +func Convert_kubeadm_EnvVar_To_v1beta4_EnvVar(in *kubeadm.EnvVar, out *EnvVar, s conversion.Scope) error { + return autoConvert_kubeadm_EnvVar_To_v1beta4_EnvVar(in, out, s) +} + func autoConvert_v1beta4_Etcd_To_kubeadm_Etcd(in *Etcd, out *kubeadm.Etcd, s conversion.Scope) error { out.Local = (*kubeadm.LocalEtcd)(unsafe.Pointer(in.Local)) out.External = (*kubeadm.ExternalEtcd)(unsafe.Pointer(in.External)) @@ -714,7 +744,7 @@ func autoConvert_v1beta4_LocalEtcd_To_kubeadm_LocalEtcd(in *LocalEtcd, out *kube } out.DataDir = in.DataDir out.ExtraArgs = *(*[]kubeadm.Arg)(unsafe.Pointer(&in.ExtraArgs)) - out.ExtraEnvs = *(*[]corev1.EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) + out.ExtraEnvs = *(*[]kubeadm.EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) out.ServerCertSANs = *(*[]string)(unsafe.Pointer(&in.ServerCertSANs)) out.PeerCertSANs = *(*[]string)(unsafe.Pointer(&in.PeerCertSANs)) return nil @@ -731,7 +761,7 @@ func autoConvert_kubeadm_LocalEtcd_To_v1beta4_LocalEtcd(in *kubeadm.LocalEtcd, o } out.DataDir = in.DataDir out.ExtraArgs = *(*[]Arg)(unsafe.Pointer(&in.ExtraArgs)) - out.ExtraEnvs = *(*[]corev1.EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) + out.ExtraEnvs = *(*[]EnvVar)(unsafe.Pointer(&in.ExtraEnvs)) out.ServerCertSANs = *(*[]string)(unsafe.Pointer(&in.ServerCertSANs)) out.PeerCertSANs = *(*[]string)(unsafe.Pointer(&in.PeerCertSANs)) return nil diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.deepcopy.go b/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.deepcopy.go index c030a560dc1..872a6e116c2 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.deepcopy.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.deepcopy.go @@ -161,7 +161,7 @@ func (in *ControlPlaneComponent) DeepCopyInto(out *ControlPlaneComponent) { } if in.ExtraEnvs != nil { in, out := &in.ExtraEnvs, &out.ExtraEnvs - *out = make([]corev1.EnvVar, len(*in)) + *out = make([]EnvVar, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -227,6 +227,23 @@ func (in *Discovery) DeepCopy() *Discovery { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EnvVar) DeepCopyInto(out *EnvVar) { + *out = *in + in.EnvVar.DeepCopyInto(&out.EnvVar) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvVar. +func (in *EnvVar) DeepCopy() *EnvVar { + if in == nil { + return nil + } + out := new(EnvVar) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Etcd) DeepCopyInto(out *Etcd) { *out = *in @@ -436,7 +453,7 @@ func (in *LocalEtcd) DeepCopyInto(out *LocalEtcd) { } if in.ExtraEnvs != nil { in, out := &in.ExtraEnvs, &out.ExtraEnvs - *out = make([]corev1.EnvVar, len(*in)) + *out = make([]EnvVar, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.defaults.go b/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.defaults.go index b36b0f0f952..5ee0db52d7c 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.defaults.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta4/zz_generated.defaults.go @@ -23,7 +23,6 @@ package v1beta4 import ( runtime "k8s.io/apimachinery/pkg/runtime" - v1 "k8s.io/kubernetes/pkg/apis/core/v1" ) // RegisterDefaults adds defaulters functions to the given scheme. @@ -42,37 +41,21 @@ func SetObjectDefaults_ClusterConfiguration(in *ClusterConfiguration) { if in.Etcd.Local != nil { for i := range in.Etcd.Local.ExtraEnvs { a := &in.Etcd.Local.ExtraEnvs[i] - if a.ValueFrom != nil { - if a.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(a.ValueFrom.FieldRef) - } - } + SetDefaults_EnvVar(a) } } SetDefaults_APIServer(&in.APIServer) for i := range in.APIServer.ControlPlaneComponent.ExtraEnvs { a := &in.APIServer.ControlPlaneComponent.ExtraEnvs[i] - if a.ValueFrom != nil { - if a.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(a.ValueFrom.FieldRef) - } - } + SetDefaults_EnvVar(a) } for i := range in.ControllerManager.ExtraEnvs { a := &in.ControllerManager.ExtraEnvs[i] - if a.ValueFrom != nil { - if a.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(a.ValueFrom.FieldRef) - } - } + SetDefaults_EnvVar(a) } for i := range in.Scheduler.ExtraEnvs { a := &in.Scheduler.ExtraEnvs[i] - if a.ValueFrom != nil { - if a.ValueFrom.FieldRef != nil { - v1.SetDefaults_ObjectFieldSelector(a.ValueFrom.FieldRef) - } - } + SetDefaults_EnvVar(a) } } diff --git a/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go b/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go index 1e7d371323f..f0265b9a3e7 100644 --- a/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go +++ b/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go @@ -190,7 +190,7 @@ func (in *ControlPlaneComponent) DeepCopyInto(out *ControlPlaneComponent) { } if in.ExtraEnvs != nil { in, out := &in.ExtraEnvs, &out.ExtraEnvs - *out = make([]corev1.EnvVar, len(*in)) + *out = make([]EnvVar, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -256,6 +256,23 @@ func (in *Discovery) DeepCopy() *Discovery { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EnvVar) DeepCopyInto(out *EnvVar) { + *out = *in + in.EnvVar.DeepCopyInto(&out.EnvVar) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvVar. +func (in *EnvVar) DeepCopy() *EnvVar { + if in == nil { + return nil + } + out := new(EnvVar) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Etcd) DeepCopyInto(out *Etcd) { *out = *in @@ -466,7 +483,7 @@ func (in *LocalEtcd) DeepCopyInto(out *LocalEtcd) { } if in.ExtraEnvs != nil { in, out := &in.ExtraEnvs, &out.ExtraEnvs - *out = make([]corev1.EnvVar, len(*in)) + *out = make([]EnvVar, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/cmd/kubeadm/app/phases/addons/proxy/proxy.go b/cmd/kubeadm/app/phases/addons/proxy/proxy.go index 8a4978ea6b4..2440deb377d 100644 --- a/cmd/kubeadm/app/phases/addons/proxy/proxy.go +++ b/cmd/kubeadm/app/phases/addons/proxy/proxy.go @@ -259,7 +259,7 @@ func createKubeProxyAddon(cfg *kubeadmapi.ClusterConfiguration, client clientset } // Propagate the http/https proxy host environment variables to the container env := &kubeproxyDaemonSet.Spec.Template.Spec.Containers[0].Env - *env = append(*env, kubeadmutil.GetProxyEnvVars()...) + *env = append(*env, kubeadmutil.MergeKubeadmEnvVars(kubeadmutil.GetProxyEnvVars())...) // Create the DaemonSet for kube-proxy or update it in case it already exists return []byte(""), apiclient.CreateOrUpdateDaemonSet(client, kubeproxyDaemonSet) diff --git a/cmd/kubeadm/app/phases/controlplane/manifests.go b/cmd/kubeadm/app/phases/controlplane/manifests.go index 7096c1e79db..998ca2e3456 100644 --- a/cmd/kubeadm/app/phases/controlplane/manifests.go +++ b/cmd/kubeadm/app/phases/controlplane/manifests.go @@ -48,7 +48,7 @@ func CreateInitStaticPodManifestFiles(manifestDir, patchesDir string, cfg *kubea // GetStaticPodSpecs returns all staticPodSpecs actualized to the context of the current configuration // NB. this method holds the information about how kubeadm creates static pod manifests. -func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmapi.APIEndpoint, proxyEnvs []v1.EnvVar) map[string]v1.Pod { +func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmapi.APIEndpoint, proxyEnvs []kubeadmapi.EnvVar) map[string]v1.Pod { // Get the required hostpath mounts mounts := getHostPathVolumesForTheControlPlane(cfg) if proxyEnvs == nil { @@ -67,7 +67,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmap ReadinessProbe: staticpodutil.ReadinessProbe(staticpodutil.GetAPIServerProbeAddress(endpoint), "/readyz", endpoint.BindPort, v1.URISchemeHTTPS), StartupProbe: staticpodutil.StartupProbe(staticpodutil.GetAPIServerProbeAddress(endpoint), "/livez", endpoint.BindPort, v1.URISchemeHTTPS, cfg.APIServer.TimeoutForControlPlane), Resources: staticpodutil.ComponentResources("250m"), - Env: kubeadmutil.MergeEnv(proxyEnvs, cfg.APIServer.ExtraEnvs), + Env: kubeadmutil.MergeKubeadmEnvVars(proxyEnvs, cfg.APIServer.ExtraEnvs), }, mounts.GetVolumes(kubeadmconstants.KubeAPIServer), map[string]string{kubeadmconstants.KubeAPIServerAdvertiseAddressEndpointAnnotationKey: endpoint.String()}), kubeadmconstants.KubeControllerManager: staticpodutil.ComponentPod(v1.Container{ @@ -79,7 +79,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmap LivenessProbe: staticpodutil.LivenessProbe(staticpodutil.GetControllerManagerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeControllerManagerPort, v1.URISchemeHTTPS), StartupProbe: staticpodutil.StartupProbe(staticpodutil.GetControllerManagerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeControllerManagerPort, v1.URISchemeHTTPS, cfg.APIServer.TimeoutForControlPlane), Resources: staticpodutil.ComponentResources("200m"), - Env: kubeadmutil.MergeEnv(proxyEnvs, cfg.ControllerManager.ExtraEnvs), + Env: kubeadmutil.MergeKubeadmEnvVars(proxyEnvs, cfg.ControllerManager.ExtraEnvs), }, mounts.GetVolumes(kubeadmconstants.KubeControllerManager), nil), kubeadmconstants.KubeScheduler: staticpodutil.ComponentPod(v1.Container{ Name: kubeadmconstants.KubeScheduler, @@ -90,7 +90,7 @@ func GetStaticPodSpecs(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmap LivenessProbe: staticpodutil.LivenessProbe(staticpodutil.GetSchedulerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeSchedulerPort, v1.URISchemeHTTPS), StartupProbe: staticpodutil.StartupProbe(staticpodutil.GetSchedulerProbeAddress(cfg), "/healthz", kubeadmconstants.KubeSchedulerPort, v1.URISchemeHTTPS, cfg.APIServer.TimeoutForControlPlane), Resources: staticpodutil.ComponentResources("100m"), - Env: kubeadmutil.MergeEnv(proxyEnvs, cfg.Scheduler.ExtraEnvs), + Env: kubeadmutil.MergeKubeadmEnvVars(proxyEnvs, cfg.Scheduler.ExtraEnvs), }, mounts.GetVolumes(kubeadmconstants.KubeScheduler), nil), } return staticPodSpecs diff --git a/cmd/kubeadm/app/phases/controlplane/manifests_test.go b/cmd/kubeadm/app/phases/controlplane/manifests_test.go index 78b09014d11..6bf1e5057fa 100644 --- a/cmd/kubeadm/app/phases/controlplane/manifests_test.go +++ b/cmd/kubeadm/app/phases/controlplane/manifests_test.go @@ -52,13 +52,15 @@ func TestGetStaticPodSpecs(t *testing.T) { // Creates a Cluster Configuration cfg := &kubeadmapi.ClusterConfiguration{ KubernetesVersion: "v1.9.0", - Scheduler: kubeadmapi.ControlPlaneComponent{ExtraEnvs: []v1.EnvVar{ - {Name: "Foo", Value: "Bar"}, + Scheduler: kubeadmapi.ControlPlaneComponent{ExtraEnvs: []kubeadmapi.EnvVar{ + { + EnvVar: v1.EnvVar{Name: "Foo", Value: "Bar"}, + }, }}, } // Executes GetStaticPodSpecs - specs := GetStaticPodSpecs(cfg, &kubeadmapi.APIEndpoint{}, []v1.EnvVar{}) + specs := GetStaticPodSpecs(cfg, &kubeadmapi.APIEndpoint{}, []kubeadmapi.EnvVar{}) var tests = []struct { name string diff --git a/cmd/kubeadm/app/phases/etcd/local.go b/cmd/kubeadm/app/phases/etcd/local.go index e58c6eb9ce7..8c3e5c99b36 100644 --- a/cmd/kubeadm/app/phases/etcd/local.go +++ b/cmd/kubeadm/app/phases/etcd/local.go @@ -224,7 +224,7 @@ func GetEtcdPodSpec(cfg *kubeadmapi.ClusterConfiguration, endpoint *kubeadmapi.A }, LivenessProbe: staticpodutil.LivenessProbe(probeHostname, "/health?exclude=NOSPACE&serializable=true", probePort, probeScheme), StartupProbe: staticpodutil.StartupProbe(probeHostname, "/health?serializable=false", probePort, probeScheme, cfg.APIServer.TimeoutForControlPlane), - Env: cfg.Etcd.Local.ExtraEnvs, + Env: kubeadmutil.MergeKubeadmEnvVars(cfg.Etcd.Local.ExtraEnvs), }, etcdMounts, // etcd will listen on the advertise address of the API server, in a different port (2379) diff --git a/cmd/kubeadm/app/phases/etcd/local_test.go b/cmd/kubeadm/app/phases/etcd/local_test.go index 56ab0d0c4f8..e04c8655eb5 100644 --- a/cmd/kubeadm/app/phases/etcd/local_test.go +++ b/cmd/kubeadm/app/phases/etcd/local_test.go @@ -46,8 +46,10 @@ func TestGetEtcdPodSpec(t *testing.T) { Etcd: kubeadmapi.Etcd{ Local: &kubeadmapi.LocalEtcd{ DataDir: "/var/lib/etcd", - ExtraEnvs: []v1.EnvVar{ - {Name: "Foo", Value: "Bar"}, + ExtraEnvs: []kubeadmapi.EnvVar{ + { + EnvVar: v1.EnvVar{Name: "Foo", Value: "Bar"}, + }, }, }, }, diff --git a/cmd/kubeadm/app/util/env.go b/cmd/kubeadm/app/util/env.go index ea8de76d2eb..5534b1d212a 100644 --- a/cmd/kubeadm/app/util/env.go +++ b/cmd/kubeadm/app/util/env.go @@ -21,11 +21,13 @@ import ( "strings" v1 "k8s.io/api/core/v1" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" ) // GetProxyEnvVars builds a list of environment variables in order to use the right proxy -func GetProxyEnvVars() []v1.EnvVar { - envs := []v1.EnvVar{} +func GetProxyEnvVars() []kubeadmapi.EnvVar { + envs := []kubeadmapi.EnvVar{} for _, env := range os.Environ() { pos := strings.Index(env, "=") if pos == -1 { @@ -35,20 +37,23 @@ func GetProxyEnvVars() []v1.EnvVar { name := env[:pos] value := env[pos+1:] if strings.HasSuffix(strings.ToLower(name), "_proxy") && value != "" { - envVar := v1.EnvVar{Name: name, Value: value} + envVar := kubeadmapi.EnvVar{ + EnvVar: v1.EnvVar{Name: name, Value: value}, + } envs = append(envs, envVar) } } return envs } -// MergeEnv merges values of environment variable slices. The values defined in later slices overwrite values in previous ones. -func MergeEnv(envList ...[]v1.EnvVar) []v1.EnvVar { +// MergeKubeadmEnvVars merges values of environment variable slices. +// The values defined in later slices overwrite values in previous ones. +func MergeKubeadmEnvVars(envList ...[]kubeadmapi.EnvVar) []v1.EnvVar { m := make(map[string]v1.EnvVar) merged := []v1.EnvVar{} for _, envs := range envList { for _, env := range envs { - m[env.Name] = env + m[env.Name] = env.EnvVar } } for _, v := range m { diff --git a/cmd/kubeadm/app/util/env_test.go b/cmd/kubeadm/app/util/env_test.go index e1bc6a5aad6..ad70a4e8584 100644 --- a/cmd/kubeadm/app/util/env_test.go +++ b/cmd/kubeadm/app/util/env_test.go @@ -22,26 +22,34 @@ import ( "github.com/stretchr/testify/assert" v1 "k8s.io/api/core/v1" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" ) -func TestMergeEnv(t *testing.T) { - baseEnv := []v1.EnvVar{} - extraEnv := []v1.EnvVar{} - MergeEnv(append(baseEnv, extraEnv...)) +func TestMergeKubeadmEnvVars(t *testing.T) { + baseEnv := []kubeadmapi.EnvVar{} + extraEnv := []kubeadmapi.EnvVar{} + MergeKubeadmEnvVars(append(baseEnv, extraEnv...)) var tests = []struct { name string - proxyEnv []v1.EnvVar - extraEnv []v1.EnvVar + proxyEnv []kubeadmapi.EnvVar + extraEnv []kubeadmapi.EnvVar mergedEnv []v1.EnvVar }{ { name: "normal case without duplicated env", - proxyEnv: []v1.EnvVar{ - {Name: "Foo1", Value: "Bar1"}, - {Name: "Foo2", Value: "Bar2"}, + proxyEnv: []kubeadmapi.EnvVar{ + { + EnvVar: v1.EnvVar{Name: "Foo1", Value: "Bar1"}, + }, + { + EnvVar: v1.EnvVar{Name: "Foo2", Value: "Bar2"}, + }, }, - extraEnv: []v1.EnvVar{ - {Name: "Foo3", Value: "Bar3"}, + extraEnv: []kubeadmapi.EnvVar{ + { + EnvVar: v1.EnvVar{Name: "Foo3", Value: "Bar3"}, + }, }, mergedEnv: []v1.EnvVar{ {Name: "Foo1", Value: "Bar1"}, @@ -51,12 +59,18 @@ func TestMergeEnv(t *testing.T) { }, { name: "extraEnv env take precedence over the proxyEnv", - proxyEnv: []v1.EnvVar{ - {Name: "Foo1", Value: "Bar1"}, - {Name: "Foo2", Value: "Bar2"}, + proxyEnv: []kubeadmapi.EnvVar{ + { + EnvVar: v1.EnvVar{Name: "Foo1", Value: "Bar1"}, + }, + { + EnvVar: v1.EnvVar{Name: "Foo2", Value: "Bar2"}, + }, }, - extraEnv: []v1.EnvVar{ - {Name: "Foo2", Value: "Bar3"}, + extraEnv: []kubeadmapi.EnvVar{ + { + EnvVar: v1.EnvVar{Name: "Foo2", Value: "Bar3"}, + }, }, mergedEnv: []v1.EnvVar{ {Name: "Foo1", Value: "Bar1"}, @@ -67,7 +81,7 @@ func TestMergeEnv(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - envs := MergeEnv(test.proxyEnv, test.extraEnv) + envs := MergeKubeadmEnvVars(test.proxyEnv, test.extraEnv) if !assert.ElementsMatch(t, envs, test.mergedEnv) { t.Errorf("expected env: %v, got: %v", test.mergedEnv, envs) }