启用或禁用特性门控

本页介绍如何启用或禁用特性门控(feature gates), 以便在你的集群中控制特定的 Kubernetes 特性。 启用特性门控可以让你在特性正式发布(GA)之前,测试并使用 Alpha 或 Beta 特性。

准备开始

你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:

你还需要:

  • 对集群的管理访问权限
  • 知道你要启用哪个特性门控(参阅特性门控参考

了解特性门控的成熟度

在启用某个特性门控之前,请先查看特性门控参考 中该特性的成熟度级别:

  • Alpha:默认禁用,可能存在缺陷。仅在测试集群中使用。
  • 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
        # ... 其他参数
    

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

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

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

重启 kubelet:

sudo systemctl restart kubelet
  1. 对于 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

验证特性门控配置

完成配置后,请验证特性门控是否已生效。 下列方法适用于控制平面组件以静态 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 "http://localhost: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

理解组件层面的特定要求

下面是一些与组件相关的特性门控示例:

  • 侧重 API 服务器:例如 StructuredAuthenticationConfiguration 主要影响 kube-apiserver。
  • 侧重 kubelet:例如 GracefulNodeShutdown 主要影响 kubelet。
  • 多个组件:有些特性需要组件之间协同。

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

接下来