控制平面灾备准入的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 工作流,策略即代码,可版本化管理。
2.2 核心概念
Kyverno 的策略体系由 Policy(集群策略)和 ClusterPolicy(集群范围策略)两种资源构成。每个策略包含一个或多个 Rule(规则),规则是策略的最小执行单元。
2.2.1 Policy 与 ClusterPolicy
| 资源类型 | 作用域 | 适用场景 |
|---|---|---|
Policy |
命名空间级别 | 仅对特定命名空间内的资源生效 |
ClusterPolicy |
集群级别 | 跨所有命名空间或集群范围的资源(如 Node、PV、CRD) |
2.2.2 Rule 的结构
每个 Rule 由三个核心阶段组成:
- Match(匹配):定义规则适用的资源范围(kind、annotations、namespaceSelector 等)。
- Exclude(排除):可选,从匹配结果中排除特定资源。
- 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 绑定 |
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
2.5 Kyverno 架构概览
下图展示了 Kyverno 在 Kubernetes 集群中的核心组件及其交互流程:
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