4. Kyverno入门:设计哲学、架构组件、安装与部署

4.1 Kyverno的设计哲学

Kyverno(希腊语“治理”)是一个为Kubernetes量身定制的策略引擎,其核心设计哲学可概括为“策略即Kubernetes资源”。与OPA/Rego将策略编写为独立DSL不同,Kyverno直接使用Kubernetes的YAML清单格式定义策略,极大降低了学习曲线。

设计原则 说明
原生Kubernetes 策略使用标准的Kubernetes CRD(Custom Resource Definition)定义,无需学习新语言
声明式匹配 通过match/exclude块选择目标资源,类似Kubernetes RBAC的匹配逻辑
非侵入式 作为Admission Webhook运行,不修改Kubernetes核心组件
策略即代码 支持GitOps工作流,策略可版本化、评审、自动化测试
可观测性 内置策略执行报告(PolicyReport),提供审计与合规状态
关键差异: Kyverno的策略定义本身就是Kubernetes资源,可以直接通过kubectl apply部署,无需额外工具链。这使得平台团队可以像管理Deployment一样管理安全策略。

4.2 架构组件与工作流

Kyverno以Deployment形式运行在集群内,通过动态Admission Webhook拦截资源请求。其核心组件包括:

  • Kyverno Controller:主控制器,负责策略注册、Webhook管理、策略执行
  • Webhook Server:处理AdmissionReview请求,执行策略验证与变更
  • Policy Cache:缓存已加载的策略,提升执行性能
  • Report Controller:生成PolicyReport和ClusterPolicyReport资源
  • Background Scanner:对已有资源进行后台扫描,发现违反策略的存量资源
Kyverno 架构组件与请求处理流程 kubectl / API API Server Webhook Server AdmissionReview Mutating/Validating Kyverno Controller 策略注册 / Webhook管理 Policy Cache 策略规则缓存 Report Controller PolicyReport生成 Background Scanner 存量资源合规扫描 etcd 策略 / 报告存储 加载策略 策略查询 工作流说明 1. 用户提交资源 → 2. API Server触发Admission Webhook → 3. Webhook Server查询Policy Cache执行策略 4. 返回允许/拒绝 → 5. Report Controller记录结果 → 6. Background Scanner定期扫描存量资源

4.3 安装与部署

Kyverno支持多种安装方式,推荐使用Helm Chart进行生产部署。以下为两种主流方式:

4.3.1 使用Helm安装(推荐)

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

# 安装Kyverno到kyverno命名空间
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --set admissionController.replicas=2 \
  --set backgroundController.enabled=true \
  --set reportsController.enabled=true

4.3.2 使用YAML清单安装

# 直接应用官方发布清单(适用于快速验证)
kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml
生产部署注意事项:
  • 建议将admissionController.replicas设置为至少2个副本,保证高可用
  • 启用backgroundController以支持存量资源扫描
  • 启用reportsController以生成合规报告
  • 配置资源限制(requests/limits),避免Webhook响应超时

4.4 验证部署

安装完成后,通过以下命令验证组件状态:

# 检查Pod运行状态
kubectl get pods -n kyverno

# 预期输出示例:
# NAME                                      READY   STATUS    RESTARTS   AGE
# kyverno-admission-controller-7c8b9d6f9-abcde   1/1     Running   0          2m
# kyverno-background-controller-5f4b7c8d9-fghij  1/1     Running   0          2m
# kyverno-reports-controller-6d2e4f8a0-klmno     1/1     Running   0          2m

# 检查Webhook配置
kubectl get validatingwebhookconfigurations -l app.kubernetes.io/instance=kyverno
kubectl get mutatingwebhookconfigurations -l app.kubernetes.io/instance=kyverno

4.5 策略类型概览

Kyverno支持三种策略类型,覆盖安全基线巡检的常见场景:

策略类型 作用时机 典型用途
Validate 资源创建/更新时 强制Pod必须设置资源限制、禁止特权容器
Mutate 资源创建/更新时 自动注入Sidecar、添加标签、设置默认安全上下文
Generate 资源创建时 自动创建NetworkPolicy、Namespace配额、镜像拉取Secret
安全基线巡检最佳实践: 建议优先使用Validate策略强制合规,配合Mutate策略自动修复常见配置遗漏(如缺失的securityContext),最后使用Generate策略为每个Namespace自动创建默认的NetworkPolicy。

4.6 第一个策略示例

以下是一个简单的Validate策略,禁止Pod使用latest镜像标签:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-latest-tag
spec:
  validationFailureAction: Enforce  # Enforce: 拒绝违反策略的资源; Audit: 仅记录
  rules:
  - name: require-image-tag
    match:
      resources:
        kinds:
        - Pod
    validate:
      message: "镜像标签不能为 'latest'"
      pattern:
        spec:
          containers:
          - image: "!*:latest"
快速测试: 将validationFailureAction设置为Audit模式,可以先观察策略影响范围,确认无误后再切换为Enforce模式强制执行。