启用或禁用特性门控

本页展示了如何启用或禁用特性门控以控制集群中特定的 Kubernetes 特性。启用特性门控允许你在 Alpha 或 Beta 特性成为正式可用(GA)之前对其进行测试和使用。

说明

对于某些稳定(GA)的门控,你也可以将其禁用,通常是在 GA 后的一个次要版本内可以这样做;但是,如果你这样做,你的集群可能无法作为 Kubernetes 保持一致性。

开始之前

你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。

你还需要

  • 集群的管理访问权限
  • 了解你想要启用的特性门控(请参阅特性门控参考

说明

GA(稳定)特性默认总是启用的。你通常只需为 Alpha 或 Beta 特性配置门控。

理解特性门控的成熟度

在启用特性门控之前,请检查特性门控参考以了解该特性的成熟度级别

  • Alpha:默认禁用,可能存在 Bug。仅在测试集群中使用。
  • Beta:通常默认启用,经过充分测试。
  • GA:默认总是启用;有时可以在 GA 后禁用一个版本。

确定哪些组件需要该特性门控

不同的特性门控会影响不同的 Kubernetes 组件

  • 某些特性需要在多个组件上启用门控(例如,API 服务器和控制器管理器)
  • 其他特性仅需要在单个组件上启用门控(例如,仅 Kubelet)

特性门控参考通常会指出每个门控影响哪些组件。所有 Kubernetes 组件共享相同的特性门控定义,因此所有门控都会出现在帮助输出中,但只有相关的门控才会影响每个组件的行为。

配置

在集群初始化期间

创建一个配置文件,在相关组件中启用特性门控

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
apiServer:
  extraArgs:
    feature-gates: "FeatureName=true"
controllerManager:
  extraArgs:
    feature-gates: "FeatureName=true"
scheduler:
  extraArgs:
    feature-gates: "FeatureName=true"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
  FeatureName: true

初始化集群

kubeadm init --config kubeadm-config.yaml

在现有集群上

对于 kubeadm 集群,可以在包括清单文件、配置文件和 kubeadm 配置在内的多个位置设置特性门控配置。

编辑 /etc/kubernetes/manifests/ 中的控制平面组件清单

  1. 对于 kube-apiserver、kube-controller-manager 或 kube-scheduler,将标志添加到命令中

    spec:
      containers:
      - command:
        - kube-apiserver
        - --feature-gates=FeatureName=true
        # ... other flags
    

    保存文件。Pod 会自动重启。

  2. 对于 kubelet,编辑 /var/lib/kubelet/config.yaml

    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    featureGates:
      FeatureName: true
    

    重启 kubelet

    sudo systemctl restart kubelet
    
  3. 对于 kube-proxy,编辑 ConfigMap

    kubectl -n kube-system edit configmap kube-proxy
    

    将特性门控添加到配置中

    featureGates:
      FeatureName: true
    

    重启 DaemonSet

    kubectl -n kube-system rollout restart daemonset kube-proxy
    

配置多个特性门控

对于命令行标志,请使用逗号分隔的列表

--feature-gates=FeatureA=true,FeatureB=false,FeatureC=true

对于支持配置文件的组件(kubelet、kube-proxy)

featureGates:
  FeatureA: true
  FeatureB: false
  FeatureC: true

说明

在 kubeadm 集群中,控制平面组件(kube-apiserver、kube-controller-manager 和 kube-scheduler)通常通过位于 /etc/kubernetes/manifests/ 的静态 Pod 清单中的命令行标志进行配置。虽然这些组件支持通过 --config 标志使用配置文件,但 kubeadm 主要使用命令行标志。

验证特性门控配置

配置完成后,验证特性门控是否处于活动状态。以下方法适用于控制平面组件作为静态 Pod 运行的 kubeadm 集群。

检查控制平面组件清单

查看静态 Pod 清单中配置的特性门控

kubectl -n kube-system get pod kube-apiserver-<node-name> -o yaml | grep feature-gates

检查 Kubelet 配置

使用 Kubelet 的 configz 端点

kubectl proxy --port=8001 &
curl -sSL "https://:8001/api/v1/nodes/<node-name>/proxy/configz" | grep featureGates -A 5

或者直接在节点上检查配置文件

cat /var/lib/kubelet/config.yaml | grep -A 10 featureGates

通过指标端点检查

特性门控状态在 Kubernetes 组件的 Prometheus 风格指标中暴露(在 Kubernetes 1.26+ 中可用)。查询指标端点以验证启用了哪些特性门控

kubectl get --raw /metrics | grep kubernetes_feature_enabled

要检查特定的特性门控

kubectl get --raw /metrics | grep kubernetes_feature_enabled | grep FeatureName

指标显示 1 表示启用的门控,0 表示禁用的门控。

说明

在 kubeadm 集群中,验证所有可能配置特性门控的相关位置,因为配置分布在多个文件和位置中。

通过 /flagz 端点检查

如果你有权访问组件的调试端点,并且该组件启用了 ComponentFlagz 特性门控,你可以通过访问 /flagz 端点来检查启动该组件时使用的命令行标志。使用命令行标志配置的特性门控会出现在此输出中。

/flagz 端点是 Kubernetes z-pages 的一部分,它为核心组件提供人类可读的运行时调试信息。

有关详细信息,请参阅 z-pages 文档

了解特定于组件的要求

组件特定特性门控的一些示例

  • 以 API 服务器为中心:像 StructuredAuthenticationConfiguration 这样的特性主要影响 kube-apiserver
  • 以 Kubelet 为中心:像 GracefulNodeShutdown 这样的特性主要影响 kubelet
  • 多组件:有些特性需要在组件之间进行协调

注意

当特性需要多个组件时,你必须在所有相关组件上启用该门控。仅在部分组件上启用它可能会导致意外行为或错误。

请务必先在非生产环境中测试特性门控。Alpha 特性可能会在不另行通知的情况下被移除。

接下来


上次修改时间为 2025 年 12 月 14 日上午 4:38 (PST): 省略整个注释 (4bfe30b374)