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

View File

@ -19,6 +19,7 @@ package v1beta2
import (
kubeadm "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
corev1 "k8s.io/api/core/v1"
conversion "k8s.io/apimachinery/pkg/conversion"
)
@ -31,6 +32,9 @@ func Convert_v1beta2_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConf
if err != nil {
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)
}
@ -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 {
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 {
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 {
return Convert_v1beta2_JoinControlPlane_To_kubeadm_JoinControlPlane(a.(*JoinControlPlane), b.(*kubeadm.JoinControlPlane), scope)
}); err != nil {
@ -218,6 +213,11 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
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
}
@ -592,11 +592,6 @@ func autoConvert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in *Join
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 {
if err := Convert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(&in.NodeRegistration, &out.NodeRegistration, s); err != nil {
return err

View File

@ -20,11 +20,12 @@ import (
"net/url"
"time"
bootstraptokenv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
bootstraptokenv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1"
)
const (
@ -55,6 +56,9 @@ const (
DefaultProxyBindAddressv6 = "::"
// DefaultDiscoveryTimeout specifies the default discovery timeout for kubeadm (used unless one is specified in the JoinConfiguration)
DefaultDiscoveryTimeout = 5 * time.Minute
// DefaultImagePullPolicy is the default image pull policy in kubeadm
DefaultImagePullPolicy = corev1.PullIfNotPresent
)
var (
@ -71,6 +75,7 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error {
func SetDefaults_InitConfiguration(obj *InitConfiguration) {
SetDefaults_BootstrapTokens(obj)
SetDefaults_APIEndpoint(&obj.LocalAPIEndpoint)
SetDefaults_NodeRegistration(&obj.NodeRegistration)
}
// SetDefaults_ClusterConfiguration assigns default values for the ClusterConfiguration
@ -132,6 +137,7 @@ func SetDefaults_JoinConfiguration(obj *JoinConfiguration) {
SetDefaults_JoinControlPlane(obj.ControlPlane)
SetDefaults_Discovery(&obj.Discovery)
SetDefaults_NodeRegistration(&obj.NodeRegistration)
}
func SetDefaults_JoinControlPlane(obj *JoinControlPlane) {
@ -206,3 +212,10 @@ func SetDefaults_APIEndpoint(obj *APIEndpoint) {
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
func (ipc ImagePullCheck) Check() (warnings, errorList []error) {
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)
for _, image := range ipc.imageList {
switch policy {

View File

@ -31,6 +31,7 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/utils/exec"
fakeexec "k8s.io/utils/exec/testing"
@ -923,7 +924,7 @@ func TestImagePullCheck(t *testing.T) {
check := ImagePullCheck{
runtime: containerRuntime,
imageList: []string{"img1", "img2", "img3"},
imagePullPolicy: "", // should be defaulted to v1.PullIfNotPresent
imagePullPolicy: corev1.PullIfNotPresent,
}
warnings, errors := check.Check()
if len(warnings) != 0 {
@ -940,6 +941,17 @@ func TestImagePullCheck(t *testing.T) {
if len(errors) != 2 {
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) {