Skip to content

Commit a2e702e

Browse files
committed
WIP: break this up
1 parent 007e393 commit a2e702e

File tree

16 files changed

+142
-28
lines changed

16 files changed

+142
-28
lines changed

cmd/kube-controller-manager/app/storageversionmigrator.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ import (
2626
"k8s.io/controller-manager/controller"
2727
"k8s.io/kubernetes/cmd/kube-controller-manager/names"
2828
"k8s.io/kubernetes/pkg/features"
29+
"k8s.io/utils/feature"
2930

30-
utilfeature "k8s.io/apiserver/pkg/util/feature"
31+
oldutilfeature "k8s.io/apiserver/pkg/util/feature"
3132
clientgofeaturegate "k8s.io/client-go/features"
3233
svm "k8s.io/kubernetes/pkg/controller/storageversionmigrator"
3334
)
@@ -45,8 +46,8 @@ func startSVMController(
4546
controllerContext ControllerContext,
4647
controllerName string,
4748
) (controller.Interface, bool, error) {
48-
if !utilfeature.DefaultFeatureGate.Enabled(features.StorageVersionMigrator) ||
49-
!clientgofeaturegate.FeatureGates().Enabled(clientgofeaturegate.InformerResourceVersion) {
49+
if !oldutilfeature.DefaultFeatureGate.Enabled(features.StorageVersionMigrator) &&
50+
!feature.Enabled(clientgofeaturegate.InformerResourceVersion3) {
5051
return nil, false, nil
5152
}
5253

cmd/kube-controller-manager/controller-manager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424
"os"
2525
_ "time/tzdata" // for CronJob Time Zone support
2626

27+
clientfeatures "k8s.io/client-go/features"
28+
2729
"k8s.io/component-base/cli"
2830
_ "k8s.io/component-base/logs/json/register" // for JSON log format registration
2931
_ "k8s.io/component-base/metrics/prometheus/clientgo" // load all the prometheus client-go plugin
@@ -32,6 +34,9 @@ import (
3234
)
3335

3436
func main() {
37+
// FIXME: Example, do not merge
38+
clientfeatures.WatchListClient3.Set(true)
39+
3540
command := app.NewControllerManagerCommand()
3641
code := cli.Run(command)
3742
os.Exit(code)

pkg/api/pod/util.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"k8s.io/kubernetes/pkg/apis/core/helper"
3030
apivalidation "k8s.io/kubernetes/pkg/apis/core/validation"
3131
"k8s.io/kubernetes/pkg/features"
32+
"k8s.io/utils/feature"
3233
)
3334

3435
// ContainerType signifies container type
@@ -685,7 +686,8 @@ func dropDisabledFields(
685686
// For other types of containers, validateContainers will handle them.
686687
}
687688

688-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) && !rroInUse(oldPodSpec) {
689+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
690+
!feature.Enabled(features.RecursiveReadOnlyMounts3) && !rroInUse(oldPodSpec) {
689691
for i := range podSpec.Containers {
690692
for j := range podSpec.Containers[i].VolumeMounts {
691693
podSpec.Containers[i].VolumeMounts[j].RecursiveReadOnly = nil
@@ -809,7 +811,8 @@ func dropDisabledPodStatusFields(podStatus, oldPodStatus *api.PodStatus, podSpec
809811
podStatus.HostIPs = nil
810812
}
811813

812-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) && !rroInUse(oldPodSpec) {
814+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
815+
!feature.Enabled(features.RecursiveReadOnlyMounts3) && !rroInUse(oldPodSpec) {
813816
for i := range podStatus.ContainerStatuses {
814817
podStatus.ContainerStatuses[i].VolumeMounts = nil
815818
}

pkg/controlplane/apiserver/options/options.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"strings"
2525
"time"
2626

27-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2827
peerreconcilers "k8s.io/apiserver/pkg/reconcilers"
2928
genericoptions "k8s.io/apiserver/pkg/server/options"
3029
"k8s.io/apiserver/pkg/storage/storagebackend"
@@ -34,6 +33,7 @@ import (
3433
logsapi "k8s.io/component-base/logs/api/v1"
3534
"k8s.io/component-base/metrics"
3635
"k8s.io/klog/v2"
36+
"k8s.io/kubernetes/pkg/features"
3737
netutil "k8s.io/utils/net"
3838

3939
_ "k8s.io/kubernetes/pkg/features"
@@ -101,7 +101,7 @@ type CompletedOptions struct {
101101
// NewOptions creates a new ServerRunOptions object with default parameters
102102
func NewOptions() *Options {
103103
s := Options{
104-
GenericServerRunOptions: genericoptions.NewServerRunOptions(),
104+
GenericServerRunOptions: genericoptions.NewServerRunOptions(features.KubernetesGates()),
105105
Etcd: genericoptions.NewEtcdOptions(storagebackend.NewDefaultConfig(kubeoptions.DefaultEtcdPathPrefix, nil)),
106106
SecureServing: kubeoptions.NewSecureServingOptions(),
107107
Audit: genericoptions.NewAuditOptions(),

pkg/features/kube_features.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
utilfeature "k8s.io/apiserver/pkg/util/feature"
2424
clientfeatures "k8s.io/client-go/features"
2525
"k8s.io/component-base/featuregate"
26+
kubeaggregatorfeatures "k8s.io/kube-aggregator/pkg/features"
27+
"k8s.io/utils/feature"
2628
)
2729

2830
const (
@@ -964,6 +966,26 @@ const (
964966
RecursiveReadOnlyMounts featuregate.Feature = "RecursiveReadOnlyMounts"
965967
)
966968

969+
var (
970+
kubeGates = feature.MergeGateSets(
971+
clientfeatures.FeatureGates(),
972+
kubeaggregatorfeatures.FeatureGates(),
973+
apiextensionsfeatures.FeatureGates())
974+
975+
// owner: @AkihiroSuda
976+
// kep: https://kep.k8s.io/3857
977+
// alpha: v1.30
978+
//
979+
// Allows recursive read-only mounts.
980+
RecursiveReadOnlyMounts3 = kubeGates.Add(&feature.Gate{
981+
Name: "RecursiveReadOnlyMounts", Default: false, Release: feature.Alpha,
982+
})
983+
)
984+
985+
func KubernetesGates() *feature.GateSet {
986+
return kubeGates
987+
}
988+
967989
func init() {
968990
runtime.Must(utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates))
969991

pkg/kubelet/kubelet_pods.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import (
6969
"k8s.io/kubernetes/pkg/volume/util/volumepathhandler"
7070
volumevalidation "k8s.io/kubernetes/pkg/volume/validation"
7171
"k8s.io/kubernetes/third_party/forked/golang/expansion"
72+
"k8s.io/utils/feature"
7273
utilnet "k8s.io/utils/net"
7374
)
7475

@@ -348,7 +349,8 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h
348349
if err != nil {
349350
return nil, cleanupAction, fmt.Errorf("failed to resolve recursive read-only mode: %w", err)
350351
}
351-
if rro && !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
352+
if rro && !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
353+
!feature.Enabled(features.RecursiveReadOnlyMounts3) {
352354
return nil, cleanupAction, fmt.Errorf("recursive read-only mount needs feature gate %q to be enabled", features.RecursiveReadOnlyMounts)
353355
}
354356

@@ -2136,7 +2138,8 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon
21362138
}
21372139
// status.VolumeMounts cannot be propagated from kubecontainer.Status
21382140
// because the CRI API is unaware of the volume names.
2139-
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
2141+
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) ||
2142+
feature.Enabled(features.RecursiveReadOnlyMounts3) {
21402143
for _, vol := range container.VolumeMounts {
21412144
volStatus := v1.VolumeMountStatus{
21422145
Name: vol.Name,
@@ -2148,7 +2151,8 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon
21482151
if b, err := resolveRecursiveReadOnly(vol, supportsRRO); err != nil {
21492152
klog.ErrorS(err, "failed to resolve recursive read-only mode", "mode", *vol.RecursiveReadOnly)
21502153
} else if b {
2151-
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
2154+
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) ||
2155+
feature.Enabled(features.RecursiveReadOnlyMounts3) {
21522156
rroMode = v1.RecursiveReadOnlyEnabled
21532157
} else {
21542158
klog.ErrorS(nil, "recursive read-only mount needs feature gate to be enabled",

pkg/kubelet/nodestatus/setters.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"k8s.io/kubernetes/pkg/kubelet/cm"
4444
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
4545
"k8s.io/kubernetes/pkg/kubelet/events"
46+
"k8s.io/utils/feature"
4647
netutils "k8s.io/utils/net"
4748

4849
"k8s.io/klog/v2"
@@ -485,7 +486,8 @@ func GoRuntime() Setter {
485486
// RuntimeHandlers returns a Setter that sets RuntimeHandlers on the node.
486487
func RuntimeHandlers(fn func() []kubecontainer.RuntimeHandler) Setter {
487488
return func(ctx context.Context, node *v1.Node) error {
488-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
489+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
490+
!feature.Enabled(features.RecursiveReadOnlyMounts3) {
489491
return nil
490492
}
491493
handlers := fn()

pkg/registry/core/node/strategy.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"k8s.io/kubernetes/pkg/apis/core/validation"
4141
"k8s.io/kubernetes/pkg/features"
4242
"k8s.io/kubernetes/pkg/kubelet/client"
43+
"k8s.io/utils/feature"
4344
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
4445
)
4546

@@ -103,7 +104,8 @@ func dropDisabledFields(node *api.Node, oldNode *api.Node) {
103104
node.Spec.ConfigSource = nil
104105
}
105106

106-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
107+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
108+
!feature.Enabled(features.RecursiveReadOnlyMounts3) {
107109
node.Status.RuntimeHandlers = nil
108110
}
109111
}

staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/options.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ type CustomResourceDefinitionsServerOptions struct {
6060
// NewCustomResourceDefinitionsServerOptions creates default options of an apiextensions-apiserver.
6161
func NewCustomResourceDefinitionsServerOptions(out, errOut io.Writer) *CustomResourceDefinitionsServerOptions {
6262
o := &CustomResourceDefinitionsServerOptions{
63-
ServerRunOptions: genericoptions.NewServerRunOptions(),
63+
ServerRunOptions: genericoptions.NewServerRunOptions(features.FeatureGates()),
6464
RecommendedOptions: genericoptions.NewRecommendedOptions(
6565
defaultEtcdPathPrefix,
6666
apiserver.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion),

staging/src/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,22 @@ package features
1919
import (
2020
utilfeature "k8s.io/apiserver/pkg/util/feature"
2121
"k8s.io/component-base/featuregate"
22+
"k8s.io/utils/feature"
2223
)
2324

2425
const (
26+
CRDValidationRatcheting featuregate.Feature = "CRDValidationRatcheting"
27+
28+
CustomResourceFieldSelectors featuregate.Feature = "CustomResourceFieldSelectors"
29+
)
30+
31+
func init() {
32+
utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates)
33+
}
34+
35+
var (
36+
libGates = &feature.GateSet{}
37+
2538
// Every feature gate should add method here following this template:
2639
//
2740
// // owner: @username
@@ -33,18 +46,26 @@ const (
3346
//
3447
// Ignores errors raised on unchanged fields of Custom Resources
3548
// across UPDATE/PATCH requests.
36-
CRDValidationRatcheting featuregate.Feature = "CRDValidationRatcheting"
49+
CRDValidationRatcheting3 = libGates.Add(&feature.Gate{
50+
Name: "CRDValidationRatcheting",
51+
Default: true,
52+
Release: feature.Beta,
53+
})
3754

3855
// owner: @jpbetz
3956
// alpha: v1.30
4057
//
4158
// CustomResourceDefinitions may include SelectableFields to declare which fields
4259
// may be used as field selectors.
43-
CustomResourceFieldSelectors featuregate.Feature = "CustomResourceFieldSelectors"
60+
CustomResourceFieldSelectors3 = libGates.Add(&feature.Gate{
61+
Name: "CustomResourceFieldSelectors",
62+
Default: false,
63+
Release: feature.Beta,
64+
})
4465
)
4566

46-
func init() {
47-
utilfeature.DefaultMutableFeatureGate.Add(defaultKubernetesFeatureGates)
67+
func FeatureGates() *feature.GateSet {
68+
return libGates
4869
}
4970

5071
// defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys.

0 commit comments

Comments
 (0)