init
This commit is contained in:
185
06-monitoring/03-performance/README.md
Normal file
185
06-monitoring/03-performance/README.md
Normal file
@@ -0,0 +1,185 @@
|
||||
# Урок 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'
|
||||
```
|
||||
Reference in New Issue
Block a user