add utility for generating markdown for feature gates

Signed-off-by: Davanum Srinivas <davanum@gmail.com>

fix for review comments

Signed-off-by: Davanum Srinivas <davanum@gmail.com>
This commit is contained in:
Davanum Srinivas 2025-11-29 10:55:11 -05:00
parent ed61f3fb62
commit 8703640651
No known key found for this signature in database
GPG key ID: 6DEA177048756885
4 changed files with 845 additions and 3 deletions

View file

@ -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, "<br>")
}
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("<!-- This file is auto-generated by hack/update-featuregates.sh. DO NOT EDIT. -->\n")
sb.WriteString("<!-- To resolve merge conflicts, run: hack/update-featuregates.sh -->\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:&nbsp;" + 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:&nbsp;" + lockedFromVersion + "+"
}
// formatStageRanges formats a list of stage ranges for markdown display
// Each range shows "fromVersiontoVersion" (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)
}

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,229 @@
# Kubernetes Feature Gates
<!-- This file is auto-generated by hack/update-featuregates.sh. DO NOT EDIT. -->
<!-- To resolve merge conflicts, run: hack/update-featuregates.sh -->
| Feature | Enabled | Locked | Alpha | Beta | GA | Deprecated | Dependencies | Links |
|---------|---------|--------|-------|------|----|------------|--------------|-------|
| APIResponseCompression | :ballot_box_with_check:&nbsp;1.16+ | | 1.81.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:&nbsp;1.26+ | | 1.201.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:&nbsp;1.27+ | :closed_lock_with_key:&nbsp;1.34+ | 1.221.26 | 1.271.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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;1.35+ | | | 1.01.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:&nbsp;1.0+ | | | | 1.01.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:&nbsp;1.0+ | | | | 1.01.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:&nbsp;1.0+ | :closed_lock_with_key:&nbsp;1.35+ | | | 1.01.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:&nbsp;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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.34+ | 1.31 | 1.321.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:&nbsp;1.24+ | :closed_lock_with_key:&nbsp;1.33+ | 1.181.23 | 1.241.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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.34+ | 1.31 | 1.321.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:&nbsp;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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.34+ | 1.31 | 1.321.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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;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:&nbsp;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:&nbsp;1.23+ | :closed_lock_with_key:&nbsp;1.33+ | 1.22 | 1.231.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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.33+ | 1.281.29 | 1.301.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.231.24 | 1.251.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:&nbsp;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:&nbsp;1.0+ | | | | 1.01.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:&nbsp;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.271.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.291.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.34+ | 1.281.30 | 1.311.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:&nbsp;1.30+ | | 1.251.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:&nbsp;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.311.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;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:&nbsp;1.34+ | | 1.321.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<br>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:&nbsp;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:&nbsp;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:&nbsp;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:&nbsp;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:&nbsp;1.35+ | | 1.331.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:&nbsp;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:&nbsp;1.34+ | :closed_lock_with_key:&nbsp;1.35+ | 1.311.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:&nbsp;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:&nbsp;1.33+ | | 1.291.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:&nbsp;1.34+ | :closed_lock_with_key:&nbsp;1.35+ | 1.261.31 | 1.321.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:&nbsp;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:&nbsp;1.20+ | :closed_lock_with_key:&nbsp;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:&nbsp;1.34+ | | 1.321.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:&nbsp;1.0+ | | | | 1.01.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:&nbsp;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:&nbsp;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:&nbsp;1.35+ | | 1.331.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.231.30 | 1.311.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:&nbsp;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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.35+ | 1.29 | 1.301.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:&nbsp;1.35+ | | 1.311.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:&nbsp;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:&nbsp;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<br>NodeDeclaredFeatures<br>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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;1.35+ | 1.271.32 | 1.331.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<br>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:&nbsp;1.35+ | | 1.301.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:&nbsp;1.29+ | :closed_lock_with_key:&nbsp;1.33+ | 1.28 | 1.291.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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.35+ | 1.301.31 | 1.321.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:&nbsp;1.29+ | :closed_lock_with_key:&nbsp;1.34+ | 1.28 | 1.291.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.30 | 1.311.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:&nbsp;1.0+ | | | | 1.01.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.34+ | 1.281.30 | 1.311.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:&nbsp;1.35+ | | 1.321.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:&nbsp;1.35+ | | 1.331.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:&nbsp;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:&nbsp;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:&nbsp;1.34+ | | 1.271.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:&nbsp;1.34+ | | 1.271.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:&nbsp;1.34+ | | | | 1.01.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:&nbsp;1.0+ | | | | 1.01.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:&nbsp;1.31+ | | 1.291.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:&nbsp;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:&nbsp;1.27+ | :closed_lock_with_key:&nbsp;1.34+ | 1.251.26 | 1.271.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:&nbsp;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.151.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:&nbsp;1.22+ | :closed_lock_with_key:&nbsp;1.31+ | 1.21 | 1.221.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.291.30 | 1.311.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:&nbsp;1.27+ | | 1.251.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:&nbsp;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:&nbsp;1.35+ | | 1.241.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:&nbsp;1.22+ | :closed_lock_with_key:&nbsp;1.32+ | 1.21 | 1.221.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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;1.34+ | 1.271.30 | 1.311.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:&nbsp;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.321.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.291.30 | 1.311.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:&nbsp;1.26+ | :closed_lock_with_key:&nbsp;1.33+ | 1.25 | 1.261.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.271.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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.34+ | 1.221.27 | 1.281.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:&nbsp;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:&nbsp;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:&nbsp;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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;1.34+ | | 1.301.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:&nbsp;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:&nbsp;1.34+ | | 1.321.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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.34+ | 1.29 | 1.301.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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;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:&nbsp;1.34+ | :closed_lock_with_key:&nbsp;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:&nbsp;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:&nbsp;1.27+ | :closed_lock_with_key:&nbsp;1.30+ | 1.26 | 1.271.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:&nbsp;1.35+ | | 1.331.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:&nbsp;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:&nbsp;1.34+ | :closed_lock_with_key:&nbsp;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:&nbsp;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:&nbsp;1.33+ | | 1.121.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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.34+ | 1.231.31 | 1.321.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.30 | 1.311.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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.34+ | 1.301.31 | 1.321.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:&nbsp;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:&nbsp;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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.34+ | | 1.311.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<br>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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;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:&nbsp;1.12+ | | 1.71.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:&nbsp;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.301.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:&nbsp;1.28+ | | 1.251.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:&nbsp;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:&nbsp;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:&nbsp;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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.34+ | | 1.281.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:&nbsp;1.28+ | | | 1.281.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:&nbsp;1.29+ | :closed_lock_with_key:&nbsp;1.34+ | | 1.291.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:&nbsp;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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.32+ | 1.29 | 1.301.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.291.30 | 1.311.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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.32+ | 1.29 | 1.301.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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.32+ | 1.29 | 1.301.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:&nbsp;1.31+ | :closed_lock_with_key:&nbsp;1.33+ | 1.30 | 1.311.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:&nbsp;1.29+ | :closed_lock_with_key:&nbsp;1.33+ | 1.28 | 1.291.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:&nbsp;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:&nbsp;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:&nbsp;1.30+ | | | 1.301.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:&nbsp;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.301.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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.34+ | 1.29 | 1.301.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:&nbsp;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:&nbsp;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:&nbsp;1.30+ | :closed_lock_with_key:&nbsp;1.32+ | 1.29 | 1.301.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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;1.35+ | 1.311.32 | 1.331.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:&nbsp;1.32+ | :closed_lock_with_key:&nbsp;1.35+ | | 1.321.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:&nbsp;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:&nbsp;1.24+ | :closed_lock_with_key:&nbsp;1.33+ | 1.211.22 | 1.231.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:&nbsp;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:&nbsp;1.28+ | | 1.261.27 | 1.281.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:&nbsp;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:&nbsp;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:&nbsp;1.33+ | | 1.251.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:&nbsp;1.34+ | :closed_lock_with_key:&nbsp;1.36+ | 1.291.30 | 1.311.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:&nbsp;1.33+ | | 1.271.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:&nbsp;1.32+ | | 1.271.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:&nbsp;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:&nbsp;1.33+ | :closed_lock_with_key:&nbsp;1.34+ | 1.141.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:&nbsp;1.20+ | :closed_lock_with_key:&nbsp;1.34+ | 1.141.19 | 1.201.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:&nbsp;1.34+ | | 1.321.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.261.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) |