Які інструменти використовуються для оркестрації мікросервісів
4. Docker Swarm: Вбудований у Docker простий кластерний оркестратор для невеликих проєктів із мінімальною інфраструктурною складністю.
🟢 Junior Level
Оркестрація мікросервісів — це автоматизоване керування життєвим циклом сотень і тисяч контейнеризованих застосунків: їх розгортання (deployment), планування розміщення на фізичних вузлах (scheduling), перевірка працездатності (health checks), автоматичне масштабування (autoscaling) та балансування мережевого трафіку.
Кластер оркестрації (Kubernetes / Nomad):
┌──────────────────────────────┐
│ Master Node / Control Plane│
│ (API Server, etcd, Shed.) │
└──────────────┬───────────────┘
│ Призначення завдань
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
[Worker Node 1] [Worker Node 2] [Worker Node 3]
├── Order Pod #1 ├── Order Pod #2 ├── Order Pod #3
└── User Pod #1 └── Payment Pod #1 └── User Pod #2
Основні інструменти індустрії:
- Kubernetes (K8s): Загальновизнаний де-факто стандарт (відкритий проєкт під егідою CNCF). Підтримується всіма провідними хмарними провайдерами (AWS EKS, Google GKE, Azure AKS).
- Docker Compose: Інструмент для запуску мультиконтейнерних застосунків на одному локальному комп’ютері. Застосовується виключно для локальної розробки та тестування, але не в Production.
- HashiCorp Nomad: Легковажний оркестратор від компанії HashiCorp. Простіший в експлуатації, ніж Kubernetes, і вміє оркеструвати не лише Docker-контейнери, а й “сирі” бінарні файли, Java JAR та віртуальні машини.
- Docker Swarm: Вбудований у Docker простий кластерний оркестратор для невеликих проєктів із мінімальною інфраструктурною складністю.
🟡 Middle Level
1. Архітектура та основні об’єкти Kubernetes
У Kubernetes керування базується на декларативних YAML-маніфестах:
[ Ingress (Точка входу) ] ──► [ Service (Стабільний DNS / IP) ] ──► [ Deployment (ReplicaSet) ] ──► [ Pods (Контейнери) ]
- Pod (Под): Неподільна одиниця розгортання, що складається з одного чи декількох тісно пов’язаних контейнерів, які ділять спільну мережу (
localhost) та дискові томи (Volumes). - Deployment: Декларативний опис бажаного стану подів (кількість реплік, стратегія оновлення
RollingUpdate, ліміти ресурсів CPU/RAM). - Service (ClusterIP, NodePort, LoadBalancer): Мережева абстракція, що надає стабільну віртуальну IP-адресу та ім’я DNS для динамічної групи подів.
- Ingress / Gateway API: Маршрутизатор вхідного HTTP(S)-трафіку на внутрішні сервіси кластера.
2. Маніфест промислового Deployment у K8s
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
labels:
app: order-service
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # Створити максимум 1 додатковий под під час оновлення
maxUnavailable: 0 # Жоден под не повинен бути недоступним під час релізу
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order-service
image: registry.example.com/order-service:2.1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: 1000m
memory: 1024Mi
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 15
periodSeconds: 5
🔴 Senior Level
1. Екосистема оркестрації сучасного Enterprise
У промисловому середовищі “голий” Kubernetes практично не експлуатується. Навколо нього розгортається стек спеціалізованих інструментів:
[Git-репозиторій із маніфестами]
│
▼ (Pull-модель: безперервна звірка)
[ArgoCD / Flux (GitOps)] ──► Застосування у [Kubernetes Cluster]
│
├── Керування пакетами: [Helm / Kustomize]
├── Керування мережею/mTLS: [Istio / Linkerd Service Mesh]
├── Зберігання секретів: [HashiCorp Vault / External Secrets]
└── Автомасштабування: [HPA v2 / KEDA]
- Пакетні менеджери (Helm vs Kustomize):
- Helm: Шаблонізація за допомогою рушія Go templates та параметризація через
values.yaml. Оптимальний для пакування сторонніх платформних компонентів (Kafka, Redis, Postgres). - Kustomize: Декларативне накладання оверлеїв (Overlays) без шаблонів: базова конфігурація (
base) модифікується під різні середовища (dev,stage,prod).
- Helm: Шаблонізація за допомогою рушія Go templates та параметризація через
- GitOps (ArgoCD / Flux):
- Єдиним джерелом правди (Single Source of Truth) для кластера є Git-репозиторій.
- Прямий запуск
kubectl applyз локальних комп’ютерів розробників категорично заборонений. - Агент ArgoCD періодично опитує Git та автоматично усуває будь-яку розбіжність конфігурацій (Self-Healing & Drift Detection).
2. Service Mesh: Інтелектуальна мережева оркестрація (Istio / Envoy)
Коли оркестратор координує тисячі подів, керування мережевою топологією делегується у Service Mesh:
- Canary Deployments (Канарейкові релізи): Маршрутизація 5% користувацького трафіку на нову версію
v2та 95% на стабільнуv1через конфігураціюVirtualService. - Zero-Trust mTLS: Автоматичне взаємне шифрування міжконтейнерного трафіку без внесення змін у Java-код сервісів.
- Fault Injection: Штучне тестування стійкості: симуляція через Envoy 10% відповідей із затримкою 5 секунд або аварійним кодом HTTP 503.
4 Tricky Questions
1. У чому різниця між K8s Deployment та StatefulSet, і чому бази даних (PostgreSQL, Kafka) не можна розгортати через звичайний Deployment?
Відповідь:
- Deployment спроєктований для Stateless-застосунків: поди повністю взаємозамінні, отримують випадкові суфікси в іменах (
order-service-7f4c9b9-x8j2k) та випадкові IP. Під час перезапуску под може піднятися на будь-якому іншому вузлі та втратити доступ до локального сховища. - StatefulSet призначений для Stateful-навантажень (СУБД, кластери брокерів):
- Поди отримують суворо детерміновані порядкові імена:
postgres-0,postgres-1,postgres-2. - Кожен под закріплюється за власним дисковим томом через
volumeClaimTemplates(PersistentVolumeClaim). Після перезапуску под гарантовано підключається до своїх збережених даних. - Поди стартують і зупиняються суворо по черзі (0 $\to$ 1 $\to$ 2), що критично для формування кворуму кластера (Raft/Zookeeper/Patroni).
- Поди отримують суворо детерміновані порядкові імена:
2. Навіщо потрібні PodDisruptionBudget (PDB) та TopologySpreadConstraints під час планового оновлення робочих вузлів кластера?
Відповідь:
Коли інженери оновлюють ядро ОС чи версію K8s на робочих нодах (kubectl drain node):
- PodDisruptionBudget (PDB): Фіксує жорсткий інваріант доступності застосунку (наприклад,
minAvailable: 2). Kubernetes відмовиться виводити ноду на обслуговування доти, доки на інших вузлах не піднімуться і не стануть готовими (Ready) щонайменше 2 репліки пода. Це запобігає каскадній недоступності. - TopologySpreadConstraints: Примусово рівномірно розподіляє поди застосунку між різними фізичними зонами доступності (AWS Availability Zones:
az-a,az-b,az-c) чи серверними стійками. Якщо дата-центр у зоніaz-aбуде знеструмлено, кластер продовжить обслуговувати трафік.
3. У яких сценаріях HashiCorp Nomad є більш виправданим вибором, ніж Kubernetes?
Відповідь:
- Невелика команда та обмеженість DevOps-ресурсів: Nomad поставляється як один легковажний бінарний файл (Zero-Dependency), що споживає лічені мегабайти оперативної пам’яті, тоді як K8s вимагає складного Control Plane, etcd та високої експертизи супроводу.
- Гетерогенні навантаження (Non-Container Workloads): Nomad з коробки запускає не лише Docker-контейнери, а й класичні Java JAR (
javaдрайвер), сирі бінарні файли Go/C++ (execдрайвер) та віртуальні машини QEMU. - Глибока інтеграція в екосистему HashiCorp: безшовне поєднання з Consul (Service Discovery/Mesh) та Vault (Secrets Management).
4. Що таке «Configuration Drift» у GitOps і як ArgoCD запобігає саботажу інфраструктури?
Відповідь:
Configuration Drift виникає, коли хтось із інженерів вручну виконує в кластері команду на кшталт kubectl scale deployment order-service --replicas=10 або змінює змінні оточення в обхід репозиторію Git.
У традиційному CI/CD така несанкціонована зміна може залишатися непоміченою місяцями.
У GitOps (ArgoCD) фоновий агент безперервно звіряє бажаний стан (Desired State у Git) із фактичним станом (Actual State у кластері K8s). При виявленні розбіжності ArgoCD негайно виставляє статус OutOfSync і, за наявності прапорця Self-Healing, автоматично перезаписує ручні правки декларативними маніфестами з Git, повертаючи кластер до узгодженого стану.
🎯 Шпаргалка для інтерв’ю
Головне:
- Оркестрація — автоматизоване керування життєвим циклом розподілених контейнерів (деплой, скейлінг, перевірка здоров’я, балансування трафіку).
- Kubernetes (K8s) — де-факто промисловий стандарт для Production.
- Docker Compose — інструмент виключно для локальної розробки, але не для продакшену.
- Ключові об’єкти K8s:
Pod,Deployment(Stateless),StatefulSet(Stateful / бази даних),Service(мережа),Ingress(точка входу). - Helm (пакетний менеджер із шаблонами) та Kustomize (оверлеї без шаблонів) — стандарт керування маніфестами.
- GitOps (ArgoCD / Flux): Єдине джерело правди — Git. Усі зміни застосовуються виключно через автоматичну синхронізацію.
- Service Mesh (Istio / Linkerd): Додає розумну маршрутизацію (Canary), mTLS та спостережуваність на рівні sidecar-проксі Envoy.
Червоні прапорці (Чого говорити НЕ МОЖНА):
- ❌ «Ми використовуємо Docker Compose для оркестрації мікросервісів у продакшені на 10 серверах» (Docker Compose не вміє балансувати між нодами кластера та відновлювати вузли після падіння).
- ❌ «Бази даних розгортаються в Kubernetes через звичайний Deployment» (СУБД вимагають StatefulSet із гарантією збереження імен і прив’язки томів).
- ❌ «Розробники деплоять код у Kubernetes командою
kubectl applyзі свого ноутбука» (Порушує аудит і безпеку; деплой має відбуватися виключно через GitOps / ArgoCD).