127 lines
3.8 KiB
Markdown
127 lines
3.8 KiB
Markdown
# Урок 2.3 — Обработка ошибок и отчётность
|
||
|
||
## Файлы
|
||
|
||
| Файл | Описание |
|
||
|------|----------|
|
||
| `prometheus-alert-rules.yaml` | PrometheusRule с алертами |
|
||
| `service-monitor.yaml` | ServiceMonitor для Prometheus Operator |
|
||
|
||
## Работа с PolicyReport
|
||
|
||
```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
|
||
```
|