mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-30 21:30:16 +00:00 
			
		
		
		
	Remove checks for PodShareProcessNamespace feature gate
This commit is contained in:
		| @@ -340,12 +340,6 @@ func dropDisabledFields( | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !utilfeature.DefaultFeatureGate.Enabled(features.PodShareProcessNamespace) && !shareProcessNamespaceInUse(oldPodSpec) { |  | ||||||
| 		if podSpec.SecurityContext != nil { |  | ||||||
| 			podSpec.SecurityContext.ShareProcessNamespace = nil |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if !utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) && !sysctlsInUse(oldPodSpec) { | 	if !utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) && !sysctlsInUse(oldPodSpec) { | ||||||
| 		if podSpec.SecurityContext != nil { | 		if podSpec.SecurityContext != nil { | ||||||
| 			podSpec.SecurityContext.Sysctls = nil | 			podSpec.SecurityContext.Sysctls = nil | ||||||
| @@ -633,16 +627,6 @@ func appArmorInUse(podAnnotations map[string]string) bool { | |||||||
| 	return false | 	return false | ||||||
| } | } | ||||||
|  |  | ||||||
| func shareProcessNamespaceInUse(podSpec *api.PodSpec) bool { |  | ||||||
| 	if podSpec == nil { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 	if podSpec.SecurityContext != nil && podSpec.SecurityContext.ShareProcessNamespace != nil { |  | ||||||
| 		return true |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func tokenRequestProjectionInUse(podSpec *api.PodSpec) bool { | func tokenRequestProjectionInUse(podSpec *api.PodSpec) bool { | ||||||
| 	if podSpec == nil { | 	if podSpec == nil { | ||||||
| 		return false | 		return false | ||||||
|   | |||||||
| @@ -980,106 +980,6 @@ func TestDropEmptyDirSizeLimit(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestDropPodShareProcessNamespace(t *testing.T) { |  | ||||||
| 	podWithShareProcessNamespace := func() *api.Pod { |  | ||||||
| 		return &api.Pod{ |  | ||||||
| 			Spec: api.PodSpec{ |  | ||||||
| 				SecurityContext: &api.PodSecurityContext{ |  | ||||||
| 					ShareProcessNamespace: &[]bool{true}[0], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	podWithoutShareProcessNamespace := func() *api.Pod { |  | ||||||
| 		return &api.Pod{ |  | ||||||
| 			Spec: api.PodSpec{ |  | ||||||
| 				SecurityContext: &api.PodSecurityContext{}, |  | ||||||
| 			}, |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	podWithoutSecurityContext := func() *api.Pod { |  | ||||||
| 		return &api.Pod{ |  | ||||||
| 			Spec: api.PodSpec{}, |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	podInfo := []struct { |  | ||||||
| 		description              string |  | ||||||
| 		hasShareProcessNamespace bool |  | ||||||
| 		pod                      func() *api.Pod |  | ||||||
| 	}{ |  | ||||||
| 		{ |  | ||||||
| 			description:              "has ShareProcessNamespace", |  | ||||||
| 			hasShareProcessNamespace: true, |  | ||||||
| 			pod:                      podWithShareProcessNamespace, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			description:              "does not have ShareProcessNamespace", |  | ||||||
| 			hasShareProcessNamespace: false, |  | ||||||
| 			pod:                      podWithoutShareProcessNamespace, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			description:              "does not have SecurityContext", |  | ||||||
| 			hasShareProcessNamespace: false, |  | ||||||
| 			pod:                      podWithoutSecurityContext, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			description:              "is nil", |  | ||||||
| 			hasShareProcessNamespace: false, |  | ||||||
| 			pod:                      func() *api.Pod { return nil }, |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for _, enabled := range []bool{true, false} { |  | ||||||
| 		for _, oldPodInfo := range podInfo { |  | ||||||
| 			for _, newPodInfo := range podInfo { |  | ||||||
| 				oldPodHasShareProcessNamespace, oldPod := oldPodInfo.hasShareProcessNamespace, oldPodInfo.pod() |  | ||||||
| 				newPodHasShareProcessNamespace, newPod := newPodInfo.hasShareProcessNamespace, newPodInfo.pod() |  | ||||||
| 				if newPod == nil { |  | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				t.Run(fmt.Sprintf("feature enabled=%v, old pod %v, new pod %v", enabled, oldPodInfo.description, newPodInfo.description), func(t *testing.T) { |  | ||||||
| 					defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodShareProcessNamespace, enabled)() |  | ||||||
|  |  | ||||||
| 					var oldPodSpec *api.PodSpec |  | ||||||
| 					if oldPod != nil { |  | ||||||
| 						oldPodSpec = &oldPod.Spec |  | ||||||
| 					} |  | ||||||
| 					dropDisabledFields(&newPod.Spec, nil, oldPodSpec, nil) |  | ||||||
|  |  | ||||||
| 					// old pod should never be changed |  | ||||||
| 					if !reflect.DeepEqual(oldPod, oldPodInfo.pod()) { |  | ||||||
| 						t.Errorf("old pod changed: %v", diff.ObjectReflectDiff(oldPod, oldPodInfo.pod())) |  | ||||||
| 					} |  | ||||||
|  |  | ||||||
| 					switch { |  | ||||||
| 					case enabled || oldPodHasShareProcessNamespace: |  | ||||||
| 						// new pod should not be changed if the feature is enabled, or if the old pod had ShareProcessNamespace set |  | ||||||
| 						if !reflect.DeepEqual(newPod, newPodInfo.pod()) { |  | ||||||
| 							t.Errorf("new pod changed: %v", diff.ObjectReflectDiff(newPod, newPodInfo.pod())) |  | ||||||
| 						} |  | ||||||
| 					case newPodHasShareProcessNamespace: |  | ||||||
| 						// new pod should be changed |  | ||||||
| 						if reflect.DeepEqual(newPod, newPodInfo.pod()) { |  | ||||||
| 							t.Errorf("new pod was not changed") |  | ||||||
| 						} |  | ||||||
| 						// new pod should not have ShareProcessNamespace |  | ||||||
| 						if !reflect.DeepEqual(newPod, podWithoutShareProcessNamespace()) { |  | ||||||
| 							t.Errorf("new pod had ShareProcessNamespace: %v", diff.ObjectReflectDiff(newPod, podWithoutShareProcessNamespace())) |  | ||||||
| 						} |  | ||||||
| 					default: |  | ||||||
| 						// new pod should not need to be changed |  | ||||||
| 						if !reflect.DeepEqual(newPod, newPodInfo.pod()) { |  | ||||||
| 							t.Errorf("new pod changed: %v", diff.ObjectReflectDiff(newPod, newPodInfo.pod())) |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				}) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestDropAppArmor(t *testing.T) { | func TestDropAppArmor(t *testing.T) { | ||||||
| 	podWithAppArmor := func() *api.Pod { | 	podWithAppArmor := func() *api.Pod { | ||||||
| 		return &api.Pod{ | 		return &api.Pod{ | ||||||
|   | |||||||
| @@ -521,7 +521,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS | |||||||
| 	LocalStorageCapacityIsolation:  {Default: true, PreRelease: featuregate.Beta}, | 	LocalStorageCapacityIsolation:  {Default: true, PreRelease: featuregate.Beta}, | ||||||
| 	Sysctls:                        {Default: true, PreRelease: featuregate.Beta}, | 	Sysctls:                        {Default: true, PreRelease: featuregate.Beta}, | ||||||
| 	EphemeralContainers:            {Default: false, PreRelease: featuregate.Alpha}, | 	EphemeralContainers:            {Default: false, PreRelease: featuregate.Alpha}, | ||||||
| 	PodShareProcessNamespace:       {Default: true, PreRelease: featuregate.GA},                      // remove in 1.19 | 	PodShareProcessNamespace:       {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.19 | ||||||
| 	PodPriority:                    {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.18 | 	PodPriority:                    {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.18 | ||||||
| 	TaintNodesByCondition:          {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.18 | 	TaintNodesByCondition:          {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.18 | ||||||
| 	QOSReserved:                    {Default: false, PreRelease: featuregate.Alpha}, | 	QOSReserved:                    {Default: false, PreRelease: featuregate.Alpha}, | ||||||
|   | |||||||
| @@ -24,10 +24,8 @@ import ( | |||||||
|  |  | ||||||
| 	"k8s.io/api/core/v1" | 	"k8s.io/api/core/v1" | ||||||
| 	"k8s.io/apimachinery/pkg/types" | 	"k8s.io/apimachinery/pkg/types" | ||||||
| 	utilfeature "k8s.io/apiserver/pkg/util/feature" |  | ||||||
| 	runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" | 	runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" | ||||||
| 	"k8s.io/klog" | 	"k8s.io/klog" | ||||||
| 	"k8s.io/kubernetes/pkg/features" |  | ||||||
| 	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" | 	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -250,7 +248,7 @@ func pidNamespaceForPod(pod *v1.Pod) runtimeapi.NamespaceMode { | |||||||
| 		if pod.Spec.HostPID { | 		if pod.Spec.HostPID { | ||||||
| 			return runtimeapi.NamespaceMode_NODE | 			return runtimeapi.NamespaceMode_NODE | ||||||
| 		} | 		} | ||||||
| 		if utilfeature.DefaultFeatureGate.Enabled(features.PodShareProcessNamespace) && pod.Spec.ShareProcessNamespace != nil && *pod.Spec.ShareProcessNamespace { | 		if pod.Spec.ShareProcessNamespace != nil && *pod.Spec.ShareProcessNamespace { | ||||||
| 			return runtimeapi.NamespaceMode_POD | 			return runtimeapi.NamespaceMode_POD | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -25,11 +25,8 @@ import ( | |||||||
|  |  | ||||||
| 	"k8s.io/api/core/v1" | 	"k8s.io/api/core/v1" | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| 	utilfeature "k8s.io/apiserver/pkg/util/feature" |  | ||||||
| 	featuregatetesting "k8s.io/component-base/featuregate/testing" |  | ||||||
| 	runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" | 	runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" | ||||||
| 	runtimetesting "k8s.io/cri-api/pkg/apis/testing" | 	runtimetesting "k8s.io/cri-api/pkg/apis/testing" | ||||||
| 	"k8s.io/kubernetes/pkg/features" |  | ||||||
| 	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" | 	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -285,8 +282,6 @@ func TestGetSeccompProfileFromAnnotations(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func TestNamespacesForPod(t *testing.T) { | func TestNamespacesForPod(t *testing.T) { | ||||||
| 	defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodShareProcessNamespace, true)() |  | ||||||
|  |  | ||||||
| 	for desc, test := range map[string]struct { | 	for desc, test := range map[string]struct { | ||||||
| 		input    *v1.Pod | 		input    *v1.Pod | ||||||
| 		expected *runtimeapi.NamespaceOption | 		expected *runtimeapi.NamespaceOption | ||||||
| @@ -350,48 +345,4 @@ func TestNamespacesForPod(t *testing.T) { | |||||||
| 		actual := namespacesForPod(test.input) | 		actual := namespacesForPod(test.input) | ||||||
| 		assert.Equal(t, test.expected, actual) | 		assert.Equal(t, test.expected, actual) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodShareProcessNamespace, false)() |  | ||||||
|  |  | ||||||
| 	for desc, test := range map[string]struct { |  | ||||||
| 		input    *v1.Pod |  | ||||||
| 		expected *runtimeapi.NamespaceOption |  | ||||||
| 	}{ |  | ||||||
| 		"v1.Pod default namespaces": { |  | ||||||
| 			&v1.Pod{}, |  | ||||||
| 			&runtimeapi.NamespaceOption{ |  | ||||||
| 				Ipc:     runtimeapi.NamespaceMode_POD, |  | ||||||
| 				Network: runtimeapi.NamespaceMode_POD, |  | ||||||
| 				Pid:     runtimeapi.NamespaceMode_CONTAINER, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		"Shared Process Namespace (feature disabled)": { |  | ||||||
| 			&v1.Pod{ |  | ||||||
| 				Spec: v1.PodSpec{ |  | ||||||
| 					ShareProcessNamespace: &[]bool{true}[0], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 			&runtimeapi.NamespaceOption{ |  | ||||||
| 				Ipc:     runtimeapi.NamespaceMode_POD, |  | ||||||
| 				Network: runtimeapi.NamespaceMode_POD, |  | ||||||
| 				Pid:     runtimeapi.NamespaceMode_CONTAINER, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		"Shared Process Namespace, redundant flag (feature disabled)": { |  | ||||||
| 			&v1.Pod{ |  | ||||||
| 				Spec: v1.PodSpec{ |  | ||||||
| 					ShareProcessNamespace: &[]bool{false}[0], |  | ||||||
| 				}, |  | ||||||
| 			}, |  | ||||||
| 			&runtimeapi.NamespaceOption{ |  | ||||||
| 				Ipc:     runtimeapi.NamespaceMode_POD, |  | ||||||
| 				Network: runtimeapi.NamespaceMode_POD, |  | ||||||
| 				Pid:     runtimeapi.NamespaceMode_CONTAINER, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 	} { |  | ||||||
| 		t.Logf("TestCase: %s", desc) |  | ||||||
| 		actual := namespacesForPod(test.input) |  | ||||||
| 		assert.Equal(t, test.expected, actual) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -161,7 +161,6 @@ go_test( | |||||||
|         "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", |         "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", | ||||||
|         "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", |         "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", | ||||||
|         "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", |         "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", | ||||||
|         "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", |  | ||||||
|         "//staging/src/k8s.io/client-go/kubernetes:go_default_library", |         "//staging/src/k8s.io/client-go/kubernetes:go_default_library", | ||||||
|         "//staging/src/k8s.io/client-go/tools/watch:go_default_library", |         "//staging/src/k8s.io/client-go/tools/watch:go_default_library", | ||||||
|         "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", |         "//staging/src/k8s.io/cri-api/pkg/apis:go_default_library", | ||||||
|   | |||||||
| @@ -26,8 +26,6 @@ import ( | |||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| 	"k8s.io/apimachinery/pkg/util/sets" | 	"k8s.io/apimachinery/pkg/util/sets" | ||||||
| 	"k8s.io/apimachinery/pkg/util/uuid" | 	"k8s.io/apimachinery/pkg/util/uuid" | ||||||
| 	utilfeature "k8s.io/apiserver/pkg/util/feature" |  | ||||||
| 	"k8s.io/kubernetes/pkg/features" |  | ||||||
| 	"k8s.io/kubernetes/test/e2e/framework" | 	"k8s.io/kubernetes/test/e2e/framework" | ||||||
| 	e2epod "k8s.io/kubernetes/test/e2e/framework/pod" | 	e2epod "k8s.io/kubernetes/test/e2e/framework/pod" | ||||||
| 	imageutils "k8s.io/kubernetes/test/utils/image" | 	imageutils "k8s.io/kubernetes/test/utils/image" | ||||||
| @@ -79,10 +77,6 @@ var _ = framework.KubeDescribe("Security Context", func() { | |||||||
| 			if !isEnabled { | 			if !isEnabled { | ||||||
| 				framework.Skipf("Skipped because shared PID namespace is not supported by this docker version.") | 				framework.Skipf("Skipped because shared PID namespace is not supported by this docker version.") | ||||||
| 			} | 			} | ||||||
| 			// It's not enough to set this flag in the kubelet because the apiserver needs it too |  | ||||||
| 			if !utilfeature.DefaultFeatureGate.Enabled(features.PodShareProcessNamespace) { |  | ||||||
| 				framework.Skipf("run test with --feature-gates=PodShareProcessNamespace=true to test PID namespace sharing") |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			ginkgo.By("Create a pod with shared PID namespace.") | 			ginkgo.By("Create a pod with shared PID namespace.") | ||||||
| 			f.PodClient().CreateSync(&v1.Pod{ | 			f.PodClient().CreateSync(&v1.Pod{ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user