用 Kyverno 建立 Kubernetes 策略基线

适用场景

需要强制镜像来源、禁止特权容器、要求资源限制、自动补标签或生成配套资源。Kyverno 用 Kubernetes 原生 YAML 表达策略,不需要学习 Rego。

前置条件

步骤

  1. 安装 Kyverno:
helm repo add kyverno https://kyverno.github.io/kyverno
helm install kyverno kyverno/kyverno \
  --namespace kyverno --create-namespace \
  --set admissionController.replicas=3
  1. 先创建一条审计模式的策略,禁止 latest 标签:
kubectl apply -f - <<'EOF'
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-latest-tag
spec:
  validationFailureAction: Audit
  rules:
  - name: require-image-tag
    match:
      any:
      - resources:
          kinds: [Pod]
    validate:
      message: "镜像必须使用明确版本,不能使用 latest。"
      pattern:
        spec:
          containers:
          - image: "!*:latest"
EOF
  1. 观察违规资源:
kubectl get policyreport -A
kubectl get clusterpolicyreport
  1. 确认没有误伤后切换为 Enforce:
kubectl patch clusterpolicy disallow-latest-tag \
  --type merge -p '{"spec":{"validationFailureAction":"Enforce"}}'
  1. 添加资源限制和特权容器策略。对系统命名空间使用 exclude 或 PolicyException。

  2. 使用 mutate 自动补标签:

kubectl apply -f - <<'EOF'
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-team-label
spec:
  rules:
  - name: add-label
    match:
      any:
      - resources:
          kinds: [Deployment]
    mutate:
      patchStrategicMerge:
        metadata:
          labels:
            managed-by: kyverno
EOF
  1. 在 CI 中先用 CLI 测试策略:
kyverno apply policies/ --resource deployment.yaml
kyverno test .

验证

回滚

常见坑

相关命令