Контейнеризация и оркестрация
1) Зачем контейнеры и k8s в iGaming
Скорость изменений: предсказуемые образы, единый пайплайн CI/CD.
Устойчивость: авто-перезапуски, горизонтальный скейл, селф-хилинг.
Изоляция данных/регионов: неймспейсы/кластеры под юрисдикции.
Операционные стандарты: политики ресурсов, единый лог/метрики/трейсы.
Когда не нужно: маленькая команда, 2–3 сервиса, редкие релизы — стартуйте с PaaS/модульного монолита.
2) Образы и реестры (OCI/Docker)
2.1 Сборка образов — принципы
Multi-stage: билд → рантайм (тонкие базовые образы `distroless`, `alpine` с осторожностью).
Повторяемость: фиксируйте версии/sha256, `COPY --chown`, `--mount=type=cache` в BuildKit.
SBOM и подпись: `cosign sign/verify`, `slsa provenance`, политика «только подписанные».
Slim-down: удаляйте dev-tools, включайте `USER nonroot`, `readOnlyRootFilesystem`.
Пример Dockerfile (Node.js)
dockerfile build
FROM node:22-bookworm AS build
WORKDIR /app
COPY package. json./
RUN npm ci --omit=dev
COPY..
RUN npm run build
runtime (distroless)
FROM gcr. io/distroless/nodejs22
WORKDIR /srv
COPY --from=build /app/dist./dist
COPY --from=build /app/node_modules./node_modules
USER 10001
ENV NODE_ENV=production
CMD ["dist/server. js"]
2.2 Реестры и политики
Private registry + geo-реплики (EU/NA) для снижения латентности и соответствия GDPR.
Retention/immutability: запрет перезаписи тэгов, прогрев кэша в PoP.
Admission-контроль: только подписанные/скан-чистые образы (cosign+Trivy/Grype).
3) Оркестрация: базовые паттерны Kubernetes
3.1 Примитивы
Deployment — статeless-сервисы (лобби, API).
StatefulSet — кошелек/очереди/хранилища (фикс-имя, стабильные тома).
DaemonSet — агенты логов/сетевые компоненты.
Job/CronJob — миграции, отчеты, ETL.
3.2 Ресурсы и QoS
Указывайте `requests/limits` (CPU/Memory) → классы QoS и предсказуемое планирование.
Burstable только там, где это осознанно; критичное — Guaranteed.
Критичные платежные PODы поместите на выделенные пулы (taints/tolerations, node-affinity).
3.3 Устойчивость и релизы
Probes: `startup`, `liveness`, `readiness` (с таймаутами и периодами).
Rollout: `maxSurge/maxUnavailable`, canary через вес в Ingress/Gateway/Service Mesh.
PDB (PodDisruptionBudget) + graceful shutdown (PreStop hook, `terminationGracePeriodSeconds`).
Drain/cordon нод при апгрейдах.
4) Сеть: CNI, сервисы, входной трафик
4.1 CNI-слой
Calico/Cilium/Weave — политика сети (NetworkPolicy), eBPF для производительности.
Межнеймспейсные правила: минимально необходимые egress/ingress.
4.2 Сервисы и вход
Service: `ClusterIP/NodePort/LoadBalancer`.
Ingress или Gateway API для L7: маршруты по пути/хедеру/хосту, TLS, канареечные веса.
mTLS внутри кластера: через сервис-меш (Istio/Linkerd) — перехват TLS и политики.
Пример HTTPRoute (Gateway API, канареечный вес)
yaml apiVersion: gateway. networking. k8s. io/v1 kind: HTTPRoute spec:
rules:
- backendRefs:
- name: lobby-v1 weight: 90 port: 8080
- name: lobby-v2 weight: 10 port: 8080
5) Хранение: CSI/PV/PVC, классы томов
CSI-драйверы провайдера (EBS/PD/Premium SSD) + `storageClass` с параметрами производительности.
RWX для шаринга (NFS/FSx/Filestore) — осторожно с блокировками.
Backup/restore: Velero/Kasten, периодические снапшоты, проверка восстановления.
Шифрование: на уровне диска и на уровне БД (KMS).
6) Авто-масштабирование: HPA/VPA/KEDA
HPA (по CPU/RAM/кастомным метрикам — RPS, p95): для API/лобби.
VPA (рекомендации/авто) — для стабильных воркеров.
KEDA (event-driven) — масштаб по очередям Kafka/SQS/Redis, Cron-шедулы.
Cluster Autoscaler — узлы по нагрузке; warm-пулы для пиков (турниры/стримы).
7) Сервис-меш (по необходимости)
mTLS/политики сервис↔сервис, авторизация по идентичностям (SPIFFE).
Circuit-breaker/timeout/retry, outlier-ejection, зеркалирование (shadow).
Теле-метрия из коробки: единые метрики и трассы.
Используйте там, где нужен тонкий трафик-менеджмент (платежи, провайдеры игр).
8) Безопасность: секреты, политика, соответствие
Secrets: внешний менеджер (AWS/GCP/Azure KMS, External Secrets), ротация.
Policy-as-code: OPA/Gatekeeper/Kyverno — запрет `:latest`, root-USER, hostPath, привилегий.
Эскалация прав: Namespaces + RBAC, разделение Dev/Stage/Prod, аудит.
Image Security: скан в CI/CD, подписание (cosign), admission по подписи.
mTLS и JWT внутри (меш), WAF/Rate-limit на входе (Ingress/Gateway).
9) Наблюдаемость и SLO
Metrics: Prometheus/OpenTelemetry, p50/95/99, 4xx/5xx, saturations.
Logs: структурный JSON → Loki/Elastic, маскирование PII/PAN/IBAN.
Traces: OTLP → Tempo/Jaeger; `trace_id` идет от шлюза.
SLO: например, `Deposit p95 ≤ 300 ms, success ≥ 98.5%`, алерты burn-rate.
Проактивность: дашборды per-service/per-route, watchdog по DLQ и лагам очередей.
10) CI/CD, Helm, GitOps
CI: линтеры, тесты (unit/contract/integration), SAST/DAST, SBOM.
Helm/Jsonnet/Kustomize: декларативные чарты с `values.` на окружения.
GitOps (ArgoCD/Flux): single-source-of-truth, PR-ревью манифестов, rollback кнопкой.
Стратегии: blue-green, canary, shadow; миграции схем — expand-and-contract.
Фрагмент values.yaml (ресурсы/пробы)
yaml resources:
requests: { cpu: "200m", memory: "256Mi" }
limits: { cpu: "500m", memory: "512Mi" }
livenessProbe: { httpGet: { path: /healthz, port: 8080 }, initialDelaySeconds: 20, periodSeconds: 10 }
readinessProbe: { httpGet: { path: /readyz, port: 8080 }, initialDelaySeconds: 5, periodSeconds: 5 }
11) Планирование и изоляция
NodePools: отделите платежи/кошелек на «низкошумные» узлы с быстрым диском.
Taints/Tolerations: защищенные пулы для критико-нагрузок.
(Anti-)Affinity: размазывайте реплики по зонам/узлам (HA).
ResourceQuota/LimitRange на неймспейсы — защита от «шумных соседей».
12) Мультикластер, мульти-регион, DR
Разделение по юрисдикциям: кластеры EU/LatAm/ROW; данные резидентов — локально.
GSLB/Anycast на входе, пер-класт-наблюдаемость и алерты.
- Warm standby (рекомендуемо): синх-реплика критичных БД, периодические проверки failover.
- Active-active для чтений/региональной маршрутизации.
- Резервирование: бэкапы (Velero), rehearsal восстановления.
13) iGaming-специфика
Платежи/кошелек: p95 ≤ 300–500 мс, отдельные пулы и строгие PDB; canary 1→5→10%.
Лобби/контент: агрессивный HPA по RPS/INP, прогретые образы/векторный кеш.
Лайв-игры/стримы: LC/минимум ретраев, длинные таймауты сокетов, sticky по соединению.
Комплаенс: неймспейсы с жесткой Policy, секреты через KMS, аудит изменений Helm-релизов.
Ответственная игра: сервис лимитов/блокировок — приоритетный трафик (fail-open/close по политике).
14) Чек-листы
Перед выкладкой сервиса
- Multi-stage образ, USER nonroot, подпись cosign, скан пройден.
- Requests/limits, probes, env/secret из внешнего менеджера.
- PDB, `maxUnavailable ≤ 1`, graceful shutdown.
- SLO/алерты, трассировка от шлюза до БД.
- Канареечная схема и план отката.
- Политики OPA/Kyverno проходят (no root, no hostPath, no:latest).
Кластер/платформа
- CNI и NetworkPolicy включены; mTLS (меш) где нужно.
- StorageClass/ретеншн, бэкап/restore проверены.
- HPA/VPA/KEDA настроены; Cluster Autoscaler и warm-pool.
- RBAC минимальный, аудит включен, секреты — из KMS.
- GitOps: чарты/манифесты в репозитории, обзор PR обязателен.
15) Анти-паттерны
Образы `latest`, root-пользователь, «толстые» базовые слои.
Нет `requests/limits` → эвикции/троттлинг.
Readiness=liveness (флапающие рестарты).
Смешение стейтфул/стателесс на одном пуле без taints.
Миграции схем «в лоб» без expand-and-contract.
Единственный кластер «на все рынки» без региональной изоляции.
Логи с PII/PAN, секреты в ConfigMap.
Отсутствие PDB/дрэнажа → обрывы в пиках и при апгрейдах.
16) Метрики платформы (минимум)
Кластер: CPU/mem requests vs allocatable, pod-churn, node-pressure.
Сеть: p95 per-route, 4xx/5xx, reset/timeout, retry-rate, mTLS-ошибки.
Хранилища: IOPS/latency, queue-depth, ошибок CSI.
Автоскейл: HPA decisions, CA events, время прогрева.
Бизнес: TTP, TtW, FTD-success, отказ платежей по провайдеру.
Безопасность: несоответствия OPA, не-подписанные образы, просроченные секреты.
17) Примеры манифестов
Deployment (API, канареечный label)
yaml apiVersion: apps/v1 kind: Deployment metadata: { name: wallet-api, labels: { app: wallet, track: stable } }
spec:
replicas: 4 strategy: { type: RollingUpdate, rollingUpdate: { maxSurge: 1, maxUnavailable: 1 } }
selector: { matchLabels: { app: wallet, track: stable } }
template:
metadata: { labels: { app: wallet, track: stable } }
spec:
serviceAccountName: wallet-sa containers:
- name: api image: registry. local/wallet/api@sha256:...
ports: [{ containerPort: 8080 }]
resources:
requests: { cpu: "250m", memory: "256Mi" }
limits: { cpu: "500m", memory: "512Mi" }
readinessProbe: { httpGet: { path: /readyz, port: 8080 }, periodSeconds: 5 }
livenessProbe: { httpGet: { path: /healthz, port: 8080 }, initialDelaySeconds: 20 }
securityContext:
runAsNonRoot: true readOnlyRootFilesystem: true
PDB (кошелек)
yaml apiVersion: policy/v1 kind: PodDisruptionBudget spec:
minAvailable: 3 selector: { matchLabels: { app: wallet } }
HPA (по RPS через custom-metrics)
yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler spec:
minReplicas: 4 maxReplicas: 40 metrics:
- type: Pods pods:
metric:
name: http_requests_per_second target:
type: AverageValue averageValue: "50"
18) Процесс внедрения (по спринтам)
1. Сборка и безопасность образов: multi-stage, SBOM, подписи, политика admission.
2. Базовая платформа k8s: CNI, Ingress/Gateway, мониторинг/логи/трейсы, StorageClass.
3. CI/CD и GitOps: Helm-чарты, среды, canary/rollback, миграции схем.
4. Скейл и устойчивость: HPA/VPA/KEDA, PDB, node-пулы, taints/affinity, DR-план.
Итоговая шпаргалка
Тонкие, подписанные образы + политика допуска = основа безопасности.
Пробы, ресурсы, PDB, drain = устойчивость релизов.
HPA/VPA/KEDA + тюнинг пулов = масштаб без «просадок».
Gateway/Ingress + мTLS/OPA = безопасный периметр и внутренняя связь.
Observability + SLO + GitOps = управляемые изменения.
Региональная изоляция и DR = комплаенс и отказоустойчивость.