# Урок 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 - < /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' ```