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

149 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Урок 2.3 — Обработка ошибок и отчётность
## Файлы
| Файл | Описание |
|------|----------|
| `prometheus-alert-rules.yaml` | PrometheusRule с алертами |
| `service-monitor.yaml` | ServiceMonitor для Prometheus Operator |
## Работа с PolicyReport
### Пример записи policy report
```yaml
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
```
```bash
# Посмотреть все отчёты
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 метрики
```bash
# Проверить доступность метрик (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)
```promql
# 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])
)
```
## Применение мониторинга
```bash
# Применить ServiceMonitor (требует Prometheus Operator)
kubectl apply -f service-monitor.yaml
# Применить правила алертов
kubectl apply -f prometheus-alert-rules.yaml
# Проверить что правила подхватились
kubectl get prometheusrule -n kyverno
```
## Режим Audit для существующего кластера
```bash
# Применить политику в 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
```