From 2c2fa2107a68b8d9e668514b7574abfc03d2b8aa Mon Sep 17 00:00:00 2001 From: HirazawaUi <695097494plus@gmail.com> Date: Sun, 1 Oct 2023 16:09:20 +0800 Subject: [PATCH] deprecate the kubeProxyVersion field of v1.Node --- pkg/apis/core/types.go | 2 +- pkg/features/kube_features.go | 8 +++ pkg/kubelet/nodestatus/setters.go | 12 ++++- pkg/kubelet/nodestatus/setters_test.go | 70 ++++++++++++++++++++++++-- 4 files changed, 86 insertions(+), 6 deletions(-) diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index f29952f637b..10df2c82bfc 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -4640,7 +4640,7 @@ type NodeSystemInfo struct { ContainerRuntimeVersion string // Kubelet Version reported by the node. KubeletVersion string - // KubeProxy Version reported by the node. + // Deprecated: KubeProxy Version reported by the node. KubeProxyVersion string // The Operating System reported by the node OperatingSystem string diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 7e4c061f42d..ec3a11c0b31 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -236,6 +236,12 @@ const ( // Disable in-tree functionality in kubelet to authenticate to cloud provider container registries for image pull credentials. DisableKubeletCloudCredentialProviders featuregate.Feature = "DisableKubeletCloudCredentialProviders" + // owner: @HirazawaUi + // kep: http://kep.k8s.io/4004 + // alpha: v1.29 + // DisableNodeKubeProxyVersion disable the status.nodeInfo.kubeProxyVersion field of v1.Node + DisableNodeKubeProxyVersion featuregate.Feature = "DisableNodeKubeProxyVersion" + // owner: @pohly // kep: http://kep.k8s.io/3063 // alpha: v1.26 @@ -963,6 +969,8 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS DisableKubeletCloudCredentialProviders: {Default: true, PreRelease: featuregate.Beta}, + DisableNodeKubeProxyVersion: {Default: false, PreRelease: featuregate.Alpha}, + DevicePluginCDIDevices: {Default: true, PreRelease: featuregate.Beta}, DynamicResourceAllocation: {Default: false, PreRelease: featuregate.Alpha}, diff --git a/pkg/kubelet/nodestatus/setters.go b/pkg/kubelet/nodestatus/setters.go index 8515e0a7bef..b539cbda86b 100644 --- a/pkg/kubelet/nodestatus/setters.go +++ b/pkg/kubelet/nodestatus/setters.go @@ -32,11 +32,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/errors" utilnet "k8s.io/apimachinery/pkg/util/net" + utilfeature "k8s.io/apiserver/pkg/util/feature" cloudprovider "k8s.io/cloud-provider" cloudproviderapi "k8s.io/cloud-provider/api" cloudprovidernodeutil "k8s.io/cloud-provider/node/helpers" "k8s.io/component-base/version" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/cadvisor" "k8s.io/kubernetes/pkg/kubelet/cm" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" @@ -410,8 +412,14 @@ func VersionInfo(versionInfoFunc func() (*cadvisorapiv1.VersionInfo, error), // node.Status.NodeInfo.ContainerRuntimeVersion = fmt.Sprintf("%s://%s", runtimeTypeFunc(), runtimeVersion) node.Status.NodeInfo.KubeletVersion = version.Get().String() - // TODO: kube-proxy might be different version from kubelet in the future - node.Status.NodeInfo.KubeProxyVersion = version.Get().String() + + if utilfeature.DefaultFeatureGate.Enabled(features.DisableNodeKubeProxyVersion) { + // This field is deprecated and should be cleared if it was previously set. + node.Status.NodeInfo.KubeProxyVersion = "" + } else { + node.Status.NodeInfo.KubeProxyVersion = version.Get().String() + } + return nil } } diff --git a/pkg/kubelet/nodestatus/setters_test.go b/pkg/kubelet/nodestatus/setters_test.go index 28033f1c787..61a42feaa96 100644 --- a/pkg/kubelet/nodestatus/setters_test.go +++ b/pkg/kubelet/nodestatus/setters_test.go @@ -28,6 +28,8 @@ import ( cadvisorapiv1 "github.com/google/cadvisor/info/v1" "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" apiequality "k8s.io/apimachinery/pkg/api/equality" @@ -35,9 +37,12 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/rand" "k8s.io/apimachinery/pkg/util/uuid" + utilfeature "k8s.io/apiserver/pkg/util/feature" cloudprovider "k8s.io/cloud-provider" fakecloud "k8s.io/cloud-provider/fake" + featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/component-base/version" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/kubelet/cm" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" kubecontainertest "k8s.io/kubernetes/pkg/kubelet/container/testing" @@ -46,9 +51,6 @@ import ( "k8s.io/kubernetes/pkg/volume" volumetest "k8s.io/kubernetes/pkg/volume/testing" netutils "k8s.io/utils/net" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) const ( @@ -1259,6 +1261,7 @@ func TestVersionInfo(t *testing.T) { runtimeVersionError error expectNode *v1.Node expectError error + kubeProxyVersion bool }{ { desc: "versions set in node info", @@ -1282,6 +1285,7 @@ func TestVersionInfo(t *testing.T) { }, }, }, + kubeProxyVersion: true, }, { desc: "error getting version info", @@ -1289,6 +1293,7 @@ func TestVersionInfo(t *testing.T) { versionInfoError: fmt.Errorf("foo"), expectNode: &v1.Node{}, expectError: fmt.Errorf("error getting version info: foo"), + kubeProxyVersion: true, }, { desc: "error getting runtime version results in Unknown runtime", @@ -1305,11 +1310,70 @@ func TestVersionInfo(t *testing.T) { }, }, }, + kubeProxyVersion: true, + }, + { + desc: "DisableNodeKubeProxyVersion FeatureGate enable, versions set in node info", + node: &v1.Node{}, + versionInfo: &cadvisorapiv1.VersionInfo{ + KernelVersion: "KernelVersion", + ContainerOsVersion: "ContainerOSVersion", + }, + runtimeType: "RuntimeType", + runtimeVersion: &kubecontainertest.FakeVersion{ + Version: "RuntimeVersion", + }, + expectNode: &v1.Node{ + Status: v1.NodeStatus{ + NodeInfo: v1.NodeSystemInfo{ + KernelVersion: "KernelVersion", + OSImage: "ContainerOSVersion", + ContainerRuntimeVersion: "RuntimeType://RuntimeVersion", + KubeletVersion: version.Get().String(), + }, + }, + }, + kubeProxyVersion: false, + }, + { + desc: "DisableNodeKubeProxyVersion FeatureGate enable, KubeProxyVersion will be cleared if it is set.", + node: &v1.Node{ + Status: v1.NodeStatus{ + NodeInfo: v1.NodeSystemInfo{ + KernelVersion: "KernelVersion", + OSImage: "ContainerOSVersion", + ContainerRuntimeVersion: "RuntimeType://RuntimeVersion", + KubeletVersion: version.Get().String(), + KubeProxyVersion: version.Get().String(), + }, + }, + }, + versionInfo: &cadvisorapiv1.VersionInfo{ + KernelVersion: "KernelVersion", + ContainerOsVersion: "ContainerOSVersion", + }, + runtimeType: "RuntimeType", + runtimeVersion: &kubecontainertest.FakeVersion{ + Version: "RuntimeVersion", + }, + expectNode: &v1.Node{ + Status: v1.NodeStatus{ + NodeInfo: v1.NodeSystemInfo{ + KernelVersion: "KernelVersion", + OSImage: "ContainerOSVersion", + ContainerRuntimeVersion: "RuntimeType://RuntimeVersion", + KubeletVersion: version.Get().String(), + }, + }, + }, + kubeProxyVersion: false, }, } for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DisableNodeKubeProxyVersion, !tc.kubeProxyVersion)() + ctx := context.Background() versionInfoFunc := func() (*cadvisorapiv1.VersionInfo, error) { return tc.versionInfo, tc.versionInfoError