本页介绍如何启用或禁用特性门控(feature gates), 以便在你的集群中控制特定的 Kubernetes 特性。 启用特性门控可以让你在特性正式发布(GA)之前,测试并使用 Alpha 或 Beta 特性。
对于某些稳定(GA)的特性门控,你也可以禁用它们,通常只允许在 GA 之后的一个次要版本中这样做; 但如果你这样做,你的集群可能不再符合 Kubernetes 一致性(conformance)要求。
你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:
你还需要:
GA(稳定)特性默认始终启用。 你通常会为 Alpha 或 Beta 特性配置特性门控。
在启用某个特性门控之前,请先查看特性门控参考 中该特性的成熟度级别:
不同的特性门控会影响不同的 Kubernetes 组件:
特性门控参考通常会指出每个特性门控会影响哪些组件。 所有 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 的 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 集群中,请验证所有可能配置特性门控的相关位置, 因为配置分散在多个文件与多个位置中。
如果你可以访问某个组件的调试端点,并且该组件启用了 ComponentFlagz 特性门控,
那么你可以通过访问 /flagz 端点,查看启动该组件时所使用的命令行参数。
通过命令行参数配置的特性门控会在该输出中显示。
/flagz 端点是 Kubernetes z-pages 的一部分,用于为核心组件提供人类可读的运行时调试信息。
更多信息请参见z-pages 文档。
下面是一些与组件相关的特性门控示例:
StructuredAuthenticationConfiguration 主要影响 kube-apiserver。GracefulNodeShutdown 主要影响 kubelet。当某个特性需要多个组件时,你必须在所有相关组件上启用该特性门控。 只在部分组件上启用可能导致意外行为或错误。
务必先在非生产环境中测试特性门控。 Alpha 特性可能会在未提前通知的情况下被移除。