186 lines
5.0 KiB
Markdown
186 lines
5.0 KiB
Markdown
# Урок 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'
|
||
```
|