Files
kyverno-2026-example/02-validation/03-reporting/README.md
2026-04-09 20:14:24 +07:00

4.3 KiB
Raw Blame History

Урок 2.3 — Обработка ошибок и отчётность

Файлы

Файл Описание
prometheus-alert-rules.yaml PrometheusRule с алертами
service-monitor.yaml ServiceMonitor для Prometheus Operator

Работа с PolicyReport

Пример записи policy report

apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
  name: polr-ns-default
  namespace: default
results:
- message: "Контейнер 'nginx' должен иметь resource limits"
  policy: require-resource-limits
  result: fail
  rule: check-container-limits
  scored: true
  severity: high
  resources:
  - apiVersion: v1
    kind: Pod
    name: my-app
    namespace: default
# Посмотреть все отчёты
kubectl get policyreports -A
kubectl get clusterpolicyreports

# Детальный отчёт по namespace
kubectl describe policyreport -n production

# Все нарушения в кластере (форматированный вывод)
kubectl get policyreports -A -o json | \
  jq -r '.items[] | .metadata.namespace as $ns |
  .results[] | select(.result == "fail") |
  "\($ns)/\(.resources[0].name)\t\(.policy)/\(.rule)\t\(.message)"' | \
  column -t -s $'\t'

# Топ-10 политик по нарушениям
kubectl get policyreports -A -o json | \
  jq -r '[.items[].results[] | select(.result == "fail") | .policy] |
  group_by(.) | map({policy: .[0], count: length}) |
  sort_by(-.count)[:10][] | "\(.count)\t\(.policy)"'

# Нарушения по конкретной политике
POLICY="require-resource-limits"
kubectl get policyreports -A -o json | \
  jq --arg p "$POLICY" \
  -r '.items[] | .metadata.namespace as $ns |
  .results[] | select(.policy == $p and .result == "fail") |
  "\($ns)/\(.resources[0].name): \(.message)"'

# Compliance rate по namespace
kubectl get policyreports -A -o json | \
  jq -r '.items[] | .metadata.namespace as $ns |
  {ns: $ns, pass: [.results[] | select(.result=="pass")] | length,
             fail: [.results[] | select(.result=="fail")] | length} |
  "\(.ns): pass=\(.pass) fail=\(.fail)"'

Prometheus метрики

# Проверить доступность метрик (port-forward если нет Ingress)
kubectl port-forward -n kyverno svc/kyverno-svc-metrics 8000:8000 &

# Посмотреть все метрики
curl -s http://localhost:8000/metrics | grep kyverno_

# Ключевые метрики
curl -s http://localhost:8000/metrics | grep kyverno_policy_results_total
curl -s http://localhost:8000/metrics | grep kyverno_admission_review_duration

Полезные PromQL запросы (для Grafana)

# Compliance rate (цель: 1.0 = 100%)
sum(rate(kyverno_policy_results_total{rule_result="pass"}[5m])) /
sum(rate(kyverno_policy_results_total[5m]))

# Нарушений в час по политикам
topk(10, sum by(policy_name)(
  increase(kyverno_policy_results_total{rule_result="fail"}[1h])
))

# p95 латентность admission
histogram_quantile(0.95,
  sum(rate(kyverno_admission_review_duration_seconds_bucket[5m])) by (le)
)

# Нарушения по namespace за сутки
sum by(resource_namespace)(
  increase(kyverno_policy_results_total{rule_result="fail"}[24h])
)

Применение мониторинга

# Применить ServiceMonitor (требует Prometheus Operator)
kubectl apply -f service-monitor.yaml

# Применить правила алертов
kubectl apply -f prometheus-alert-rules.yaml

# Проверить что правила подхватились
kubectl get prometheusrule -n kyverno

Режим Audit для существующего кластера

# Применить политику в Audit режиме
kubectl apply -f - <<EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: audit-all-pods
spec:
  validationFailureAction: Audit
  background: true
  rules:
  - name: check-labels
    match:
      resources:
        kinds: [Pod]
    validate:
      message: "Под должен иметь лейбл app"
      pattern:
        metadata:
          labels:
            app: "?*"
EOF

# Подождать background scan (30-60 секунд), потом:
kubectl get policyreports -A | grep -v 0/0