2. Kubernetes 版本兼容性矩阵:kube-apiserver、kubelet、kubectl 之间的版本偏差规则

在 Kubernetes 集群运维中,版本偏差(Version Skew)是影响集群稳定性和升级安全的核心因素。官方在 Kubernetes 版本与版本偏差策略 中明确规定了控制平面组件(kube-apiserver)、工作节点代理(kubelet)以及客户端工具(kubectl)之间的版本兼容关系。理解并遵守这些规则,是设计节点池回退方案的前提。

2.1 核心偏差原则

Kubernetes 采用 X.Y.Z 版本号格式(主版本.次版本.补丁版本)。版本偏差策略主要针对 次版本号(Y) 的差异,补丁版本(Z)通常向前兼容。以下三条原则构成了兼容性矩阵的基石:

  • kube-apiserver 是版本权威:所有组件的版本偏差都以 kube-apiserver 为基准。kube-apiserver 的版本决定了集群支持的 API 版本和功能集。
  • kubelet 版本不得高于 kube-apiserver:kubelet 的次版本号可以比 kube-apiserver 低最多 2 个次版本,但绝不能高于 kube-apiserver 的版本。
  • kubectl 版本偏差最宽松:kubectl 的次版本号可以比 kube-apiserver 高 1 个次版本,或 低 1 个次版本。
运维要点:在升级节点池时,如果 kubelet 版本落后 kube-apiserver 超过 2 个次版本,kubelet 将无法注册到集群,节点状态会持续显示为 NotReady。这是节点池回退演练中需要重点验证的边界条件。

2.2 版本兼容性矩阵表

下表以 kube-apiserver 版本为基准(假设为 1.28),列出了 kubelet 和 kubectl 允许的版本范围:

组件 允许的次版本范围(以 apiserver 1.28 为例) 偏差方向 最大偏差量
kube-apiserver 1.28(基准) — —
kubelet 1.26, 1.27, 1.28 只能低于或等于 apiserver 低 2 个次版本
kubectl 1.27, 1.28, 1.29 可高 1 或低 1 ±1 个次版本
kube-controller-manager / kube-scheduler 1.28(必须与 apiserver 一致) 必须等于 apiserver 0
kube-proxy 1.26, 1.27, 1.28 与 kubelet 规则相同 低 2 个次版本
常见误区:kube-controller-manager 和 kube-scheduler 必须与 kube-apiserver 的次版本号完全一致。如果这些控制平面组件版本不匹配,可能导致控制器循环异常、调度决策失败等严重问题。在节点池回退场景中,控制平面组件版本不应作为回退对象。

2.3 版本偏差关系 SVG 图

下图直观展示了 kube-apiserver、kubelet、kubectl 三者之间的版本偏差边界。图中以 kube-apiserver 1.28 为中心,绿色区域表示 kubelet 允许的版本范围,蓝色区域表示 kubectl 允许的版本范围,红色区域表示不允许的版本组合。

Kubernetes 版本偏差关系图 Kubernetes 版本偏差关系(以 apiserver 1.28 为例) kube-apiserver 1.28 kubelet 允许版本 1.26(低 2) 1.27(低 1) 1.28(相同) kubectl 允许版本 1.27(低 1) 1.28(相同) 1.29(高 1) 偏差 ≤ 2 偏差 ≤ 1 不允许的版本组合 kubelet 1.29(高于 apiserver)| kubectl 1.26(低于 apiserver 超过 1)| kubelet 1.25(低于 apiserver 超过 2) 说明: • 绿色区域:kubelet 允许的版本范围(≤ apiserver,且偏差 ≤ 2) • 紫色区域:kubectl 允许的版本范围(偏差 ≤ 1,可高可低)

2.4 节点池回退场景下的版本偏差验证

在节点池回退演练中,版本偏差规则直接影响回退操作的可行性。以下列表总结了不同回退场景下的验证要点:

  • 场景一:节点池 kubelet 从 1.28 回退到 1.27
    • 偏差量:低 1 个次版本(相对于 apiserver 1.28)
    • 结果:允许,kubelet 可正常注册和工作
    • 验证项:节点状态、Pod 调度、kubectl 日志查看
  • 场景二:节点池 kubelet 从 1.28 回退到 1.26
    • 偏差量:低 2 个次版本(相对于 apiserver 1.28)
    • 结果:允许,但处于最大偏差边界
    • 验证项:kubelet 证书轮换、API 请求兼容性、旧版特性降级
  • 场景三:节点池 kubelet 从 1.28 回退到 1.25
    • 偏差量:低 3 个次版本(相对于 apiserver 1.28)
    • 结果:不允许,kubelet 无法注册
    • 验证项:节点状态持续 NotReady、kubelet 日志报错 "version too old"
  • 场景四:kubectl 版本与回退后的节点交互
    • 如果 kubectl 版本为 1.29(高 1),回退后节点 kubelet 为 1.26
    • 结果:允许,kubectl 与 apiserver 通信正常,但需注意 kubectl 1.29 可能使用的新 API 特性在 1.26 节点上不可用

2.5 版本偏差与 API 兼容性 SVG 图

下图从 API 版本兼容性角度,展示了 kube-apiserver、kubelet、kubectl 在版本偏差下的 API 调用链路。重点说明当 kubelet 版本落后时,API 请求如何通过 apiserver 进行版本转换。

版本偏差下的 API 兼容性链路 版本偏差下的 API 兼容性链路 kubectl 1.29 kube-apiserver 1.28 kubelet 1.26 API 请求 API 请求 API 版本转换 apiserver 1.28 自动将 v1 请求转换为 kubelet 1.26 可理解的版本 兼容性总结 kubectl 1.29 → apiserver 1.28:允许(高 1) apiserver 1.28 → kubelet 1.26:允许(低 2),API 版本由 apiserver 自动转换

2.6 版本偏差策略的运维建议

节点池回退演练中的版本偏差检查清单:

  1. 确认当前 kube-apiserver 版本:使用 kubectl version --short 获取服务端版本。
  2. 确认目标回退版本:节点池计划回退到的 kubelet 版本。
  3. 计算偏差量:目标版本与 apiserver 版本的次版本差值。
  4. 检查偏差边界:确保 kubelet 偏差 ≤ 2 且不高于 apiserver;kubectl 偏差 ≤ 1。
  5. 验证 API 兼容性:如果 kubelet 版本较低,确认节点上运行的 Pod 未使用仅在新版本中可用的 API 资源。
  6. 准备回退后的验证脚本:包括节点状态检查、Pod 运行状态、kubelet 日志关键字扫描。