diff --git a/cmd/genfeaturegates/genfeaturegates.go b/cmd/genfeaturegates/genfeaturegates.go
new file mode 100644
index 00000000000..f2690a7d3b2
--- /dev/null
+++ b/cmd/genfeaturegates/genfeaturegates.go
@@ -0,0 +1,598 @@
+/*
+Copyright 2025 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+
+ "k8s.io/apimachinery/pkg/util/version"
+ "k8s.io/component-base/featuregate"
+
+ _ "k8s.io/apiextensions-apiserver/pkg/features"
+ _ "k8s.io/apiserver/pkg/features"
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
+ _ "k8s.io/kubernetes/pkg/features"
+)
+
+var (
+ sortBy = flag.String("sort", "name", "Sort by: name, stage, alpha, beta, ga, deprecated")
+ reverse = flag.Bool("reverse", false, "Reverse sort order")
+ output = flag.String("output", "", "Output file path (stdout if empty)")
+ filterStage = flag.String("stage", "", "Filter by stage: alpha, beta, ga, deprecated")
+ format = flag.String("format", "markdown", "Output format: markdown, json")
+)
+
+// FeatureGateJSON represents a feature gate in JSON output format
+type FeatureGateJSON struct {
+ Name string `json:"name"`
+ Stages []StageJSON `json:"stages"`
+ Dependencies []string `json:"dependencies,omitempty"`
+}
+
+// StageJSON represents a stage in the feature gate lifecycle
+type StageJSON struct {
+ Stage string `json:"stage"`
+ FromVersion string `json:"fromVersion"`
+ ToVersion string `json:"toVersion,omitempty"`
+ Default bool `json:"defaultValue"`
+ Locked bool `json:"locked,omitempty"`
+}
+
+// stageInfo holds version range info for a single stage entry
+type stageInfo struct {
+ fromVersion string
+ toVersion string
+}
+
+// featureInfo holds processed information about a feature gate (for markdown)
+type featureInfo struct {
+ name string
+ stage string
+ stageOrder int // for sorting: 1=Alpha, 2=Beta, 3=GA, 4=Deprecated
+ enabledFromVersion string
+ lockedFromVersion string
+ alphaStages []stageInfo
+ alphaVersion *version.Version
+ betaStages []stageInfo
+ betaVersion *version.Version
+ gaStages []stageInfo
+ gaVersion *version.Version
+ depStages []stageInfo
+ depVersion *version.Version
+ deps string
+ linkCode string
+ linkKEPs string
+}
+
+func main() {
+ flag.Usage = func() {
+ fmt.Fprintf(os.Stderr, "Usage: %s [flags]\n\nFlags:\n", os.Args[0])
+ flag.PrintDefaults()
+ fmt.Fprintf(os.Stderr, "\nExamples:\n")
+ fmt.Fprintf(os.Stderr, " %s # Markdown output (default)\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, " %s -format=json # JSON output\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, " %s -sort=stage # Sort by current stage\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, " %s -sort=alpha # Sort by alpha version\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, " %s -sort=ga -reverse # Sort by GA version, newest first\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, " %s -stage=alpha # Show only alpha features\n", os.Args[0])
+ fmt.Fprintf(os.Stderr, " %s -output=features.json # Write to file\n", os.Args[0])
+ }
+ flag.Parse()
+
+ var result string
+ if *format == "json" {
+ result = generateJSON(*filterStage)
+ } else {
+ result = generateMarkdown(*sortBy, *reverse, *filterStage)
+ }
+
+ if *output == "" {
+ fmt.Print(result)
+ } else {
+ dir := filepath.Dir(*output)
+ if dir != "" && dir != "." {
+ if err := os.MkdirAll(dir, 0755); err != nil {
+ fmt.Fprintf(os.Stderr, "failed to create output directory: %v\n", err)
+ os.Exit(1)
+ }
+ }
+ if err := os.WriteFile(*output, []byte(result), 0644); err != nil {
+ fmt.Fprintf(os.Stderr, "failed to write output file: %v\n", err)
+ os.Exit(1)
+ }
+ }
+}
+
+// skipFeatures are meta-features that should not appear in the feature list
+var skipFeatures = map[string]bool{
+ "AllAlpha": true,
+ "AllBeta": true,
+}
+
+func generateJSON(filterStage string) string {
+ // Get all versioned feature specs and dependencies using public methods
+ allFeatures := utilfeature.DefaultMutableFeatureGate.GetAllVersioned()
+ allDependencies := utilfeature.DefaultMutableFeatureGate.Dependencies()
+
+ // Build feature list
+ features := make([]FeatureGateJSON, 0, len(allFeatures))
+
+ for featureName, specs := range allFeatures {
+ feature := string(featureName)
+
+ // Skip meta-features
+ if skipFeatures[feature] {
+ continue
+ }
+
+ // Sort specs by version to process in order
+ sort.Sort(featuregate.VersionedSpecs(specs))
+
+ fg := FeatureGateJSON{
+ Name: feature,
+ Stages: make([]StageJSON, 0),
+ }
+
+ // Track versions for each stage to compute toVersion
+ type stageEntry struct {
+ stage string
+ fromVersion string
+ defaultVal bool
+ locked bool
+ }
+ var entries []stageEntry
+
+ for _, spec := range specs {
+ stageName := ""
+ switch spec.PreRelease {
+ case featuregate.Alpha:
+ stageName = "alpha"
+ case featuregate.Beta:
+ stageName = "beta"
+ case featuregate.GA:
+ stageName = "stable"
+ case featuregate.Deprecated:
+ stageName = "deprecated"
+ }
+
+ entries = append(entries, stageEntry{
+ stage: stageName,
+ fromVersion: spec.Version.String(),
+ defaultVal: spec.Default,
+ locked: spec.LockToDefault,
+ })
+ }
+
+ // Convert entries to stages with toVersion
+ for i, entry := range entries {
+ stage := StageJSON{
+ Stage: entry.stage,
+ FromVersion: entry.fromVersion,
+ Default: entry.defaultVal,
+ Locked: entry.locked,
+ }
+
+ // Find toVersion: look for next entry that represents a change
+ // (different stage, different default, or different locked status)
+ for j := i + 1; j < len(entries); j++ {
+ if entries[j].stage != entry.stage ||
+ entries[j].defaultVal != entry.defaultVal ||
+ entries[j].locked != entry.locked {
+ // toVersion is one minor version before the next entry's fromVersion
+ stage.ToVersion = getPreviousMinorVersion(entries[j].fromVersion)
+ break
+ }
+ }
+
+ fg.Stages = append(fg.Stages, stage)
+ }
+
+ // Deduplicate stages - keep first occurrence of each stage with merged version range
+ fg.Stages = deduplicateStages(fg.Stages)
+
+ // Apply stage filter
+ if filterStage != "" {
+ hasStage := false
+ for _, s := range fg.Stages {
+ if strings.EqualFold(s.Stage, filterStage) || (filterStage == "ga" && s.Stage == "stable") {
+ hasStage = true
+ break
+ }
+ }
+ if !hasStage {
+ continue
+ }
+ }
+
+ // Get dependencies
+ deps := allDependencies[featuregate.Feature(feature)]
+ if len(deps) > 0 {
+ fg.Dependencies = make([]string, len(deps))
+ for i, d := range deps {
+ fg.Dependencies[i] = string(d)
+ }
+ }
+
+ features = append(features, fg)
+ }
+
+ // Sort by name
+ sort.Slice(features, func(i, j int) bool {
+ return features[i].Name < features[j].Name
+ })
+
+ jsonBytes, err := json.MarshalIndent(features, "", " ")
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "failed to marshal JSON: %v\n", err)
+ os.Exit(1)
+ }
+
+ return string(jsonBytes) + "\n"
+}
+
+// getPreviousMinorVersion returns the previous minor version (e.g., "1.30" -> "1.29")
+func getPreviousMinorVersion(ver string) string {
+ v, err := version.Parse(ver)
+ if err != nil {
+ return ""
+ }
+ minor := v.Minor()
+ if minor > 0 {
+ return fmt.Sprintf("%d.%d", v.Major(), minor-1)
+ }
+ return ""
+}
+
+// deduplicateStages merges consecutive entries with the same stage, default, and locked values.
+// If defaultValue or locked changes within the same stage, we keep separate entries to preserve
+// the full lifecycle history (e.g., beta disabled in 1.23, beta enabled in 1.24).
+func deduplicateStages(stages []StageJSON) []StageJSON {
+ if len(stages) == 0 {
+ return stages
+ }
+
+ result := make([]StageJSON, 0)
+ current := stages[0]
+
+ for i := 1; i < len(stages); i++ {
+ // Only merge if stage, default, AND locked are all the same
+ if stages[i].Stage == current.Stage &&
+ stages[i].Default == current.Default &&
+ stages[i].Locked == current.Locked {
+ // Same stage with same settings, extend the version range
+ current.ToVersion = stages[i].ToVersion
+ } else {
+ // Different stage or settings changed, save current and start new
+ result = append(result, current)
+ current = stages[i]
+ }
+ }
+ result = append(result, current)
+
+ return result
+}
+
+func generateMarkdown(sortBy string, reverseSort bool, filterStage string) string {
+ // Get all versioned feature specs and dependencies using public methods
+ allFeatures := utilfeature.DefaultMutableFeatureGate.GetAllVersioned()
+ allDependencies := utilfeature.DefaultMutableFeatureGate.Dependencies()
+
+ // Build feature info list
+ features := make([]featureInfo, 0, len(allFeatures))
+
+ for featureName, specs := range allFeatures {
+ feature := string(featureName)
+
+ // Skip meta-features
+ if skipFeatures[feature] {
+ continue
+ }
+
+ info := featureInfo{
+ name: feature,
+ }
+
+ // Sort specs by version to process in order
+ sort.Sort(featuregate.VersionedSpecs(specs))
+
+ // First pass: collect all entries with their stage info
+ type rawEntry struct {
+ version *version.Version
+ verStr string
+ isAlpha bool
+ isBeta bool
+ isGA bool
+ isDeprecated bool
+ defaultOn bool
+ locked bool
+ }
+ var entries []rawEntry
+
+ for _, spec := range specs {
+ entry := rawEntry{
+ version: spec.Version,
+ verStr: spec.Version.String(),
+ defaultOn: spec.Default,
+ locked: spec.LockToDefault,
+ }
+ switch spec.PreRelease {
+ case featuregate.Alpha:
+ entry.isAlpha = true
+ case featuregate.Beta:
+ entry.isBeta = true
+ case featuregate.GA:
+ entry.isGA = true
+ case featuregate.Deprecated:
+ entry.isDeprecated = true
+ }
+ entries = append(entries, entry)
+
+ // Track first version for each stage and first enabled/locked versions
+ switch spec.PreRelease {
+ case featuregate.Alpha:
+ if info.alphaVersion == nil {
+ info.alphaVersion = spec.Version
+ }
+ info.stage = "Alpha"
+ info.stageOrder = 1
+ case featuregate.Beta:
+ if info.betaVersion == nil {
+ info.betaVersion = spec.Version
+ }
+ info.stage = "Beta"
+ info.stageOrder = 2
+ case featuregate.GA:
+ if info.gaVersion == nil {
+ info.gaVersion = spec.Version
+ }
+ info.stage = "GA"
+ info.stageOrder = 3
+ case featuregate.Deprecated:
+ if info.depVersion == nil {
+ info.depVersion = spec.Version
+ }
+ info.stage = "Deprecated"
+ info.stageOrder = 4
+ }
+
+ // Track when feature was first enabled by default
+ if spec.Default && info.enabledFromVersion == "" {
+ info.enabledFromVersion = spec.Version.String()
+ }
+ // Track when feature was first locked
+ if spec.LockToDefault && info.lockedFromVersion == "" {
+ info.lockedFromVersion = spec.Version.String()
+ }
+ }
+
+ // Second pass: build stage ranges with toVersion
+ // We only track stage transitions (alpha->beta->ga->deprecated), not enabled/locked changes.
+ // The Enabled and Locked columns show when those settings changed.
+ for i := 0; i < len(entries); i++ {
+ entry := entries[i]
+ si := stageInfo{
+ fromVersion: entry.verStr,
+ }
+
+ // Find toVersion: look for the next entry with a different stage
+ for j := i + 1; j < len(entries); j++ {
+ sameStage := (entry.isAlpha == entries[j].isAlpha &&
+ entry.isBeta == entries[j].isBeta &&
+ entry.isGA == entries[j].isGA &&
+ entry.isDeprecated == entries[j].isDeprecated)
+ if !sameStage {
+ si.toVersion = getPreviousMinorVersion(entries[j].verStr)
+ break
+ }
+ }
+
+ // Merge with previous entry if same stage, otherwise add new entry
+ if entry.isAlpha {
+ if len(info.alphaStages) > 0 {
+ last := &info.alphaStages[len(info.alphaStages)-1]
+ last.toVersion = si.toVersion
+ continue
+ }
+ info.alphaStages = append(info.alphaStages, si)
+ } else if entry.isBeta {
+ if len(info.betaStages) > 0 {
+ last := &info.betaStages[len(info.betaStages)-1]
+ last.toVersion = si.toVersion
+ continue
+ }
+ info.betaStages = append(info.betaStages, si)
+ } else if entry.isGA {
+ if len(info.gaStages) > 0 {
+ last := &info.gaStages[len(info.gaStages)-1]
+ last.toVersion = si.toVersion
+ continue
+ }
+ info.gaStages = append(info.gaStages, si)
+ } else if entry.isDeprecated {
+ if len(info.depStages) > 0 {
+ last := &info.depStages[len(info.depStages)-1]
+ last.toVersion = si.toVersion
+ continue
+ }
+ info.depStages = append(info.depStages, si)
+ }
+ }
+
+ // Apply stage filter
+ if filterStage != "" && !strings.EqualFold(info.stage, filterStage) {
+ continue
+ }
+
+ // Get dependencies for this feature as bullet list (one per line)
+ deps := allDependencies[featuregate.Feature(feature)]
+ if len(deps) > 0 {
+ depItems := make([]string, len(deps))
+ for i, d := range deps {
+ depItems[i] = string(d)
+ }
+ info.deps = strings.Join(depItems, "
")
+ }
+
+ info.linkCode = fmt.Sprintf("[code](https://cs.k8s.io/?q=%%5Cb%s%%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes)", feature)
+ info.linkKEPs = fmt.Sprintf("[KEPs](https://cs.k8s.io/?q=%%5Cb%s%%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements)", feature)
+
+ features = append(features, info)
+ }
+
+ // Sort features based on sortBy parameter
+ sortFeatures(features, sortBy, reverseSort)
+
+ // Build markdown output
+ var sb strings.Builder
+ sb.WriteString("# Kubernetes Feature Gates\n\n")
+ sb.WriteString("\n")
+ sb.WriteString("\n\n")
+
+ if filterStage != "" {
+ sb.WriteString(fmt.Sprintf("*Showing only %s features (%d)*\n\n", strings.ToUpper(filterStage), len(features)))
+ }
+
+ sb.WriteString("| Feature | Enabled | Locked | Alpha | Beta | GA | Deprecated | Dependencies | Links |\n")
+ sb.WriteString("|---------|---------|--------|-------|------|----|------------|--------------|-------|\n")
+
+ for _, info := range features {
+ sb.WriteString(fmt.Sprintf("| %s | %s | %s | %s | %s | %s | %s | %s | %s %s |\n",
+ info.name,
+ formatEnabledColumn(info.enabledFromVersion),
+ formatLockedColumn(info.lockedFromVersion),
+ formatStageRanges(info.alphaStages),
+ formatStageRanges(info.betaStages),
+ formatStageRanges(info.gaStages),
+ formatStageRanges(info.depStages),
+ info.deps, info.linkCode, info.linkKEPs))
+ }
+
+ sb.WriteString("\n## Legend\n\n")
+ sb.WriteString("| Symbol | Meaning |\n")
+ sb.WriteString("|--------|--------|\n")
+ sb.WriteString("| :ballot_box_with_check: | Enabled by default (in Enabled column: version when first enabled) |\n")
+ sb.WriteString("| :closed_lock_with_key: | Locked to default, cannot be changed (in Locked column: version when first locked) |\n")
+ sb.WriteString("| 1.X– | Feature is in this state from version 1.X (open-ended range) |\n")
+
+ return sb.String()
+}
+
+// formatEnabledColumn formats the Enabled column showing when a feature was first enabled by default
+func formatEnabledColumn(enabledFromVersion string) string {
+ if enabledFromVersion == "" {
+ return ""
+ }
+ return ":ballot_box_with_check: " + enabledFromVersion + "+"
+}
+
+// formatLockedColumn formats the Locked column showing when a feature was first locked
+func formatLockedColumn(lockedFromVersion string) string {
+ if lockedFromVersion == "" {
+ return ""
+ }
+ return ":closed_lock_with_key: " + lockedFromVersion + "+"
+}
+
+// formatStageRanges formats a list of stage ranges for markdown display
+// Each range shows "fromVersion–toVersion" (with en-dash) or "fromVersion–" for open-ended ranges
+func formatStageRanges(stages []stageInfo) string {
+ if len(stages) == 0 {
+ return ""
+ }
+
+ var parts []string
+ for i, s := range stages {
+ var versionRange string
+ if s.toVersion != "" && s.toVersion != s.fromVersion {
+ versionRange = s.fromVersion + "–" + s.toVersion // en-dash for range
+ } else if s.toVersion == "" && i == len(stages)-1 {
+ // Last stage with no end version - trailing en-dash indicates open range
+ versionRange = s.fromVersion + "–"
+ } else {
+ versionRange = s.fromVersion
+ }
+
+ parts = append(parts, versionRange)
+ }
+
+ return strings.Join(parts, ", ")
+}
+
+func sortFeatures(features []featureInfo, sortBy string, reverseSort bool) {
+ var less func(i, j int) bool
+
+ switch sortBy {
+ case "stage":
+ less = func(i, j int) bool {
+ if features[i].stageOrder != features[j].stageOrder {
+ return features[i].stageOrder < features[j].stageOrder
+ }
+ return features[i].name < features[j].name
+ }
+ case "alpha":
+ less = func(i, j int) bool {
+ return compareVersions(features[i].alphaVersion, features[j].alphaVersion, features[i].name, features[j].name)
+ }
+ case "beta":
+ less = func(i, j int) bool {
+ return compareVersions(features[i].betaVersion, features[j].betaVersion, features[i].name, features[j].name)
+ }
+ case "ga":
+ less = func(i, j int) bool {
+ return compareVersions(features[i].gaVersion, features[j].gaVersion, features[i].name, features[j].name)
+ }
+ case "deprecated":
+ less = func(i, j int) bool {
+ return compareVersions(features[i].depVersion, features[j].depVersion, features[i].name, features[j].name)
+ }
+ default: // "name"
+ less = func(i, j int) bool {
+ return features[i].name < features[j].name
+ }
+ }
+
+ if reverseSort {
+ sort.Slice(features, func(i, j int) bool {
+ return less(j, i)
+ })
+ } else {
+ sort.Slice(features, less)
+ }
+}
+
+// compareVersions compares two versions, putting nil versions last
+func compareVersions(v1, v2 *version.Version, name1, name2 string) bool {
+ if v1 == nil && v2 == nil {
+ return name1 < name2
+ }
+ if v1 == nil {
+ return false // nil goes last
+ }
+ if v2 == nil {
+ return true // nil goes last
+ }
+ if v1.EqualTo(v2) {
+ return name1 < name2
+ }
+ return v1.LessThan(v2)
+}
diff --git a/hack/update-featuregates.sh b/hack/update-featuregates.sh
index 792c6e05bc2..274e8f0fb56 100755
--- a/hack/update-featuregates.sh
+++ b/hack/update-featuregates.sh
@@ -14,8 +14,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# This script updates test/compatibility_lifecycle/reference/versioned_feature_list.yaml
-# with all the feature gate features.
+# This script updates test/compatibility_lifecycle/reference/versioned_feature_list.yaml
+# and test/compatibility_lifecycle/reference/feature_list.md with all the feature gate features.
# Usage: `hack/update-featuregates.sh`.
set -o errexit
@@ -28,3 +28,4 @@ source "${KUBE_ROOT}/hack/lib/init.sh"
cd "${KUBE_ROOT}"
go run test/compatibility_lifecycle/main.go feature-gates update
+go run cmd/genfeaturegates/genfeaturegates.go -output=test/compatibility_lifecycle/reference/feature_list.md
diff --git a/hack/verify-featuregates.sh b/hack/verify-featuregates.sh
index 1122d62d795..510a236cbb3 100755
--- a/hack/verify-featuregates.sh
+++ b/hack/verify-featuregates.sh
@@ -15,7 +15,8 @@
# limitations under the License.
# This script checks test/compatibility_lifecycle/reference/versioned_feature_list.yaml
-# are up to date with all the feature gate features, and verifies no feature is removed before 3 versions post `lockedToDefault:true`.
+# and test/compatibility_lifecycle/reference/feature_list.md are up to date with all the
+# feature gate features, and verifies no feature is removed before 3 versions post `lockedToDefault:true`.
# We should run `hack/update-featuregates.sh` if the list is out of date.
# Usage: `hack/verify-featuregates.sh`.
@@ -34,3 +35,16 @@ if ! go run test/compatibility_lifecycle/main.go feature-gates verify; then
echo "Please run 'hack/update-featuregates.sh' to update the feature list."
exit 1
fi
+
+# Verify feature_list.md is up to date
+FEATURE_LIST_MD="test/compatibility_lifecycle/reference/feature_list.md"
+TMPFILE=$(mktemp)
+trap 'rm -f "${TMPFILE}"' EXIT
+
+go run cmd/genfeaturegates/genfeaturegates.go -output="${TMPFILE}"
+
+if ! diff -q "${FEATURE_LIST_MD}" "${TMPFILE}" > /dev/null 2>&1; then
+ echo "${FEATURE_LIST_MD} is out of date."
+ echo "Please run 'hack/update-featuregates.sh' to update the feature list."
+ exit 1
+fi
diff --git a/test/compatibility_lifecycle/reference/feature_list.md b/test/compatibility_lifecycle/reference/feature_list.md
new file mode 100644
index 00000000000..effcb165b29
--- /dev/null
+++ b/test/compatibility_lifecycle/reference/feature_list.md
@@ -0,0 +1,229 @@
+# Kubernetes Feature Gates
+
+
+
+
+| Feature | Enabled | Locked | Alpha | Beta | GA | Deprecated | Dependencies | Links |
+|---------|---------|--------|-------|------|----|------------|--------------|-------|
+| APIResponseCompression | :ballot_box_with_check: 1.16+ | | 1.8–1.15 | 1.16– | | | | [code](https://cs.k8s.io/?q=%5CbAPIResponseCompression%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAPIResponseCompression%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| APIServerIdentity | :ballot_box_with_check: 1.26+ | | 1.20–1.25 | 1.26– | | | | [code](https://cs.k8s.io/?q=%5CbAPIServerIdentity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAPIServerIdentity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| APIServerTracing | :ballot_box_with_check: 1.27+ | :closed_lock_with_key: 1.34+ | 1.22–1.26 | 1.27–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbAPIServerTracing%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAPIServerTracing%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| APIServingWithRoutine | | | 1.30– | | | | | [code](https://cs.k8s.io/?q=%5CbAPIServingWithRoutine%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAPIServingWithRoutine%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AggregatedDiscoveryRemoveBetaType | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.35+ | | | 1.0–1.32 | 1.33– | | [code](https://cs.k8s.io/?q=%5CbAggregatedDiscoveryRemoveBetaType%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAggregatedDiscoveryRemoveBetaType%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AllowDNSOnlyNodeCSR | :ballot_box_with_check: 1.0+ | | | | 1.0–1.30 | 1.31– | | [code](https://cs.k8s.io/?q=%5CbAllowDNSOnlyNodeCSR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAllowDNSOnlyNodeCSR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AllowInsecureKubeletCertificateSigningRequests | :ballot_box_with_check: 1.0+ | | | | 1.0–1.30 | 1.31– | | [code](https://cs.k8s.io/?q=%5CbAllowInsecureKubeletCertificateSigningRequests%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAllowInsecureKubeletCertificateSigningRequests%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AllowOverwriteTerminationGracePeriodSeconds | :ballot_box_with_check: 1.0+ | :closed_lock_with_key: 1.35+ | | | 1.0–1.31 | 1.32– | | [code](https://cs.k8s.io/?q=%5CbAllowOverwriteTerminationGracePeriodSeconds%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAllowOverwriteTerminationGracePeriodSeconds%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AllowParsingUserUIDFromCertAuth | :ballot_box_with_check: 1.33+ | | | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbAllowParsingUserUIDFromCertAuth%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAllowParsingUserUIDFromCertAuth%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AllowUnsafeMalformedObjectDeletion | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbAllowUnsafeMalformedObjectDeletion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAllowUnsafeMalformedObjectDeletion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AnonymousAuthConfigurableEndpoints | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.34+ | 1.31 | 1.32–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbAnonymousAuthConfigurableEndpoints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAnonymousAuthConfigurableEndpoints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AnyVolumeDataSource | :ballot_box_with_check: 1.24+ | :closed_lock_with_key: 1.33+ | 1.18–1.23 | 1.24–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbAnyVolumeDataSource%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAnyVolumeDataSource%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AuthorizeNodeWithSelectors | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.34+ | 1.31 | 1.32–1.33 | 1.34– | | AuthorizeWithSelectors | [code](https://cs.k8s.io/?q=%5CbAuthorizeNodeWithSelectors%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAuthorizeNodeWithSelectors%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AuthorizePodWebsocketUpgradeCreatePermission | :ballot_box_with_check: 1.35+ | | | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbAuthorizePodWebsocketUpgradeCreatePermission%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAuthorizePodWebsocketUpgradeCreatePermission%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| AuthorizeWithSelectors | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.34+ | 1.31 | 1.32–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbAuthorizeWithSelectors%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbAuthorizeWithSelectors%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| BtreeWatchCache | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.33+ | | 1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbBtreeWatchCache%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbBtreeWatchCache%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CBORServingAndStorage | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbCBORServingAndStorage%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCBORServingAndStorage%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CPUManagerPolicyAlphaOptions | | | 1.23– | | | | | [code](https://cs.k8s.io/?q=%5CbCPUManagerPolicyAlphaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCPUManagerPolicyAlphaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CPUManagerPolicyBetaOptions | :ballot_box_with_check: 1.23+ | | | 1.23– | | | | [code](https://cs.k8s.io/?q=%5CbCPUManagerPolicyBetaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCPUManagerPolicyBetaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CPUManagerPolicyOptions | :ballot_box_with_check: 1.23+ | :closed_lock_with_key: 1.33+ | 1.22 | 1.23–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbCPUManagerPolicyOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCPUManagerPolicyOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CRDObservedGenerationTracking | | | | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbCRDObservedGenerationTracking%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCRDObservedGenerationTracking%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CRDValidationRatcheting | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.33+ | 1.28–1.29 | 1.30–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbCRDValidationRatcheting%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCRDValidationRatcheting%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CSIMigrationPortworx | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.23–1.24 | 1.25–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbCSIMigrationPortworx%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCSIMigrationPortworx%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CSIServiceAccountTokenSecrets | :ballot_box_with_check: 1.35+ | | | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbCSIServiceAccountTokenSecrets%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCSIServiceAccountTokenSecrets%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CSIVolumeHealth | | | 1.21– | | | | | [code](https://cs.k8s.io/?q=%5CbCSIVolumeHealth%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCSIVolumeHealth%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ChangeContainerStatusOnKubeletRestart | :ballot_box_with_check: 1.0+ | | | | 1.0–1.34 | 1.35– | | [code](https://cs.k8s.io/?q=%5CbChangeContainerStatusOnKubeletRestart%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbChangeContainerStatusOnKubeletRestart%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ClearingNominatedNodeNameAfterBinding | :ballot_box_with_check: 1.35+ | | 1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbClearingNominatedNodeNameAfterBinding%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbClearingNominatedNodeNameAfterBinding%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ClientsAllowCBOR | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbClientsAllowCBOR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbClientsAllowCBOR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ClientsPreferCBOR | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbClientsPreferCBOR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbClientsPreferCBOR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CloudControllerManagerWatchBasedRoutesReconciliation | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbCloudControllerManagerWatchBasedRoutesReconciliation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCloudControllerManagerWatchBasedRoutesReconciliation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CloudControllerManagerWebhook | | | 1.27– | | | | | [code](https://cs.k8s.io/?q=%5CbCloudControllerManagerWebhook%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCloudControllerManagerWebhook%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ClusterTrustBundle | | | 1.27–1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbClusterTrustBundle%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbClusterTrustBundle%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ClusterTrustBundleProjection | | | 1.29–1.32 | 1.33– | | | ClusterTrustBundle | [code](https://cs.k8s.io/?q=%5CbClusterTrustBundleProjection%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbClusterTrustBundleProjection%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ComponentFlagz | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbComponentFlagz%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbComponentFlagz%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ComponentStatusz | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbComponentStatusz%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbComponentStatusz%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ConcurrentWatchObjectDecode | | | | 1.31– | | | | [code](https://cs.k8s.io/?q=%5CbConcurrentWatchObjectDecode%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbConcurrentWatchObjectDecode%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ConsistentListFromCache | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.34+ | 1.28–1.30 | 1.31–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbConsistentListFromCache%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbConsistentListFromCache%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ConstrainedImpersonation | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbConstrainedImpersonation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbConstrainedImpersonation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ContainerCheckpoint | :ballot_box_with_check: 1.30+ | | 1.25–1.29 | 1.30– | | | | [code](https://cs.k8s.io/?q=%5CbContainerCheckpoint%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbContainerCheckpoint%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ContainerRestartRules | :ballot_box_with_check: 1.35+ | | 1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbContainerRestartRules%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbContainerRestartRules%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ContainerStopSignals | | | 1.33– | | | | | [code](https://cs.k8s.io/?q=%5CbContainerStopSignals%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbContainerStopSignals%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CoordinatedLeaderElection | | | 1.31–1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbCoordinatedLeaderElection%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCoordinatedLeaderElection%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CrossNamespaceVolumeDataSource | | | 1.26– | | | | | [code](https://cs.k8s.io/?q=%5CbCrossNamespaceVolumeDataSource%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCrossNamespaceVolumeDataSource%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CustomCPUCFSQuotaPeriod | | | 1.12– | | | | | [code](https://cs.k8s.io/?q=%5CbCustomCPUCFSQuotaPeriod%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCustomCPUCFSQuotaPeriod%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| CustomResourceFieldSelectors | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.32+ | 1.30 | 1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbCustomResourceFieldSelectors%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbCustomResourceFieldSelectors%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRAAdminAccess | :ballot_box_with_check: 1.34+ | | 1.32–1.33 | 1.34– | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRAAdminAccess%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRAAdminAccess%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRAConsumableCapacity | | | 1.34– | | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRAConsumableCapacity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRAConsumableCapacity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRADeviceBindingConditions | | | 1.34– | | | | DRAResourceClaimDeviceStatus
DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRADeviceBindingConditions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRADeviceBindingConditions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRADeviceTaintRules | | | 1.35– | | | | DRADeviceTaints | [code](https://cs.k8s.io/?q=%5CbDRADeviceTaintRules%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRADeviceTaintRules%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRADeviceTaints | | | 1.33– | | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRADeviceTaints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRADeviceTaints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRAExtendedResource | | | 1.34– | | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRAExtendedResource%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRAExtendedResource%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRAPartitionableDevices | | | 1.33– | | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRAPartitionableDevices%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRAPartitionableDevices%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRAPrioritizedList | :ballot_box_with_check: 1.34+ | | 1.33 | 1.34– | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRAPrioritizedList%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRAPrioritizedList%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRAResourceClaimDeviceStatus | :ballot_box_with_check: 1.33+ | | 1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbDRAResourceClaimDeviceStatus%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRAResourceClaimDeviceStatus%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DRASchedulerFilterTimeout | :ballot_box_with_check: 1.34+ | | | 1.34– | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbDRASchedulerFilterTimeout%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDRASchedulerFilterTimeout%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DeclarativeValidation | :ballot_box_with_check: 1.33+ | | | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbDeclarativeValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDeclarativeValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DeclarativeValidationTakeover | | | | 1.33– | | | DeclarativeValidation | [code](https://cs.k8s.io/?q=%5CbDeclarativeValidationTakeover%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDeclarativeValidationTakeover%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DeploymentReplicaSetTerminatingReplicas | :ballot_box_with_check: 1.35+ | | 1.33–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbDeploymentReplicaSetTerminatingReplicas%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDeploymentReplicaSetTerminatingReplicas%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DetectCacheInconsistency | :ballot_box_with_check: 1.34+ | | | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbDetectCacheInconsistency%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDetectCacheInconsistency%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DisableAllocatorDualWrite | :ballot_box_with_check: 1.34+ | :closed_lock_with_key: 1.35+ | 1.31–1.32 | 1.33 | 1.34– | | MultiCIDRServiceAllocator | [code](https://cs.k8s.io/?q=%5CbDisableAllocatorDualWrite%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDisableAllocatorDualWrite%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DisableCPUQuotaWithExclusiveCPUs | :ballot_box_with_check: 1.33+ | | | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbDisableCPUQuotaWithExclusiveCPUs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDisableCPUQuotaWithExclusiveCPUs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DisableNodeKubeProxyVersion | :ballot_box_with_check: 1.33+ | | 1.29–1.30 | | | 1.31– | | [code](https://cs.k8s.io/?q=%5CbDisableNodeKubeProxyVersion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDisableNodeKubeProxyVersion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| DynamicResourceAllocation | :ballot_box_with_check: 1.34+ | :closed_lock_with_key: 1.35+ | 1.26–1.31 | 1.32–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbDynamicResourceAllocation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbDynamicResourceAllocation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| EnvFiles | :ballot_box_with_check: 1.35+ | | 1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbEnvFiles%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbEnvFiles%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| EventedPLEG | | | 1.26– | | | | | [code](https://cs.k8s.io/?q=%5CbEventedPLEG%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbEventedPLEG%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ExecProbeTimeout | :ballot_box_with_check: 1.20+ | :closed_lock_with_key: 1.35+ | | | 1.20– | | | [code](https://cs.k8s.io/?q=%5CbExecProbeTimeout%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbExecProbeTimeout%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ExternalServiceAccountTokenSigner | :ballot_box_with_check: 1.34+ | | 1.32–1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbExternalServiceAccountTokenSigner%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbExternalServiceAccountTokenSigner%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| GangScheduling | | | 1.35– | | | | GenericWorkload | [code](https://cs.k8s.io/?q=%5CbGangScheduling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbGangScheduling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| GenericWorkload | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbGenericWorkload%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbGenericWorkload%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| GitRepoVolumeDriver | :ballot_box_with_check: 1.0+ | | | | 1.0–1.32 | 1.33– | | [code](https://cs.k8s.io/?q=%5CbGitRepoVolumeDriver%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbGitRepoVolumeDriver%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| GracefulNodeShutdown | :ballot_box_with_check: 1.21+ | | 1.20 | 1.21– | | | | [code](https://cs.k8s.io/?q=%5CbGracefulNodeShutdown%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbGracefulNodeShutdown%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| GracefulNodeShutdownBasedOnPodPriority | :ballot_box_with_check: 1.24+ | | 1.23 | 1.24– | | | GracefulNodeShutdown | [code](https://cs.k8s.io/?q=%5CbGracefulNodeShutdownBasedOnPodPriority%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbGracefulNodeShutdownBasedOnPodPriority%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| HPAConfigurableTolerance | :ballot_box_with_check: 1.35+ | | 1.33–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbHPAConfigurableTolerance%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHPAConfigurableTolerance%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| HPAScaleToZero | | | 1.16– | | | | | [code](https://cs.k8s.io/?q=%5CbHPAScaleToZero%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHPAScaleToZero%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| HonorPVReclaimPolicy | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.23–1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbHonorPVReclaimPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHonorPVReclaimPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| HostnameOverride | :ballot_box_with_check: 1.35+ | | 1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbHostnameOverride%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHostnameOverride%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ImageMaximumGCAge | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.35+ | 1.29 | 1.30–1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbImageMaximumGCAge%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbImageMaximumGCAge%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ImageVolume | :ballot_box_with_check: 1.35+ | | 1.31–1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbImageVolume%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbImageVolume%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ImageVolumeWithDigest | | | 1.35– | | | | ImageVolume | [code](https://cs.k8s.io/?q=%5CbImageVolumeWithDigest%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbImageVolumeWithDigest%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InOrderInformers | :ballot_box_with_check: 1.33+ | | | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbInOrderInformers%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInOrderInformers%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InOrderInformersBatchProcess | :ballot_box_with_check: 1.35+ | | | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbInOrderInformersBatchProcess%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInOrderInformersBatchProcess%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InPlacePodLevelResourcesVerticalScaling | | | 1.35– | | | | InPlacePodVerticalScaling
NodeDeclaredFeatures
PodLevelResources | [code](https://cs.k8s.io/?q=%5CbInPlacePodLevelResourcesVerticalScaling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInPlacePodLevelResourcesVerticalScaling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InPlacePodVerticalScaling | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.35+ | 1.27–1.32 | 1.33–1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScaling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScaling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InPlacePodVerticalScalingAllocatedStatus | | | 1.32 | | | 1.33– | InPlacePodVerticalScaling | [code](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScalingAllocatedStatus%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScalingAllocatedStatus%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InPlacePodVerticalScalingExclusiveCPUs | | | 1.32– | | | | InPlacePodVerticalScaling | [code](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScalingExclusiveCPUs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScalingExclusiveCPUs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InPlacePodVerticalScalingExclusiveMemory | | | 1.34– | | | | InPlacePodVerticalScaling
MemoryManager | [code](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScalingExclusiveMemory%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInPlacePodVerticalScalingExclusiveMemory%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InTreePluginPortworxUnregister | | | 1.23– | | | | | [code](https://cs.k8s.io/?q=%5CbInTreePluginPortworxUnregister%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInTreePluginPortworxUnregister%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| InformerResourceVersion | :ballot_box_with_check: 1.35+ | | 1.30–1.34 | | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbInformerResourceVersion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbInformerResourceVersion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| JobBackoffLimitPerIndex | :ballot_box_with_check: 1.29+ | :closed_lock_with_key: 1.33+ | 1.28 | 1.29–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbJobBackoffLimitPerIndex%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbJobBackoffLimitPerIndex%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| JobManagedBy | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.35+ | 1.30–1.31 | 1.32–1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbJobManagedBy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbJobManagedBy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| JobPodReplacementPolicy | :ballot_box_with_check: 1.29+ | :closed_lock_with_key: 1.34+ | 1.28 | 1.29–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbJobPodReplacementPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbJobPodReplacementPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| JobSuccessPolicy | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbJobSuccessPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbJobSuccessPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KMSv1 | :ballot_box_with_check: 1.0+ | | | | 1.0–1.27 | 1.28– | | [code](https://cs.k8s.io/?q=%5CbKMSv1%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKMSv1%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletCgroupDriverFromCRI | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.34+ | 1.28–1.30 | 1.31–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbKubeletCgroupDriverFromCRI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletCgroupDriverFromCRI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletCrashLoopBackOffMax | :ballot_box_with_check: 1.35+ | | 1.32–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletCrashLoopBackOffMax%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletCrashLoopBackOffMax%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletEnsureSecretPulledImages | :ballot_box_with_check: 1.35+ | | 1.33–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletEnsureSecretPulledImages%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletEnsureSecretPulledImages%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletFineGrainedAuthz | :ballot_box_with_check: 1.33+ | | 1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletFineGrainedAuthz%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletFineGrainedAuthz%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletInUserNamespace | | | 1.22– | | | | | [code](https://cs.k8s.io/?q=%5CbKubeletInUserNamespace%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletInUserNamespace%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletPSI | :ballot_box_with_check: 1.34+ | | 1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletPSI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletPSI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletPodResourcesDynamicResources | :ballot_box_with_check: 1.34+ | | 1.27–1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletPodResourcesDynamicResources%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletPodResourcesDynamicResources%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletPodResourcesGet | :ballot_box_with_check: 1.34+ | | 1.27–1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletPodResourcesGet%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletPodResourcesGet%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletPodResourcesListUseActivePods | :ballot_box_with_check: 1.34+ | | | | 1.0–1.33 | 1.34– | | [code](https://cs.k8s.io/?q=%5CbKubeletPodResourcesListUseActivePods%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletPodResourcesListUseActivePods%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletRegistrationGetOnExistsOnly | :ballot_box_with_check: 1.0+ | | | | 1.0–1.31 | 1.32– | | [code](https://cs.k8s.io/?q=%5CbKubeletRegistrationGetOnExistsOnly%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletRegistrationGetOnExistsOnly%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletSeparateDiskGC | :ballot_box_with_check: 1.31+ | | 1.29–1.30 | 1.31– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletSeparateDiskGC%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletSeparateDiskGC%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletServiceAccountTokenForCredentialProviders | :ballot_box_with_check: 1.34+ | | 1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbKubeletServiceAccountTokenForCredentialProviders%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletServiceAccountTokenForCredentialProviders%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| KubeletTracing | :ballot_box_with_check: 1.27+ | :closed_lock_with_key: 1.34+ | 1.25–1.26 | 1.27–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbKubeletTracing%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbKubeletTracing%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ListFromCacheSnapshot | :ballot_box_with_check: 1.34+ | | 1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbListFromCacheSnapshot%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbListFromCacheSnapshot%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| LocalStorageCapacityIsolationFSQuotaMonitoring | | | 1.15–1.30 | 1.31– | | | | [code](https://cs.k8s.io/?q=%5CbLocalStorageCapacityIsolationFSQuotaMonitoring%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbLocalStorageCapacityIsolationFSQuotaMonitoring%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| LogarithmicScaleDown | :ballot_box_with_check: 1.22+ | :closed_lock_with_key: 1.31+ | 1.21 | 1.22–1.30 | 1.31– | | | [code](https://cs.k8s.io/?q=%5CbLogarithmicScaleDown%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbLogarithmicScaleDown%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MatchLabelKeysInPodAffinity | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.29–1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbMatchLabelKeysInPodAffinity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMatchLabelKeysInPodAffinity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MatchLabelKeysInPodTopologySpread | :ballot_box_with_check: 1.27+ | | 1.25–1.26 | 1.27– | | | | [code](https://cs.k8s.io/?q=%5CbMatchLabelKeysInPodTopologySpread%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMatchLabelKeysInPodTopologySpread%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MatchLabelKeysInPodTopologySpreadSelectorMerge | :ballot_box_with_check: 1.34+ | | | 1.34– | | | MatchLabelKeysInPodTopologySpread | [code](https://cs.k8s.io/?q=%5CbMatchLabelKeysInPodTopologySpreadSelectorMerge%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMatchLabelKeysInPodTopologySpreadSelectorMerge%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MaxUnavailableStatefulSet | :ballot_box_with_check: 1.35+ | | 1.24–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbMaxUnavailableStatefulSet%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMaxUnavailableStatefulSet%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MemoryManager | :ballot_box_with_check: 1.22+ | :closed_lock_with_key: 1.32+ | 1.21 | 1.22–1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbMemoryManager%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMemoryManager%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MemoryQoS | | | 1.22– | | | | | [code](https://cs.k8s.io/?q=%5CbMemoryQoS%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMemoryQoS%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MultiCIDRServiceAllocator | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.34+ | 1.27–1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbMultiCIDRServiceAllocator%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMultiCIDRServiceAllocator%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MutableCSINodeAllocatableCount | :ballot_box_with_check: 1.35+ | | 1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbMutableCSINodeAllocatableCount%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMutableCSINodeAllocatableCount%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MutablePVNodeAffinity | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbMutablePVNodeAffinity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMutablePVNodeAffinity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MutablePodResourcesForSuspendedJobs | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbMutablePodResourcesForSuspendedJobs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMutablePodResourcesForSuspendedJobs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MutableSchedulingDirectivesForSuspendedJobs | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbMutableSchedulingDirectivesForSuspendedJobs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMutableSchedulingDirectivesForSuspendedJobs%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| MutatingAdmissionPolicy | | | 1.32–1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbMutatingAdmissionPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbMutatingAdmissionPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| NFTablesProxyMode | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.29–1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbNFTablesProxyMode%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbNFTablesProxyMode%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| NodeDeclaredFeatures | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbNodeDeclaredFeatures%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbNodeDeclaredFeatures%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| NodeInclusionPolicyInPodTopologySpread | :ballot_box_with_check: 1.26+ | :closed_lock_with_key: 1.33+ | 1.25 | 1.26–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbNodeInclusionPolicyInPodTopologySpread%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbNodeInclusionPolicyInPodTopologySpread%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| NodeLogQuery | | | 1.27–1.29 | 1.30– | | | | [code](https://cs.k8s.io/?q=%5CbNodeLogQuery%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbNodeLogQuery%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| NodeSwap | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.34+ | 1.22–1.27 | 1.28–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbNodeSwap%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbNodeSwap%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| NominatedNodeNameForExpectation | :ballot_box_with_check: 1.35+ | | 1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbNominatedNodeNameForExpectation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbNominatedNodeNameForExpectation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| OpenAPIEnums | :ballot_box_with_check: 1.24+ | | 1.23 | 1.24– | | | | [code](https://cs.k8s.io/?q=%5CbOpenAPIEnums%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbOpenAPIEnums%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| OpportunisticBatching | :ballot_box_with_check: 1.35+ | | | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbOpportunisticBatching%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbOpportunisticBatching%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| OrderedNamespaceDeletion | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.34+ | | 1.30–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbOrderedNamespaceDeletion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbOrderedNamespaceDeletion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodAndContainerStatsFromCRI | | | 1.23– | | | | | [code](https://cs.k8s.io/?q=%5CbPodAndContainerStatsFromCRI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodAndContainerStatsFromCRI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodCertificateRequest | | | 1.34 | 1.35– | | | AuthorizeNodeWithSelectors | [code](https://cs.k8s.io/?q=%5CbPodCertificateRequest%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodCertificateRequest%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodDeletionCost | :ballot_box_with_check: 1.22+ | | 1.21 | 1.22– | | | | [code](https://cs.k8s.io/?q=%5CbPodDeletionCost%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodDeletionCost%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodLevelResources | :ballot_box_with_check: 1.34+ | | 1.32–1.33 | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbPodLevelResources%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodLevelResources%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodLifecycleSleepAction | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.34+ | 1.29 | 1.30–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbPodLifecycleSleepAction%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodLifecycleSleepAction%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodLifecycleSleepActionAllowZero | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.34+ | 1.32 | 1.33 | 1.34– | | PodLifecycleSleepAction | [code](https://cs.k8s.io/?q=%5CbPodLifecycleSleepActionAllowZero%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodLifecycleSleepActionAllowZero%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodLogsQuerySplitStreams | | | 1.32– | | | | | [code](https://cs.k8s.io/?q=%5CbPodLogsQuerySplitStreams%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodLogsQuerySplitStreams%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodObservedGenerationTracking | :ballot_box_with_check: 1.34+ | :closed_lock_with_key: 1.35+ | 1.33 | 1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbPodObservedGenerationTracking%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodObservedGenerationTracking%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodReadyToStartContainersCondition | :ballot_box_with_check: 1.29+ | | 1.28 | 1.29– | | | | [code](https://cs.k8s.io/?q=%5CbPodReadyToStartContainersCondition%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodReadyToStartContainersCondition%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodSchedulingReadiness | :ballot_box_with_check: 1.27+ | :closed_lock_with_key: 1.30+ | 1.26 | 1.27–1.29 | 1.30– | | | [code](https://cs.k8s.io/?q=%5CbPodSchedulingReadiness%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodSchedulingReadiness%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PodTopologyLabelsAdmission | :ballot_box_with_check: 1.35+ | | 1.33–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbPodTopologyLabelsAdmission%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPodTopologyLabelsAdmission%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PortForwardWebsockets | :ballot_box_with_check: 1.31+ | | 1.30 | 1.31– | | | | [code](https://cs.k8s.io/?q=%5CbPortForwardWebsockets%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPortForwardWebsockets%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PreferSameTrafficDistribution | :ballot_box_with_check: 1.34+ | :closed_lock_with_key: 1.35+ | 1.33 | 1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbPreferSameTrafficDistribution%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPreferSameTrafficDistribution%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| PreventStaticPodAPIReferences | :ballot_box_with_check: 1.34+ | | | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbPreventStaticPodAPIReferences%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbPreventStaticPodAPIReferences%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ProcMountType | :ballot_box_with_check: 1.33+ | | 1.12–1.30 | 1.31– | | | UserNamespacesSupport | [code](https://cs.k8s.io/?q=%5CbProcMountType%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbProcMountType%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| QOSReserved | | | 1.11– | | | | | [code](https://cs.k8s.io/?q=%5CbQOSReserved%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbQOSReserved%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RecoverVolumeExpansionFailure | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.34+ | 1.23–1.31 | 1.32–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbRecoverVolumeExpansionFailure%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRecoverVolumeExpansionFailure%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RecursiveReadOnlyMounts | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbRecursiveReadOnlyMounts%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRecursiveReadOnlyMounts%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ReduceDefaultCrashLoopBackOffDecay | | | 1.33– | | | | | [code](https://cs.k8s.io/?q=%5CbReduceDefaultCrashLoopBackOffDecay%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbReduceDefaultCrashLoopBackOffDecay%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RelaxedDNSSearchValidation | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.34+ | 1.32 | 1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbRelaxedDNSSearchValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRelaxedDNSSearchValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RelaxedEnvironmentVariableValidation | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.34+ | 1.30–1.31 | 1.32–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbRelaxedEnvironmentVariableValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRelaxedEnvironmentVariableValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RelaxedServiceNameValidation | | | 1.34– | | | | | [code](https://cs.k8s.io/?q=%5CbRelaxedServiceNameValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRelaxedServiceNameValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ReloadKubeletServerCertificateFile | :ballot_box_with_check: 1.31+ | | | 1.31– | | | | [code](https://cs.k8s.io/?q=%5CbReloadKubeletServerCertificateFile%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbReloadKubeletServerCertificateFile%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RemoteRequestHeaderUID | :ballot_box_with_check: 1.33+ | | 1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbRemoteRequestHeaderUID%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRemoteRequestHeaderUID%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ResilientWatchCacheInitialization | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.34+ | | 1.31–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbResilientWatchCacheInitialization%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbResilientWatchCacheInitialization%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ResourceHealthStatus | | | 1.31– | | | | DynamicResourceAllocation | [code](https://cs.k8s.io/?q=%5CbResourceHealthStatus%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbResourceHealthStatus%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RestartAllContainersOnContainerExits | | | 1.35– | | | | ContainerRestartRules
NodeDeclaredFeatures | [code](https://cs.k8s.io/?q=%5CbRestartAllContainersOnContainerExits%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRestartAllContainersOnContainerExits%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RetryGenerateName | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.32+ | 1.30 | 1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbRetryGenerateName%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRetryGenerateName%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RotateKubeletServerCertificate | :ballot_box_with_check: 1.12+ | | 1.7–1.11 | 1.12– | | | | [code](https://cs.k8s.io/?q=%5CbRotateKubeletServerCertificate%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRotateKubeletServerCertificate%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| RuntimeClassInImageCriApi | | | 1.29– | | | | | [code](https://cs.k8s.io/?q=%5CbRuntimeClassInImageCriApi%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbRuntimeClassInImageCriApi%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SELinuxChangePolicy | :ballot_box_with_check: 1.33+ | | 1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbSELinuxChangePolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSELinuxChangePolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SELinuxMount | | | 1.30–1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbSELinuxMount%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSELinuxMount%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SELinuxMountReadWriteOncePod | :ballot_box_with_check: 1.28+ | | 1.25–1.26 | 1.27– | | | | [code](https://cs.k8s.io/?q=%5CbSELinuxMountReadWriteOncePod%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSELinuxMountReadWriteOncePod%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SchedulerAsyncAPICalls | :ballot_box_with_check: 1.35+ | | | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbSchedulerAsyncAPICalls%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSchedulerAsyncAPICalls%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SchedulerAsyncPreemption | :ballot_box_with_check: 1.33+ | | 1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbSchedulerAsyncPreemption%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSchedulerAsyncPreemption%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SchedulerPopFromBackoffQ | :ballot_box_with_check: 1.33+ | | | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbSchedulerPopFromBackoffQ%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSchedulerPopFromBackoffQ%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SchedulerQueueingHints | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.34+ | | 1.28–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbSchedulerQueueingHints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSchedulerQueueingHints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SeparateCacheWatchRPC | :ballot_box_with_check: 1.28+ | | | 1.28–1.32 | | 1.33– | | [code](https://cs.k8s.io/?q=%5CbSeparateCacheWatchRPC%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSeparateCacheWatchRPC%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SeparateTaintEvictionController | :ballot_box_with_check: 1.29+ | :closed_lock_with_key: 1.34+ | | 1.29–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbSeparateTaintEvictionController%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSeparateTaintEvictionController%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ServiceAccountNodeAudienceRestriction | :ballot_box_with_check: 1.33+ | | | 1.32– | | | | [code](https://cs.k8s.io/?q=%5CbServiceAccountNodeAudienceRestriction%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceAccountNodeAudienceRestriction%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ServiceAccountTokenJTI | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.32+ | 1.29 | 1.30–1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbServiceAccountTokenJTI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceAccountTokenJTI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ServiceAccountTokenNodeBinding | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.29–1.30 | 1.31–1.32 | 1.33– | | ServiceAccountTokenNodeBindingValidation | [code](https://cs.k8s.io/?q=%5CbServiceAccountTokenNodeBinding%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceAccountTokenNodeBinding%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ServiceAccountTokenNodeBindingValidation | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.32+ | 1.29 | 1.30–1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbServiceAccountTokenNodeBindingValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceAccountTokenNodeBindingValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ServiceAccountTokenPodNodeInfo | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.32+ | 1.29 | 1.30–1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbServiceAccountTokenPodNodeInfo%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceAccountTokenPodNodeInfo%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| ServiceTrafficDistribution | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbServiceTrafficDistribution%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbServiceTrafficDistribution%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SidecarContainers | :ballot_box_with_check: 1.29+ | :closed_lock_with_key: 1.33+ | 1.28 | 1.29–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbSidecarContainers%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSidecarContainers%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SizeBasedListCostEstimate | :ballot_box_with_check: 1.34+ | | | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbSizeBasedListCostEstimate%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSizeBasedListCostEstimate%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StatefulSetSemanticRevisionComparison | :ballot_box_with_check: 1.0+ | | | 1.0– | | | | [code](https://cs.k8s.io/?q=%5CbStatefulSetSemanticRevisionComparison%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStatefulSetSemanticRevisionComparison%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StorageCapacityScoring | | | 1.33– | | | | | [code](https://cs.k8s.io/?q=%5CbStorageCapacityScoring%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStorageCapacityScoring%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StorageNamespaceIndex | :ballot_box_with_check: 1.30+ | | | 1.30–1.32 | | 1.33– | | [code](https://cs.k8s.io/?q=%5CbStorageNamespaceIndex%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStorageNamespaceIndex%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StorageVersionAPI | | | 1.20– | | | | APIServerIdentity | [code](https://cs.k8s.io/?q=%5CbStorageVersionAPI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStorageVersionAPI%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StorageVersionHash | :ballot_box_with_check: 1.15+ | | 1.14 | 1.15– | | | | [code](https://cs.k8s.io/?q=%5CbStorageVersionHash%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStorageVersionHash%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StorageVersionMigrator | | | 1.30–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbStorageVersionMigrator%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStorageVersionMigrator%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StreamingCollectionEncodingToJSON | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.34+ | | 1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbStreamingCollectionEncodingToJSON%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStreamingCollectionEncodingToJSON%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StreamingCollectionEncodingToProtobuf | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.34+ | | 1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbStreamingCollectionEncodingToProtobuf%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStreamingCollectionEncodingToProtobuf%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StrictIPCIDRValidation | | | 1.33– | | | | | [code](https://cs.k8s.io/?q=%5CbStrictIPCIDRValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStrictIPCIDRValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StructuredAuthenticationConfiguration | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.34+ | 1.29 | 1.30–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbStructuredAuthenticationConfiguration%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStructuredAuthenticationConfiguration%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StructuredAuthenticationConfigurationEgressSelector | :ballot_box_with_check: 1.34+ | | | 1.34– | | | StructuredAuthenticationConfiguration | [code](https://cs.k8s.io/?q=%5CbStructuredAuthenticationConfigurationEgressSelector%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStructuredAuthenticationConfigurationEgressSelector%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StructuredAuthenticationConfigurationJWKSMetrics | :ballot_box_with_check: 1.35+ | | | 1.35– | | | StructuredAuthenticationConfiguration | [code](https://cs.k8s.io/?q=%5CbStructuredAuthenticationConfigurationJWKSMetrics%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStructuredAuthenticationConfigurationJWKSMetrics%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| StructuredAuthorizationConfiguration | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.32+ | 1.29 | 1.30–1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbStructuredAuthorizationConfiguration%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbStructuredAuthorizationConfiguration%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SupplementalGroupsPolicy | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.35+ | 1.31–1.32 | 1.33–1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbSupplementalGroupsPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSupplementalGroupsPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| SystemdWatchdog | :ballot_box_with_check: 1.32+ | :closed_lock_with_key: 1.35+ | | 1.32–1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbSystemdWatchdog%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbSystemdWatchdog%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| TaintTolerationComparisonOperators | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbTaintTolerationComparisonOperators%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbTaintTolerationComparisonOperators%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| TokenRequestServiceAccountUIDValidation | :ballot_box_with_check: 1.34+ | | | 1.34– | | | | [code](https://cs.k8s.io/?q=%5CbTokenRequestServiceAccountUIDValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbTokenRequestServiceAccountUIDValidation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| TopologyAwareHints | :ballot_box_with_check: 1.24+ | :closed_lock_with_key: 1.33+ | 1.21–1.22 | 1.23–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbTopologyAwareHints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbTopologyAwareHints%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| TopologyManagerPolicyAlphaOptions | | | 1.26– | | | | | [code](https://cs.k8s.io/?q=%5CbTopologyManagerPolicyAlphaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbTopologyManagerPolicyAlphaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| TopologyManagerPolicyBetaOptions | :ballot_box_with_check: 1.28+ | | | 1.26– | | | | [code](https://cs.k8s.io/?q=%5CbTopologyManagerPolicyBetaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbTopologyManagerPolicyBetaOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| TopologyManagerPolicyOptions | :ballot_box_with_check: 1.28+ | | 1.26–1.27 | 1.28–1.31 | 1.32– | | | [code](https://cs.k8s.io/?q=%5CbTopologyManagerPolicyOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbTopologyManagerPolicyOptions%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| TranslateStreamCloseWebsocketRequests | :ballot_box_with_check: 1.30+ | | 1.29 | 1.30– | | | | [code](https://cs.k8s.io/?q=%5CbTranslateStreamCloseWebsocketRequests%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbTranslateStreamCloseWebsocketRequests%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| UnauthenticatedHTTP2DOSMitigation | :ballot_box_with_check: 1.29+ | | | 1.25– | | | | [code](https://cs.k8s.io/?q=%5CbUnauthenticatedHTTP2DOSMitigation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbUnauthenticatedHTTP2DOSMitigation%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| UnknownVersionInteroperabilityProxy | | | 1.28– | | | | APIServerIdentity | [code](https://cs.k8s.io/?q=%5CbUnknownVersionInteroperabilityProxy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbUnknownVersionInteroperabilityProxy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| UserNamespacesHostNetworkSupport | | | 1.35– | | | | UserNamespacesSupport | [code](https://cs.k8s.io/?q=%5CbUserNamespacesHostNetworkSupport%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbUserNamespacesHostNetworkSupport%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| UserNamespacesSupport | :ballot_box_with_check: 1.33+ | | 1.25–1.29 | 1.30– | | | | [code](https://cs.k8s.io/?q=%5CbUserNamespacesSupport%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbUserNamespacesSupport%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| VolumeAttributesClass | :ballot_box_with_check: 1.34+ | :closed_lock_with_key: 1.36+ | 1.29–1.30 | 1.31–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbVolumeAttributesClass%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbVolumeAttributesClass%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| VolumeLimitScaling | | | 1.35– | | | | | [code](https://cs.k8s.io/?q=%5CbVolumeLimitScaling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbVolumeLimitScaling%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WatchCacheInitializationPostStartHook | | | | 1.31– | | | | [code](https://cs.k8s.io/?q=%5CbWatchCacheInitializationPostStartHook%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWatchCacheInitializationPostStartHook%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WatchFromStorageWithoutResourceVersion | | :closed_lock_with_key: 1.33+ | | 1.27–1.32 | | 1.33– | | [code](https://cs.k8s.io/?q=%5CbWatchFromStorageWithoutResourceVersion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWatchFromStorageWithoutResourceVersion%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WatchList | :ballot_box_with_check: 1.32+ | | 1.27–1.31 | 1.32– | | | | [code](https://cs.k8s.io/?q=%5CbWatchList%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWatchList%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WatchListClient | :ballot_box_with_check: 1.35+ | | | 1.30– | | | | [code](https://cs.k8s.io/?q=%5CbWatchListClient%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWatchListClient%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WinDSR | :ballot_box_with_check: 1.33+ | :closed_lock_with_key: 1.34+ | 1.14–1.32 | 1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbWinDSR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWinDSR%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WinOverlay | :ballot_box_with_check: 1.20+ | :closed_lock_with_key: 1.34+ | 1.14–1.19 | 1.20–1.33 | 1.34– | | | [code](https://cs.k8s.io/?q=%5CbWinOverlay%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWinOverlay%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WindowsCPUAndMemoryAffinity | | | 1.32– | | | | MemoryManager | [code](https://cs.k8s.io/?q=%5CbWindowsCPUAndMemoryAffinity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWindowsCPUAndMemoryAffinity%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WindowsGracefulNodeShutdown | :ballot_box_with_check: 1.34+ | | 1.32–1.33 | 1.34– | | | GracefulNodeShutdown | [code](https://cs.k8s.io/?q=%5CbWindowsGracefulNodeShutdown%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWindowsGracefulNodeShutdown%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+| WindowsHostNetwork | | | 1.26–1.32 | | | 1.33– | | [code](https://cs.k8s.io/?q=%5CbWindowsHostNetwork%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbWindowsHostNetwork%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) |
+
+## Legend
+
+| Symbol | Meaning |
+|--------|--------|
+| :ballot_box_with_check: | Enabled by default (in Enabled column: version when first enabled) |
+| :closed_lock_with_key: | Locked to default, cannot be changed (in Locked column: version when first locked) |
+| 1.X– | Feature is in this state from version 1.X (open-ended range) |