1. 课程导论:什么是集群版本漂移、为什么需要拦截版本漂移、Kyverno 在其中的角色

1.1 什么是集群版本漂移

在 Kubernetes 多集群或混合云环境中,集群版本漂移(Cluster Version Drift) 是指同一组织内不同 Kubernetes 集群的版本号、API 版本可用性、节点操作系统版本或核心组件配置逐渐产生不一致的现象。这种漂移通常不是一次性升级导致的,而是由于各集群的升级窗口、运维策略、供应商支持周期不同,经过数月或数个迭代周期后累积形成的版本差异。

版本漂移的典型表现:
  • 集群 A 运行 Kubernetes v1.27,集群 B 运行 v1.29,两者相差两个大版本。
  • 集群 C 已弃用 batch/v2alpha1 API,但集群 D 仍在使用该 API 的 CronJob。
  • 节点池中混用 containerd 1.6 和 1.7,导致容器运行时行为不一致。
  • etcd 版本、CoreDNS 版本、kube-proxy 版本在不同集群间出现差异。

版本漂移的核心风险在于:API 兼容性断裂。Kubernetes 社区每三个月发布一个小版本,每几个版本会弃用一批旧 API。当集群版本漂移超过一个主版本时,原本在旧集群上正常运行的 Workload,迁移到新集群后可能因 API 缺失或行为变更而直接失败。

集群版本漂移示意图 集群 A K8s v1.27 API: apps/v1, batch/v1 集群 B K8s v1.28 API: apps/v1, batch/v1 集群 C K8s v1.29 API: batch/v1 已弃用 小版本差异 大版本漂移 版本漂移带来的直接后果 • 集群 C 已弃用 batch/v2alpha1,但旧 Workload 仍引用该 API • 跨集群迁移时,YAML 清单在新集群上 Apply 失败 • 安全补丁版本不一致,低版本集群存在已知 CVE 漏洞

1.2 为什么需要拦截版本漂移

版本漂移并非单纯的版本号差异,它直接威胁到集群的稳定性、安全性和运维一致性。以下从三个维度说明拦截版本漂移的必要性:

维度 风险描述 实际案例
API 兼容性 旧 API 在新版本中被移除,导致 Workload 无法部署或运行异常 v1.25 移除 PodSecurityPolicy,未迁移的集群直接拒绝 Pod 创建
安全合规 低版本集群存在已知 CVE,且无法通过热修复解决 v1.24 之前 kubelet 存在 CVE-2023-2727,需升级到 v1.25+
运维一致性 不同版本的 kubectl、Helm、Operator 行为不一致,CI/CD 流水线难以统一 Helm v3.10 与 v3.12 对 values 合并策略存在差异
关键认知:版本漂移不是“要不要升级”的问题,而是“如何确保所有集群在可接受的时间窗口内保持版本一致”。拦截版本漂移的核心目标是:阻止不符合版本策略的 Workload 或配置进入集群,而不是阻止集群升级本身。

1.3 Kyverno 在其中的角色

Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,以 Admission Controller(准入控制器) 的形式运行在集群内部。它在 API 请求被持久化到 etcd 之前,拦截并评估该请求是否符合预定义的策略规则。

在拦截集群版本漂移的场景中,Kyverno 扮演以下三个核心角色:

  1. 版本策略执行者: 通过 Kyverno 的 validate 规则,检查 Pod、Deployment、CronJob 等资源引用的 API 版本是否在当前集群的允许版本范围内。
  2. 集群版本感知器: 利用 Kyverno 的 context 和 APIService 数据源,动态获取集群当前的 Kubernetes 版本、已注册 API 组版本,实现策略与集群状态联动。
  3. 漂移拦截网关: 在 Admission Review 阶段直接拒绝违反版本策略的请求,从源头阻止版本漂移的 Workload 进入集群。
Kyverno 拦截版本漂移架构图 用户 / CI/CD 流水线 kubectl apply / Helm install Kubernetes API Server Admission Review 请求 Kyverno 策略引擎 MutatingWebhookConfiguration ValidatingWebhookConfiguration 版本漂移拦截策略 validate.deny: apiVersion 不在白名单 context: 集群版本 + 可用 API 列表 Admission Response 允许 / 拒绝(含原因) etcd Kyverno 在 Admission Review 阶段拦截请求,阻止版本漂移的 Workload 写入 etcd

1.4 Kyverno 策略示例:拦截已弃用 API 版本

以下是一个简单的 Kyverno ClusterPolicy 示例,用于拦截使用已弃用 API 版本的 Deployment 资源:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: block-deprecated-api-versions
spec:
  validationFailureAction: Enforce
  rules:
  - name: block-deployment-deprecated-api
    match:
      any:
      - resources:
          kinds:
          - Deployment
    validate:
      message: "Deployment 必须使用 apps/v1,不允许使用已弃用的 extensions/v1beta1 或 apps/v1beta1。"
      pattern:
        apiVersion: "apps/v1"