Files
2026-04-08 20:22:14 +07:00

186 lines
5.0 KiB
Markdown
Raw Permalink 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.
# Урок 6.3 — Производительность и оптимизация
## Измерение текущей производительности
```bash
# Открыть метрики
kubectl port-forward -n kyverno svc/kyverno-svc-metrics 8000:8000 &
# p95 и p99 латентность
curl -s http://localhost:8000/metrics | \
grep 'kyverno_admission_review_duration_seconds_bucket' | \
tail -20
# Найти самые медленные политики (через Prometheus)
# topk(10,
# histogram_quantile(0.99,
# sum by(policy_name, rule_name, le)(
# rate(kyverno_admission_review_duration_seconds_bucket[5m])
# )
# )
# )
# Измерить время admission вручную
time kubectl run perf-test \
--image=nginx:1.25.3 \
--restart=Never \
--dry-run=server
kubectl delete pod perf-test 2>/dev/null || true
kill %1
```
## Пороговые значения
| Метрика | Хорошо | Приемлемо | Проблема |
|---------|--------|-----------|---------|
| p95 латентность | < 100ms | < 500ms | > 500ms |
| p99 латентность | < 200ms | < 1000ms | > 1000ms |
| CPU throttling | 0% | < 5% | > 10% |
| Error rate | 0% | < 0.1% | > 0.1% |
## Оптимизация 1: точные selectors
```yaml
# МЕДЛЕННО — матчит всё подряд
match:
resources:
kinds:
- "*"
# БЫСТРО — только нужные ресурсы и namespace
match:
resources:
kinds:
- Pod
namespaces:
- production
- staging
```
## Оптимизация 2: preconditions для быстрого выхода
```bash
# Добавить precondition перед дорогим context.apiCall
# Правило запустит apiCall только если precondition прошёл
```
```yaml
rules:
- name: expensive-check
match:
resources:
kinds: [Pod]
preconditions:
any:
# Быстрая проверка лейбла ДО дорогого apiCall
- key: "{{ request.object.metadata.labels.\"needs-check\" }}"
operator: Equals
value: "true"
context:
- name: externalData # вызывается только если precondition прошёл
apiCall:
urlPath: "..."
```
## Оптимизация 3: разбивать мегаполитики
```bash
# Посмотреть сколько правил в каждой политике
kubectl get clusterpolicies -o json | \
jq -r '.items[] | "\(.metadata.name): \(.spec.rules | length) rules"' | \
sort -t: -k2 -rn | head -10
# Политики с >5 правилами — кандидаты на разбивку
# Каждая политика применяется параллельно с другими
# Правила внутри политики — последовательно
```
## Оптимизация 4: ресурсы для Kyverno
```bash
# Проверить текущее потребление ресурсов
kubectl top pods -n kyverno
# Проверить CPU throttling
kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/kyverno/pods | \
jq '.items[] | {name: .metadata.name, cpu: .containers[].usage.cpu}'
# Увеличить ресурсы если нужно
helm upgrade kyverno kyverno/kyverno \
--namespace kyverno \
--reuse-values \
--set admissionController.resources.limits.cpu=2000m \
--set admissionController.resources.limits.memory=1Gi
```
## Оптимизация 5: замена apiCall на ConfigMap
```yaml
# МЕДЛЕННО — apiCall при каждом запросе
context:
- name: registries
apiCall:
urlPath: "/api/v1/namespaces/kyverno/configmaps/allowed-registries"
jmesPath: "data.list"
# БЫСТРО — ConfigMap кэшируется Kyverno
context:
- name: registries
configMap:
name: allowed-registries
namespace: kyverno
```
## Оптимизация 6: HPA для Kyverno
```bash
# Включить HPA для admission controller
kubectl apply -f - <<EOF
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: kyverno-admission-hpa
namespace: kyverno
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: kyverno-admission-controller
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
EOF
kubectl get hpa -n kyverno
```
## Нагрузочное тестирование политик
```bash
# Создать много подов быстро и измерить время
time for i in $(seq 1 50); do
kubectl run perf-pod-$i \
--image=nginx:1.25.3 \
--restart=Never \
--dry-run=server > /dev/null 2>&1
done
# Запустить параллельно
seq 1 20 | xargs -P 10 -I {} \
kubectl run perf-pod-{} \
--image=nginx:1.25.3 \
--restart=Never \
--dry-run=server
# Во время нагрузки мониторить latency
watch -n 2 'curl -s http://localhost:8000/metrics | \
grep admission_review_duration_seconds_sum'
```