Вопрос 26 · Раздел 17

Какие инструменты используются для оркестрации микросервисов

Kubernetes — де-факто стандарт благодаря: открытость (CNCF), поддержка всеми облачными провайдерами (GKE, EKS, AKS), огромное сообщество, стандартный API.

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

Оркестрация — это управление жизненным циклом микросервисов: запуск, остановка, масштабирование, обновление.

Kubernetes — де-факто стандарт благодаря: открытость (CNCF), поддержка всеми облачными провайдерами (GKE, EKS, AKS), огромное сообщество, стандартный API.

Основные инструменты

Инструмент Что делает
Kubernetes (K8s) Оркестрация контейнеров (де-факто стандарт)
Docker Compose Локальная оркестрация для разработки
Docker Swarm Простая оркестрация контейнеров
Apache Mesos Оркестрация кластеров
HashiCorp Nomad Простая альтернатива Kubernetes

Docker Compose (для разработки)

version: '3.8'
services:
  api-gateway:
    build: ./gateway
    ports:
      - "8080:8080"
    depends_on:
      - user-service
      - order-service

  user-service:
    build: ./user-service
    environment:
      - DB_HOST=postgres
      - KAFKA_BROKERS=kafka:9092

  order-service:
    build: ./order-service
    environment:
      - DB_HOST=postgres
      - KAFKA_BROKERS=kafka:9092

  postgres:
    image: postgres:15
    # Версии образов (cp-kafka:7.5.0, postgres:15) — примеры на момент написания.
    # В production используйте последние стабильные версии.
    environment:
      POSTGRES_PASSWORD: secret

  kafka:
    image: confluentinc/cp-kafka:7.5.0
    ports:
      - "9092:9092"

Kubernetes — базовый Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
        - name: user-service
          image: registry.example.com/user-service:1.2.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              memory: "256Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              cpu: "500m"
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5

Когда НЕ использовать Kubernetes

  • Маленькая команда (1-3 dev) — операционная сложность неоправданна
  • Простые приложения — Docker Compose достаточно
  • Строгие budget ограничения — K8s требует минимум 3 нод

🟡 Middle Level

Kubernetes — основные ресурсы

# Service — сетевой доступ к подам
apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP  # внутренний доступ

---
# Ingress — внешний доступ через API Gateway
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: api.example.com
      http:
        paths:
          - path: /users
            pathType: Prefix
            backend:
              service:
                name: user-service
                port:
                  number: 80
          - path: /orders
            pathType: Prefix
            backend:
              service:
                name: order-service
                port:
                  number: 80

Helm — пакетный менеджер для K8s

# Chart.yaml
apiVersion: v2
name: microservices-stack
version: 1.0.0
dependencies:
  - name: user-service
    version: 1.0.0
  - name: order-service
    version: 1.0.0
  - name: kafka
    version: 22.0.0
    repository: https://charts.bitnami.com/bitnami

Rolling Update — обновление без downtime

# Обновление версии
kubectl set image deployment/user-service \
  user-service=registry.example.com/user-service:1.3.0

# Откат при проблемах
kubectl rollout undo deployment/user-service

# Проверка статуса
kubectl rollout status deployment/user-service

Service Mesh — Istio

# VirtualService — управление трафиком
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: user-service
spec:
  hosts:
    - user-service
  http:
    - route:
        - destination:
            host: user-service
            subset: v1
          weight: 90
        - destination:
            host: user-service
            subset: v2
          weight: 10  # Canary deployment — 10% трафика на v2

---
# DestinationRule — подмножества
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: user-service
spec:
  host: user-service
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

Сравнение инструментов

Инструмент Сложность Масштаб Use Case
Docker Compose Низкая 1 хост Локальная разработка
Docker Swarm Средняя Несколько хостов Малые кластеры
Kubernetes Высокая Любой Production (де-факто стандарт)
Nomad Средняя Любой Простая альтернатива K8s
OpenShift Высокая Enterprise Kubernetes + дополнительные инструменты

🔴 Senior Level

Архитектура оркестрации

                   ┌─────────────────────────────────────────┐
                   │           API Gateway / Ingress          │
                   │        (Nginx, Traefik, Istio)           │
                   └────────────┬────────────────────────────┘
                                │
              ┌─────────────────┼─────────────────┐
              │                 │                 │
    ┌─────────▼────┐  ┌────────▼──────┐  ┌───────▼──────┐
    │ User Service  │  │Order Service  │  │Notify Service│
    │  (3 replicas) │  │ (5 replicas)  │  │ (2 replicas) │
    └─────────┬────┘  └────────┬──────┘  └───────┬──────┘
              │                 │                 │
    ┌─────────▼────┐  ┌────────▼──────┐  ┌───────▼──────┐
    │   PostgreSQL  │  │   PostgreSQL  │  │    Kafka     │
    │  (Primary +   │  │  (Primary +   │  │  Cluster     │
    │   Replica)    │  │   Replica)    │  │              │
    └──────────────┘  └───────────────┘  └──────────────┘

HPA — Horizontal Pod Autoscaler

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: user-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-service
  minReplicas: 3
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80
    - type: Pods
      pods:
        metric:
          name: http_requests_per_second
        target:
          type: AverageValue
          averageValue: "1000"
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      // stabilizationWindowSeconds: период «остывания» после масштабирования.
      // scaleDown: 300s — медленное уменьшение (избегаем flapping).
      // scaleUp: 60s — быстрое добавление (реагируем на пики).
      policies:
        - type: Pods
          value: 4
          periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300  # Не уменьшать резко
      policies:
        - type: Pods
          value: 1
          periodSeconds: 120

PodDisruptionBudget — защита от cascading failures

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: user-service-pdb
spec:
  minAvailable: 2  # Минимум 2 пода всегда работают
  selector:
    matchLabels:
      app: user-service

GitOps — ArgoCD / Flux

# ArgoCD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: user-service
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/company/k8s-manifests
    targetRevision: HEAD
    path: k8s/user-service
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Kustomize — управление конфигурациями для разных сред

# kustomization.yaml (base)
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml
  - ingress.yaml

# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base
patches:
  - target:
      kind: Deployment
      name: user-service
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 5

Service Mesh Patterns

# Fault Injection — тестирование устойчивости
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: user-service-fault
spec:
  hosts:
    - user-service
  http:
    - fault:
        delay:
          percentage:
            value: 10
          fixedDelay: 5s
        abort:
          percentage:
            value: 5
          httpStatus: 503
      route:
        - destination:
            host: user-service

# Rate Limiting
apiVersion: networking.istio.io/v1beta1
kind: EnvoyFilter
metadata:
  name: rate-limit
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: SIDECAR_INBOUND
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.local_ratelimit

Production Checklist

✅ Helm Charts для пакетирования
✅ GitOps (ArgoCD/Flux) для деплоя
✅ HPA для автоскейлинга
✅ PDB для защиты от cascading failures
✅ Pod Anti-Affinity для распределения по нодам
✅ Resource Limits для предотвращения noisy neighbor
✅ Liveness/Readiness/Startup Probes
✅ Service Mesh (Istio/Linkerd) для observability
✅ Canary/Blue-Green deployments
✅ Network Policies для изоляции
✅ Secrets Management (Vault, Sealed Secrets)
✅ Pod Security Standards

🎯 Шпаргалка для интервью

Обязательно знать:

  • Kubernetes — де-факто стандарт для production оркестрации (CNCF, все облачные провайдеры)
  • Docker Compose — локальная разработка, не production
  • Основные ресурсы K8s: Deployment, Service, Ingress, HPA, PDB
  • HPA — автоматическое масштабирование по CPU/memory/custom metrics
  • Helm — пакетный менеджер для K8s, dependency management
  • Rolling Update — обновление без downtime, rollback одной командой
  • Service Mesh (Istio) — canary deployment, fault injection, rate limiting
  • GitOps (ArgoCD/Flux) — автоматический деплой из git-репозитория
  • НЕ использовать K8s для маленьких команд (1-3 dev), простых приложений

Частые уточняющие вопросы:

  • HPA stabilizationWindowSeconds? Период «остывания» после масштабирования. scaleUp: 60s (быстро), scaleDown: 300s (медленно, избегаем flapping).
  • PodDisruptionBudget зачем? Гарантирует минимум работающих подов при maintenance — minAvailable: 2.
  • Istio fault injection? Намеренно добавляет delay/abort для тестирования устойчивости — chaos engineering.
  • GitOps преимущества? Audit trail (git history), rollback = git revert, self-healing (ArgoCD синхронизирует).

Красные флаги (НЕ говорить):

  • “Docker Compose для production” — нет, только для разработки
  • “K8s нужен для каждого проекта” — нет, операционная сложность неоправданна для маленьких команд
  • “HPA с 95% CPU — эффективно” — нет, не успеет масштабироваться
  • “Istio = замена Kubernetes” — нет, Istio работает поверх K8s (service mesh)

Связанные темы:

  • [[12. Как реализовать горизонтальное масштабирование микросервисов]]
  • [[7. Что такое Service Discovery и зачем он нужен]]
  • [[9. Что такое API Gateway и какие задачи он решает]]
  • [[21. Как мониторить распределённую систему микросервисов]]
  • [[17. Как обеспечить отказоустойчивость микросервисов]]