From ef85747e14bd160fb1b1e08fbfc083c648e9cc57 Mon Sep 17 00:00:00 2001 From: Ivan Shvedunov Date: Tue, 18 Apr 2017 14:39:46 +0300 Subject: [PATCH] Fix serialization of EnforceNodeAllocatable EnforceNodeAllocatable being `nil` and `[]` are treated in different ways by kubelet. Namely, `nil` is replaced with `[]string{"pods"}` by the defaulting mechanism. E.g. if you run kubelet in Docker-in-Docker environment you may need to run it with the following options: `--cgroups-per-qos=false --enforce-node-allocatable=` (this corresponds to EnforceNodeAllocatable being empty array and not null) If you then grab kubelet configuration via /configz and try to reuse it for dynamic kubelet config, kubelet will think that EnforceNodeAllocatable is null, failing to run in the Docker-in-Docker environment. Encountered this while updating Virtlet for Kubernetes 1.6 (the dev environment is based on kubeadm-dind-cluster) --- pkg/apis/componentconfig/v1alpha1/types.go | 2 +- .../componentconfig/v1alpha1/zz_generated.conversion.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pkg/apis/componentconfig/v1alpha1/types.go b/pkg/apis/componentconfig/v1alpha1/types.go index 8211e8f0aaa..65dece7529b 100644 --- a/pkg/apis/componentconfig/v1alpha1/types.go +++ b/pkg/apis/componentconfig/v1alpha1/types.go @@ -601,7 +601,7 @@ type KubeletConfiguration struct { // This flag specifies the various Node Allocatable enforcements that Kubelet needs to perform. // This flag accepts a list of options. Acceptible options are `pods`, `system-reserved` & `kube-reserved`. // Refer to [Node Allocatable](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node-allocatable.md) doc for more information. - EnforceNodeAllocatable []string `json:"enforceNodeAllocatable,omitempty"` + EnforceNodeAllocatable []string `json:"enforceNodeAllocatable"` // This flag, if set, will avoid including `EvictionHard` limits while computing Node Allocatable. // Refer to [Node Allocatable](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node-allocatable.md) doc for more information. ExperimentalNodeAllocatableIgnoreEvictionThreshold bool `json:"experimentalNodeAllocatableIgnoreEvictionThreshold,omitempty"` diff --git a/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go b/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go index f607ea6174c..93b79ff25fa 100644 --- a/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/componentconfig/v1alpha1/zz_generated.conversion.go @@ -729,7 +729,11 @@ func autoConvert_componentconfig_KubeletConfiguration_To_v1alpha1_KubeletConfigu out.KubeReserved = *(*map[string]string)(unsafe.Pointer(&in.KubeReserved)) out.SystemReservedCgroup = in.SystemReservedCgroup out.KubeReservedCgroup = in.KubeReservedCgroup - out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) + if in.EnforceNodeAllocatable == nil { + out.EnforceNodeAllocatable = make([]string, 0) + } else { + out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) + } out.ExperimentalNodeAllocatableIgnoreEvictionThreshold = in.ExperimentalNodeAllocatableIgnoreEvictionThreshold return nil }