1. 课程导论:什么是集群版本漂移、为什么需要拦截版本漂移、Kyverno 在其中的角色
1.1 什么是集群版本漂移
在 Kubernetes 多集群或混合云环境中,集群版本漂移(Cluster Version Drift) 是指同一组织内不同 Kubernetes 集群的版本号、API 版本可用性、节点操作系统版本或核心组件配置逐渐产生不一致的现象。这种漂移通常不是一次性升级导致的,而是由于各集群的升级窗口、运维策略、供应商支持周期不同,经过数月或数个迭代周期后累积形成的版本差异。
版本漂移的典型表现:
- 集群 A 运行 Kubernetes v1.27,集群 B 运行 v1.29,两者相差两个大版本。
- 集群 C 已弃用
batch/v2alpha1API,但集群 D 仍在使用该 API 的 CronJob。 - 节点池中混用 containerd 1.6 和 1.7,导致容器运行时行为不一致。
- etcd 版本、CoreDNS 版本、kube-proxy 版本在不同集群间出现差异。
版本漂移的核心风险在于:API 兼容性断裂。Kubernetes 社区每三个月发布一个小版本,每几个版本会弃用一批旧 API。当集群版本漂移超过一个主版本时,原本在旧集群上正常运行的 Workload,迁移到新集群后可能因 API 缺失或行为变更而直接失败。
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 扮演以下三个核心角色:
- 版本策略执行者: 通过 Kyverno 的
validate规则,检查 Pod、Deployment、CronJob 等资源引用的 API 版本是否在当前集群的允许版本范围内。 - 集群版本感知器: 利用 Kyverno 的
context和APIService数据源,动态获取集群当前的 Kubernetes 版本、已注册 API 组版本,实现策略与集群状态联动。 - 漂移拦截网关: 在 Admission Review 阶段直接拒绝违反版本策略的请求,从源头阻止版本漂移的 Workload 进入集群。
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"