启用或禁用特性门控
本页介绍如何启用或禁用特性门控(feature gates), 以便在你的集群中控制特定的 Kubernetes 特性。 启用特性门控可以让你在特性正式发布(GA)之前,测试并使用 Alpha 或 Beta 特性。
说明:
对于某些稳定(GA)的特性门控,你也可以禁用它们,通常只允许在 GA 之后的一个次要版本中这样做; 但如果你这样做,你的集群可能不再符合 Kubernetes 一致性(conformance)要求。
准备开始
你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:
你还需要:
- 对集群的管理访问权限
- 知道你要启用哪个特性门控(参阅特性门控参考)
说明:
GA(稳定)特性默认始终启用。 你通常会为 Alpha 或 Beta 特性配置特性门控。
了解特性门控的成熟度
在启用某个特性门控之前,请先查看特性门控参考 中该特性的成熟度级别:
- 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/ 的控制平面组件清单:
-
对于 kube-apiserver、kube-controller-manager 或 kube-scheduler, 将参数添加到命令中:
spec: containers: - command: - kube-apiserver - --feature-gates=FeatureName=true # ... 其他参数
保存文件后,Pod 会自动重启。
-
对于 kubelet,编辑
/var/lib/kubelet/config.yaml:apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration featureGates: FeatureName: true
重启 kubelet:
sudo systemctl restart kubelet
-
对于 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)
通常通过其静态 Pod 清单中的命令行参数来配置,这些清单位于 /etc/kubernetes/manifests/。
虽然这些组件也支持通过 --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 "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。
说明:
在 kubeadm 集群中,请验证所有可能配置特性门控的相关位置, 因为配置分散在多个文件与多个位置中。
理解组件层面的特定要求
下面是一些与组件相关的特性门控示例:
- 侧重 API 服务器:例如
StructuredAuthenticationConfiguration主要影响 kube-apiserver。 - 侧重 kubelet:例如
GracefulNodeShutdown主要影响 kubelet。 - 多个组件:有些特性需要组件之间协同。
注意:
当某个特性需要多个组件时,你必须在所有相关组件上启用该特性门控。 只在部分组件上启用可能导致意外行为或错误。
务必先在非生产环境中测试特性门控。 Alpha 特性可能会在未提前通知的情况下被移除。
接下来
- 阅读特性门控参考
- 了解特性阶段
- 查阅kubeadm 配置