kubeadm: statically default ImagePullPolicy in v1beta3

Instead of dynamically defaulting NodeRegistration.ImagePullPolicy,
which is common when doing defaulting depending on host state - e.g.
hostname, statically default it in v1beta3/defaults.go.

- Remove defaulting in checks.go
- Add one more unit test in checks_test.go
- Adapt v1beta2 conversion and fuzzer / round tripping tests

This also results in the default being visible when calling:
"kubeadm config print ...".
This commit is contained in:
Lubomir I. Ivanov 2021-07-05 21:48:06 +03:00
parent f37550a470
commit f01d251e38
6 changed files with 50 additions and 17 deletions

View File

@ -21,6 +21,7 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/constants"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
@ -60,7 +61,7 @@ func fuzzInitConfiguration(obj *kubeadm.InitConfiguration, c fuzz.Continue) {
}, },
} }
obj.SkipPhases = nil obj.SkipPhases = nil
obj.NodeRegistration.ImagePullPolicy = "" obj.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent
obj.Patches = nil obj.Patches = nil
} }
@ -123,7 +124,7 @@ func fuzzJoinConfiguration(obj *kubeadm.JoinConfiguration, c fuzz.Continue) {
Timeout: &metav1.Duration{Duration: 1234}, Timeout: &metav1.Duration{Duration: 1234},
} }
obj.SkipPhases = nil obj.SkipPhases = nil
obj.NodeRegistration.ImagePullPolicy = "" obj.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent
obj.Patches = nil obj.Patches = nil
} }

View File

@ -19,6 +19,7 @@ package v1beta2
import ( import (
kubeadm "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadm "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
corev1 "k8s.io/api/core/v1"
conversion "k8s.io/apimachinery/pkg/conversion" conversion "k8s.io/apimachinery/pkg/conversion"
) )
@ -31,6 +32,9 @@ func Convert_v1beta2_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConf
if err != nil { if err != nil {
return err return err
} }
// Needed for round-tripping since this field is defaulted in v1beta3
out.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent
return Convert_v1beta2_ClusterConfiguration_To_kubeadm_ClusterConfiguration(&ClusterConfiguration{}, &out.ClusterConfiguration, s) return Convert_v1beta2_ClusterConfiguration_To_kubeadm_ClusterConfiguration(&ClusterConfiguration{}, &out.ClusterConfiguration, s)
} }
@ -49,3 +53,14 @@ func Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kubeadm.
func Convert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(in *kubeadm.NodeRegistrationOptions, out *NodeRegistrationOptions, s conversion.Scope) error { func Convert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(in *kubeadm.NodeRegistrationOptions, out *NodeRegistrationOptions, s conversion.Scope) error {
return autoConvert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(in, out, s) return autoConvert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(in, out, s)
} }
// Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration is required since v1beta2 does not have NodeRegistrationOption.ImagePullPolicy
// and to make round-tripping happy.
func Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in *JoinConfiguration, out *kubeadm.JoinConfiguration, s conversion.Scope) error {
err := autoConvert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in, out, s)
if err != nil {
return err
}
out.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent
return nil
}

View File

@ -153,11 +153,6 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil { }); err != nil {
return err return err
} }
if err := s.AddGeneratedConversionFunc((*JoinConfiguration)(nil), (*kubeadm.JoinConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(a.(*JoinConfiguration), b.(*kubeadm.JoinConfiguration), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*JoinControlPlane)(nil), (*kubeadm.JoinControlPlane)(nil), func(a, b interface{}, scope conversion.Scope) error { if err := s.AddGeneratedConversionFunc((*JoinControlPlane)(nil), (*kubeadm.JoinControlPlane)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta2_JoinControlPlane_To_kubeadm_JoinControlPlane(a.(*JoinControlPlane), b.(*kubeadm.JoinControlPlane), scope) return Convert_v1beta2_JoinControlPlane_To_kubeadm_JoinControlPlane(a.(*JoinControlPlane), b.(*kubeadm.JoinControlPlane), scope)
}); err != nil { }); err != nil {
@ -218,6 +213,11 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil { }); err != nil {
return err return err
} }
if err := s.AddConversionFunc((*JoinConfiguration)(nil), (*kubeadm.JoinConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(a.(*JoinConfiguration), b.(*kubeadm.JoinConfiguration), scope)
}); err != nil {
return err
}
return nil return nil
} }
@ -592,11 +592,6 @@ func autoConvert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in *Join
return nil return nil
} }
// Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration is an autogenerated conversion function.
func Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in *JoinConfiguration, out *kubeadm.JoinConfiguration, s conversion.Scope) error {
return autoConvert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in, out, s)
}
func autoConvert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kubeadm.JoinConfiguration, out *JoinConfiguration, s conversion.Scope) error { func autoConvert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kubeadm.JoinConfiguration, out *JoinConfiguration, s conversion.Scope) error {
if err := Convert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(&in.NodeRegistration, &out.NodeRegistration, s); err != nil { if err := Convert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(&in.NodeRegistration, &out.NodeRegistration, s); err != nil {
return err return err

View File

@ -20,11 +20,12 @@ import (
"net/url" "net/url"
"time" "time"
bootstraptokenv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1"
"k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/constants"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
bootstraptokenv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1"
) )
const ( const (
@ -55,6 +56,9 @@ const (
DefaultProxyBindAddressv6 = "::" DefaultProxyBindAddressv6 = "::"
// DefaultDiscoveryTimeout specifies the default discovery timeout for kubeadm (used unless one is specified in the JoinConfiguration) // DefaultDiscoveryTimeout specifies the default discovery timeout for kubeadm (used unless one is specified in the JoinConfiguration)
DefaultDiscoveryTimeout = 5 * time.Minute DefaultDiscoveryTimeout = 5 * time.Minute
// DefaultImagePullPolicy is the default image pull policy in kubeadm
DefaultImagePullPolicy = corev1.PullIfNotPresent
) )
var ( var (
@ -71,6 +75,7 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error {
func SetDefaults_InitConfiguration(obj *InitConfiguration) { func SetDefaults_InitConfiguration(obj *InitConfiguration) {
SetDefaults_BootstrapTokens(obj) SetDefaults_BootstrapTokens(obj)
SetDefaults_APIEndpoint(&obj.LocalAPIEndpoint) SetDefaults_APIEndpoint(&obj.LocalAPIEndpoint)
SetDefaults_NodeRegistration(&obj.NodeRegistration)
} }
// SetDefaults_ClusterConfiguration assigns default values for the ClusterConfiguration // SetDefaults_ClusterConfiguration assigns default values for the ClusterConfiguration
@ -132,6 +137,7 @@ func SetDefaults_JoinConfiguration(obj *JoinConfiguration) {
SetDefaults_JoinControlPlane(obj.ControlPlane) SetDefaults_JoinControlPlane(obj.ControlPlane)
SetDefaults_Discovery(&obj.Discovery) SetDefaults_Discovery(&obj.Discovery)
SetDefaults_NodeRegistration(&obj.NodeRegistration)
} }
func SetDefaults_JoinControlPlane(obj *JoinControlPlane) { func SetDefaults_JoinControlPlane(obj *JoinControlPlane) {
@ -206,3 +212,10 @@ func SetDefaults_APIEndpoint(obj *APIEndpoint) {
obj.BindPort = DefaultAPIBindPort obj.BindPort = DefaultAPIBindPort
} }
} }
// SetDefaults_NodeRegistration sets the defaults for the NodeRegistrationOptions object
func SetDefaults_NodeRegistration(obj *NodeRegistrationOptions) {
if len(obj.ImagePullPolicy) == 0 {
obj.ImagePullPolicy = DefaultImagePullPolicy
}
}

View File

@ -835,9 +835,6 @@ func (ImagePullCheck) Name() string {
// Check pulls images required by kubeadm. This is a mutating check // Check pulls images required by kubeadm. This is a mutating check
func (ipc ImagePullCheck) Check() (warnings, errorList []error) { func (ipc ImagePullCheck) Check() (warnings, errorList []error) {
policy := ipc.imagePullPolicy policy := ipc.imagePullPolicy
if len(policy) == 0 {
policy = v1.PullIfNotPresent // Default behavior if the policy is unset
}
klog.V(1).Infof("using image pull policy: %s", policy) klog.V(1).Infof("using image pull policy: %s", policy)
for _, image := range ipc.imageList { for _, image := range ipc.imageList {
switch policy { switch policy {

View File

@ -31,6 +31,7 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/constants"
utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime" utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/utils/exec" "k8s.io/utils/exec"
fakeexec "k8s.io/utils/exec/testing" fakeexec "k8s.io/utils/exec/testing"
@ -923,7 +924,7 @@ func TestImagePullCheck(t *testing.T) {
check := ImagePullCheck{ check := ImagePullCheck{
runtime: containerRuntime, runtime: containerRuntime,
imageList: []string{"img1", "img2", "img3"}, imageList: []string{"img1", "img2", "img3"},
imagePullPolicy: "", // should be defaulted to v1.PullIfNotPresent imagePullPolicy: corev1.PullIfNotPresent,
} }
warnings, errors := check.Check() warnings, errors := check.Check()
if len(warnings) != 0 { if len(warnings) != 0 {
@ -940,6 +941,17 @@ func TestImagePullCheck(t *testing.T) {
if len(errors) != 2 { if len(errors) != 2 {
t.Fatalf("expected 2 errors but got %d: %q", len(errors), errors) t.Fatalf("expected 2 errors but got %d: %q", len(errors), errors)
} }
// Test with unknown policy
check = ImagePullCheck{
runtime: containerRuntime,
imageList: []string{"img1", "img2", "img3"},
imagePullPolicy: "",
}
_, errors = check.Check()
if len(errors) != 1 {
t.Fatalf("expected 1 error but got %d: %q", len(errors), errors)
}
} }
func TestNumCPUCheck(t *testing.T) { func TestNumCPUCheck(t *testing.T) {