Kubernetes添加feature-gate支持

开启临时容器(ephemeral containers),临时容器是 Kubernetes 中用于调试 Pod 的一种机制,但它需要在集群中启用相关特性才能使用。


env

  • kubernetes-v1.19
  • centos8

feature-gate添加EphemeralContainers=true

1. 确认 Kubernetes 版本

临时容器功能在 Kubernetes 1.16 中引入为 Alpha 特性,在 1.23 中升级为 Beta,默认情况下可能仍未启用。你需要确认当前集群的版本是否支持临时容器。

运行以下命令检查版本:

1
kubectl version

输出会显示客户端和服务器的版本:

Client Version: v1.26.0
Server Version: v1.25.3

如果版本低于 1.16,则不支持临时容器,需升级集群。


2. 检查是否启用了临时容器功能

即使版本支持,临时容器可能被禁用。Kubernetes 的 API Server 需要启用 EphemeralContainers 特性门(Feature Gate)。

  • 如果你是集群管理员,可以检查 API Server 的启动参数。通常在 --feature-gates 参数中查找是否包含 EphemeralContainers=true
  • 查看 API Server 的配置(例如在 /etc/kubernetes/manifests/kube-apiserver.yaml 中):
    1
    2
    3
    4
    5
    6
    7
    8
    spec:
    containers:
    - command:
    - kube-apiserver
    - --feature-gates=EphemeralContainers=true

    # or
    - --feature-gates=TTLAfterFinished=true,EphemeralContainers=true

如果存在- –feature-gates=xxxx,EphemeralContainers=true

如果没有启用,且你有权限,可以修改配置并重启 API Server:

1
kubectl -n kube-system edit pod kube-apiserver-<node-name>

添加或修改 --feature-gates,然后保存并等待 Pod 重启。

开启特性支持临时容器,需要开启支持临时容器的特性:

  • kube-apiserver.yaml
  • kubelet配置

EphemeralContainers=true

/etc/kubernetes/manifests/kube-apiserver.yaml
    --feature-gates=EphemeralContainers=true


/etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--feature-gates=EphemeralContainers=true"

#修改之后重启k8s控制节点和工作节点的kubelet
[root@xianchaomaster1]# systemctl restart kubelet

feature-gate介绍

在 Kubernetes 中,Feature Gates 是用于启用或禁用特定功能的键值对参数。每个 Kubernetes 版本都会引入、更新或移除一些 Feature Gates,这些功能的生命周期通常分为 Alpha、Beta 和 GA(General Availability)三个阶段。以下是对 Kubernetes 每个版本 Feature Gate 支持参数的概述,以及如何找到具体版本的详细信息。

Feature Gates 的基本概念

  • Alpha 阶段:功能默认禁用,可能存在 bug,仅推荐用于测试环境。
  • Beta 阶段:功能默认启用(某些情况下可能仍需手动开启),经过较好测试,API 可能会有变化。
  • GA 阶段:功能稳定,默认启用,无法通过 Feature Gate 禁用。

Feature Gates 通过 --feature-gates 命令行标志在 Kubernetes 组件(如 kube-apiserver、kubelet 等)上配置。例如:

--feature-gates=FeatureName=true

--feature-gates=FeatureName=true,FeatureName1=true

⚠️:组件通常包括 kube-apiserver、kube-controller-manager、kube-scheduler 和 kubelet。看添加特性涉及到那些组件,不涉及不需要修改!!!

如何查看每个版本的 Feature Gate 支持参数

Kubernetes 官方文档提供了每个版本的 Feature Gate 列表,具体位置在:

每个版本的文档会列出:

  1. 新增的 Feature Gates:在该版本引入的功能。
  2. 状态变更:从 Alpha 升级到 Beta,或从 Beta 升级到 GA。
  3. 移除的 Feature Gates:已达到 GA 或被废弃的功能。

部分版本的 Feature Gate 演变

以下是一些常见 Feature Gate 在不同版本中的变化(基于截至 2025 年 3 月 19 日的知识):

Kubernetes 1.13

  • VolumeSnapshotDataSource:Alpha 阶段,支持卷快照数据源。
  • TaintBasedEvictions:Beta 阶段,基于节点污点驱逐 Pod。

Kubernetes 1.18

  • ImmutableEphemeralVolumes:Alpha 阶段,允许将 Secrets 和 ConfigMaps 标记为不可变。
  • HugePages:GA 阶段,支持预分配大页内存。

Kubernetes 1.26

  • SidecarContainers:Alpha 阶段,支持将 Sidecar 容器作为 init 容器运行。
  • APIServerTracing:Beta 阶段,API 服务器跟踪功能。

Kubernetes 1.29

  • SidecarContainers:升级到 Beta 阶段,默认启用。
  • KubeletInUserNamespace:Alpha 阶段,允许 Kubelet 在用户命名空间中运行。

如何查询特定版本的 Feature Gate

  1. 官方文档

    • 访问 Kubernetes 文档对应版本的 Feature Gates 页面。例如,对于 v1.29,可以查找 https://v1-29.docs.kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/
    • 检查表格,列出所有 Feature Gates 的名称、默认状态及引入版本。
  2. 运行时检查(1.26+)

    • 从 Kubernetes 1.26 开始,可以通过 /metrics 端点检查集群中启用的 Feature Gates:
      kubectl get –raw /metrics | grep kubernetes_feature_enabled
    • 输出示例:
      kubernetes_feature_enabled{name=”SidecarContainers”,stage=”BETA”} 1
      其中 1 表示启用,0 表示禁用。
  3. 源码检查

    • 在 Kubernetes GitHub 仓库的 pkg/features/kube_features.go 文件中,可以找到所有 Feature Gates 的定义及其默认状态。

注意事项

  • 云托管服务(如 GKE、AKS、EKS):某些托管服务可能限制 Feature Gate 的修改。例如,GKE 默认启用 Beta 功能,但 Alpha 功能需要创建 Alpha 集群。
  • 向后兼容性:升级 Kubernetes 时,需检查 Feature Gate 是否已被移除或默认行为是否改变。