Урок 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