控制平面灾备准入的Kyverno规则编写与测试 - 第2节

2.1 Kyverno 简介

Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,由 Nirmata 开源并已加入 CNCF 沙箱项目。其名称源自希腊语“κυβερνάω”(kybernáo),意为“掌舵”或“治理”。与传统的准入控制器(如 OPA/Gatekeeper)不同,Kyverno 采用 Kubernetes 原生资源模型,将策略定义为标准的 Custom Resource Definitions(CRD),无需学习专用的策略语言(如 Rego)。

Kyverno 以 动态准入 Webhook 的形式运行在集群中,拦截所有符合匹配条件的 API 请求,并在资源持久化到 etcd 之前执行 验证(Validate)、变更(Mutate) 或 生成(Generate) 操作。它天然适配 GitOps 工作流,策略即代码,可版本化管理。

核心优势: 零专用语言、原生 CRD、支持 YAML 即策略、内置集群策略与策略报告、与 RBAC 无缝集成。

2.2 核心概念

Kyverno 的策略体系由 Policy(集群策略)和 ClusterPolicy(集群范围策略)两种资源构成。每个策略包含一个或多个 Rule(规则),规则是策略的最小执行单元。

2.2.1 Policy 与 ClusterPolicy

资源类型 作用域 适用场景
Policy 命名空间级别 仅对特定命名空间内的资源生效
ClusterPolicy 集群级别 跨所有命名空间或集群范围的资源(如 Node、PV、CRD)

2.2.2 Rule 的结构

每个 Rule 由三个核心阶段组成:

  1. Match(匹配):定义规则适用的资源范围(kind、annotations、namespaceSelector 等)。
  2. Exclude(排除):可选,从匹配结果中排除特定资源。
  3. Action(动作):对匹配的资源执行的操作,包括 validate、mutate、generate。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  rules:
  - name: check-app-label
    match:
      resources:
        kinds:
        - Pod
    validate:
      message: "标签 'app' 是必需的"
      pattern:
        metadata:
          labels:
            app: "?*"

2.3 三大动作:Mutate、Validate、Generate

Kyverno 的规则动作决定了策略的最终效果。下表对比了三种动作的核心差异:

动作类型 执行时机 行为描述 典型用例
Mutate 准入阶段(Admission) 在资源持久化前修改其配置 自动注入 Sidecar、添加默认标签、设置资源配额
Validate 准入阶段(Admission) 检查资源是否符合约束条件,拒绝不合规请求 强制镜像来源、禁止特权容器、检查 Pod 安全标准
Generate 准入后(Background) 基于源资源创建新的 Kubernetes 资源 自动创建 Namespace 对应的 NetworkPolicy、RBAC 绑定
提示: Mutate 规则在 Validate 规则之前执行。如果 Mutate 修改了资源,Validate 将基于修改后的版本进行检查。

2.4 安装与部署

Kyverno 支持多种安装方式,推荐使用 Helm Chart 进行生产部署。以下为标准的安装步骤:

2.4.1 前置条件

  • Kubernetes 集群版本 ≥ 1.23
  • 集群已启用 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook 准入控制器
  • Helm 3 已安装

2.4.2 使用 Helm 安装

# 添加 Kyverno Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

# 创建命名空间
kubectl create namespace kyverno

# 安装 Kyverno(默认配置)
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace

# 验证安装
kubectl get pods -n kyverno
# 预期输出:kyverno-admission-controller、kyverno-background-controller、kyverno-reports-controller 均处于 Running 状态

2.4.3 验证部署

安装完成后,可以通过部署一个简单的测试策略来验证 Kyverno 是否正常工作:

cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: demo-validate
spec:
  rules:
  - name: require-team-label
    match:
      resources:
        kinds:
        - Namespace
    validate:
      message: "每个 Namespace 必须包含 'team' 标签"
      pattern:
        metadata:
          labels:
            team: "?*"
EOF

# 尝试创建一个不带 team 标签的 Namespace
kubectl create namespace test-ns
# 预期输出:Error from server: admission webhook "validate.kyverno.svc" denied the request
注意: 如果集群使用自签名证书或私有 CA,可能需要配置 Kyverno 的 webhook 证书。生产环境建议使用 cert-manager 管理证书生命周期。

2.5 Kyverno 架构概览

下图展示了 Kyverno 在 Kubernetes 集群中的核心组件及其交互流程:

Kyverno 核心架构与请求处理流程 Kubernetes API Server Kyverno Admission Controller (Webhook) 规则引擎 (Match → Mutate → Validate) Mutate (变更) Validate (验证) Generate (生成) etcd (持久化) 说明:API Server 通过 Webhook 将请求转发给 Kyverno,规则引擎按 Mutate → Validate 顺序执行,Generate 在后台异步完成

2.6 策略报告与监控

Kyverno 会自动生成 PolicyReport 和 ClusterPolicyReport 资源,记录每条策略的执行结果。这些报告遵循 Kubernetes 策略报告标准,可被外部工具(如 Polaris、kube-bench)消费。

# 查看命名空间级别的策略报告
kubectl get policyreport -n default

# 查看集群级别的策略报告
kubectl get clusterpolicyreport

# 查看详细报告内容
kubectl get policyreport cpol-require-labels -n default -o yaml
最佳实践: 建议将策略报告接入 Prometheus 或 Grafana,实现策略合规性的实时监控与告警。

2.7 本章小结