Блог¶
Ласкаво просимо до мого блогу! Тут ви знайдете статті про DevOps, AWS, хмарну архітектуру та багато іншого.
Останні пости¶
OCI Distribution Spec: пишемо свій Docker Registry¶
18 липня 2026 - Docker Registry - це просто HTTP-сервер із конкретним набором endpoints: Meadow реалізує OCI Distribution Spec за 370 рядків одним /v2/-хендлером, що маршрутизує за шляхом. Blob upload із перевіркою digest після запису (не збігся → видалення і помилка), manifest push/pull за тегом і digest, перелічений формат помилок OCI (BLOB_UNKNOWN, MANIFEST_UNKNOWN, DIGEST_INVALID), який клієнти парсять за кодом, а не повідомленням, і чому маршрутизація через LastIndex виживає з іменами репо зі слешами. Де ламається: monolithic-only upload тримає весь blob у пам'яті, немає chunked PATCH, немає пагінації. Порівняння з ширшою екосистемою: /v2/ як хендшейк v1→v2, що пережив Registry v1, специфікація, витягнута з Docker HTTP API v2, 202 Accepted у значенні "продовжуй", розподіл transport-vs-image-spec, який дозволяє тому самому API возити Helm-чарти й SBOM'и (OCI artifacts / ORAS), cross-repository blob mount, і чому продакшн пінить за digest, а не за тегом. Двадцять перша частина серії Sheep & Shepherd.
Event System: audit trail для кластера¶
15 липня 2026 - Коли щось відбувається в кластері, потрібно знати що, коли і чому. Як Event system Shepherd-а записує Normal і Warning події від API Server, Scheduler, NodeController і ReplicationController — з ключем із nanosecond timestamp для безкоштовного хронологічного порядку в BoltDB. Чому events прив'язані до об'єктів (pod/web-0), а не до процесів, і чим це відрізняється від stdout-логів. Порівняння зі справжнім Kubernetes: TTL 1 година й агрегація з count, окремий Audit Logging для безпеки, involvedObject і kubectl describe, міграція на events.k8s.io/v1, і чому Events — це сповіщення, а не Event Sourcing. Фінальна частина серії Orchestrator. Двадцята частина серії Sheep & Shepherd.
Pod Lifecycle: від Pending до Running¶
11 липня 2026 - Повний асинхронний шлях поду від sheepctl apply до Running — через API Server, Scheduler, Agent і runtime, де жоден компонент ніколи не чекає на інший. Чому той самий Pending означає "чекає на Scheduler" без NodeName і "чекає на Agent" — з ним, як eventual consistency (та сама модель, що й у git) робить латентність у 5–15 секунд прогнозованою сумою незалежних ticker-ів, а не багом, чому перехід Running → Failed односторонній, і як health-check loop переводить под у Failed, коли контейнер зупиняється. Порівняння зі справжнім Kubernetes: phase як навмисно груба абстракція проти справжньої деталізації в conditions, фаза Pulling, де поди зависають на повільному registry, initContainers, RestartPolicy і CrashLoopBackOff, terminationGracePeriodSeconds, і чому readiness/liveness probes — це те, чого бракує. Дев'ятнадцята частина серії Sheep & Shepherd.
Node Agent: kubelet¶
8 липня 2026 - Agent — це kubelet Shepherd-а: реєстрація з retry, heartbeats кожні 10 секунд, reconciliation подів кожні 3 секунди і запуск контейнерів для призначених подів. Структура, детекція ресурсів з /proc/meminfo, reconcile loop, що переводить Pending у Running, і чому окремий IP на контейнер у Shepherd — спрощення порівняно зі спільним network namespace у Kubernetes. Порівняння зі справжнім Kubernetes: CRI замість прямих викликів runtime, pause infra container, syncLoop і PLEG, static pods, TLS bootstrap і чому 110 max-pods — це навантаження на control plane. Вісімнадцята частина серії Sheep & Shepherd.
Node Health: heartbeat і failure detection¶
4 липня 2026 - Як control plane знає, що нода жива? Через heartbeats — агент шле його кожні 10 секунд, і якщо 30 секунд тиша, NodeController переводить ноду в NotReady, а scheduler перестає ставити на неї поди. Дві сторони механізму (агент, що пише "я живий", і окремий контролер, що вирішує "ти мертвий"), чому heartbeat — це не перевірка живості, а домовленість про timeout, проблема split-brain, коли губиться лише heartbeat, і пастки clock skew та last-write-wins. Порівняння зі справжнім Kubernetes: об'єкт Lease, що замінив переписування повного статусу, taint-based виселення з обмеженням швидкості, і як Φ Accrual detector та SWIM gossip виходять за межі єдиного захардкодженого timeout. За зразком heartbeat-ів нод Kubernetes. Сімнадцята частина серії Sheep & Shepherd.
Service Discovery: як Service знаходить Pods¶
1 липня 2026 - Поди приходять і йдуть, їхні IP змінюються при кожному рестарті — а Service є стабільною точкою входу, яка завжди знає, де потрібні поди. Як ServiceController кожні 5 секунд перебудовує список endpoints через label selectors, чому под має збігтися лейблами, бути Running і мати IP, щоб потрапити в список, і чому Service — це насправді просто запис у базі, який хтось перераховує, а не проксі. Порівняння зі справжнім Kubernetes: ClusterIP як віртуальний IP, якого немає на жодному інтерфейсі, режими iptables/IPVS у kube-proxy, EndpointSlice, headless-сервіси та альтернатива на eBPF (Cilium). За зразком Kubernetes Services. Шістнадцята частина серії Sheep & Shepherd.
Replication Controller: scale up і scale down¶
27 червня 2026 - Deployment каже "хочу 3 репліки" — як ReplicationController це забезпечує. Створення подів з template, слабкий зв'язок через label-selector app=web замість списку власних подів, scale up і scale down, оновлення ReadyReplicas і весь асинхронний шлях від sheepctl до запущеного контейнера. Чому індексні імена (web-0) і перетин селекторів кусаються, і де тут місце kubectl scale, HorizontalPodAutoscaler та scale-to-zero. За зразком Kubernetes ReplicaSet. П'ятнадцята частина серії Sheep & Shepherd.
Reconciliation Loop: серце Shepherd¶
24 червня 2026 - Reconciliation loop — серце будь-якого оркестратора: ти описуєш бажаний стан, а контролери постійно звіряють його з реальним і виправляють різницю. Паттерн observe-compare-act, чому він робить систему самовідновлюваною, три контролери, що працюють паралельно в Shepherd, ідемпотентність як вимога виживання і чому level-triggered кращий за edge-triggered. За зразком контролерів Kubernetes. Чотирнадцята частина серії Sheep & Shepherd.
Scheduler: як вибрати ноду для поду¶
20 червня 2026 - Свіжостворений под — Pending і без ноди. Як шедулер Shepherd вибирає найкращу ноду у дві фази: filter (відсіяти непридатні) і score (віддати перевагу найменш завантаженій). Перевірка ресурсів, збіг лейблів, скоринг least-loaded і чому под лишається Pending навіть після планування. За зразком шедулера Kubernetes. Тринадцята частина серії Sheep & Shepherd.
BoltDB замість etcd: embedded state store¶
17 червня 2026 - Kubernetes тримається на etcd, але для навчального проекту це overkill. Як Shepherd зберігає весь стан кластера в BoltDB — вбудованому key-value сховищі в одному файлі. Buckets як таблиці, ключі з namespace, транзакції на читання/запис, watch-канали для сповіщень про зміни і журнал подій. Чому це ідеально для навчання і де воно поступається etcd. Дванадцята частина серії Sheep & Shepherd.
Kubernetes API Server за 300 рядків¶
13 червня 2026 - Kubernetes API Server — центр всього кластера. Як Shepherd реалізує REST API з CRUD для pods, services, deployments та nodes за ~300 рядків Go, використовуючи тільки net/http. Асинхронне планування, namespaced ресурси та logging middleware. Одинадцята частина серії Sheep & Shepherd.
Docker CLI за 500 рядків Go¶
10 червня 2026 - Subcommand routing, flag parsing і форматований вивід — все без CLI-фреймворків. Як Sheep реалізує run, ps, stop, rm та ще 11 Docker-подібних команд в одному файлі тільки на стандартній бібліотеці Go. Десята частина серії Sheep & Shepherd.
Container Lifecycle: state machine від Created до Removed¶
7 червня 2026 - Контейнер проходить три стани — created, running, stopped. Як state machine керує Create/Start/Stop/Remove, чому кожен перехід зберігається в state.json, і як signal 0 перевіряє, чи пережив контейнер рестарт демона. Дев'ята частина серії Sheep & Shepherd.
Image Management: tar-архів → rootfs → контейнер¶
2 червня 2026 - Образ контейнера — це по суті архів із файловою системою. Як tar-архів перетворюється на rootfs через import і bootstrap, як OCI whiteout-файли видаляють файли між шарами, і чому Sheep зберігає повний rootfs замість шарів. Восьма частина серії Sheep & Shepherd.
NAT і iptables: як контейнер бачить інтернет¶
30 травня 2026 - Адреса контейнера 10.20.0.x приватна — її не маршрутизує жоден роутер. Як ip_forward і одне правило MASQUERADE дають пакетам вийти в інтернет і повернутися назад через conntrack. Сьома частина серії Sheep & Shepherd.
Bridge Networking: даємо контейнеру IP-адресу¶
25 травня 2026 - Контейнер у новому network namespace не має мережі — навіть loopback не піднятий. Як Linux bridge, veth пари і трохи NAT дають йому IP і маршрут в інтернет. Шоста частина серії Sheep & Shepherd.
OverlayFS: copy-on-write шари як у Docker¶
20 травня 2026 - Як OverlayFS складає read-only шар образу і per-container read-write шар в одну файлову систему — і чому copy-up дозволяє 10 контейнерам nginx ділити 100MB замість того, щоб кожен тягнув свою копію. П'ята частина серії Sheep & Shepherd.
Cgroups v2: обмежуємо пам'ять, CPU та PIDs¶
15 травня 2026 - Namespace'и ізолюють, але не обмежують. Як memory.max, cpu.max і pids.max накладають ліміти на ресурси контейнера через віртуальну файлову систему cgroups v2 — четверта частина серії Sheep & Shepherd.
pivot_root: як контейнер отримує свою файлову систему¶
9 травня 2026 - Як pivot_root(2) міняє кореневу директорію процесу на рівні mount namespace — і чому це правильний примітив ізоляції замість chroot. Третя частина серії Sheep & Shepherd.
Re-Exec Pattern: чому Go і clone() не дружать¶
2 травня 2026 - Go threading model конфліктує з clone(). Self re-exec вирішує проблему — друга частина серії Sheep & Shepherd.
Linux Namespaces: ізолюємо процес за 50 рядків Go¶
28 квітня 2026 - Контейнер — це процес з обмеженим видом на систему. Як ізолювати процес за допомогою Linux namespaces за 50 рядків Go — перша частина серії Sheep & Shepherd.
AI-суверенітет: своя модель на DGX Spark замість API¶
18 квітня 2026 - Як я перестав платити OpenAI і переніс інференс на власну коробку DGX Spark з vLLM. Про залізо, проблеми з CUDA/PyTorch, порівняння з Ollama і простий веб-інтерфейс для керування.
EMM: трейси LangGraph у Phoenix¶
11 квітня 2026 - Один виклик при старті покриває 15 LangGraph-агентів. Ручні span-и розширюють покриття на voice (Gemini Live tools), avatar (Runway сесії) та Izabella chat (OpenAI/Ollama/Google + MCP tool loop).
A2A Inspector у моєму application і MCP до нього¶
8 квітня 2026 - Вбудований UI плюс MCP-сервер: перегляд Agent Card, tasks/submit і tasks/status з IDE без виходу з монорепи.
EMM A2A Phase 4: Auth, Rate Limiting, Observability¶
4 квітня 2026 - X-API-Key, rate limiting, структуроване логування. A2A endpoints тепер захищені як інші API.
AI Reliability Engineering — сертифікація від fwdays¶
31 березня 2026 - Завершив курс AI Reliability Engineering від fwdays. Чому надійність AI-систем для мене в одному ряду з класичним SRE.
EMM A2A Phase 3: Stream task status¶
28 березня 2026 - SSE замість polling. GET /api/a2a/tasks/{id}/stream. Теорія, схеми, capabilities.streaming.
EMM A2A Phase 2+: TaskStore і tasks/status¶
21 березня 2026 - Task lifecycle в A2A: submit → taskId → poll status. InMemoryTaskStore, TTL 1 год. Схеми.
Технологічні ризики у production: як не програти, коли проект застаріє¶
14 березня 2026 - PostgreSQL, MinIO, lakeFS: коли вибираєш технології для production, думай не тільки про features — що буде через 5 років?
EMM A2A Phase 2: Task Manager (list_board)¶
14 березня 2026 - Другий skill — list_board. Маршрутизація по skillId, схеми взаємодії, що змінилось.
EMM A2A Phase 1: Process Manager як A2A сервер¶
7 березня 2026 - Process Manager — перший агент з A2A інтерфейсом. Теорія протоколу, діаграми взаємодії, що реалізовано.
Як я став AWS Community Builder¶
5 березня 2026 - Кілька років тому це був звичайний DevOps — деплої, скрипти. Потім почав думати кластерами замість серверів. Ось як це привело до AWS Community Builders.
Розробка та тестування AI-агентів: від LangGraph до production¶
12 лютого 2026 - Як писати, тестувати і дебажити LangGraph агентів? Які patterns працюють для StateGraph? Чому pytest fixtures критичні? Розповідаю про development workflow від першого коду до production deployment.
Версіонування даних в AI-агентах: практичний досвід з lakeFS¶
8 лютого 2026 - Коли AI-агенти починають класифікувати і переміщувати твої файли, питання 'а як відкотити назад?' стає дуже практичним. Розповідаю про інтеграцію lakeFS - системи версіонування для об'єктного сховища.
Kubernetes deployment для AI-агентів: практичний досвід з LangGraph¶
3 лютого 2026 - Коли AI-агенти переїжджають з локального Docker Compose в Kubernetes, виникають питання про service discovery, кеш-інг, secrets management. Розповідаю як я задеплоїв 7 microservices з мінімальним downtime.
Створення агента - мультисайтового парсера оголошень квартир: Патерни проєктування та архітектура¶
Tarot AI Agent: Інноваційний підхід до оцінки ризиків через штучний інтелект¶
September 11, 2025 - Tarot AI Agent: Інноваційний підхід до оцінки ризиків через штучний інтелект.
Використання AWS ECR як універсального OCI-репозиторію¶
10 липня 2025 - Використання AWS ECR як універсального OCI-репозиторію для зберігання різних типів артефактів.
Використання AWS ECR як універсального OCI-репозиторію (УК)¶
10 липня 2025 - Використання AWS ECR як універсального OCI-репозиторію для зберігання різних типів артефактів (українська версія).
Cert Manager в Kubernetes¶
3 червня 2025 - Налаштування та використання Cert Manager для автоматичного управління SSL сертифікатами в Kubernetes.
Cert Manager в Kubernetes (УК)¶
3 червня 2025 - Налаштування та використання Cert Manager для автоматичного управління SSL сертифікатами в Kubernetes (українська версія).
Нова архітектура для Ізабелли - C4 діаграми¶
14 травня 2025 - Розробка нової архітектури системи з використанням C4 діаграм.
Нова архітектура для Ізабелли - Структура¶
14 травня 2025 - Детальний аналіз структури нової архітектури Ізабелли.
Нова архітектура для Ізабелли¶
10 травня 2025 - Огляд нового дизайну архітектури для проекту Ізабелла.
Waste Resources - Фінансова оптимізація в хмарі¶
14 квітня 2025 - Аналіз та оптимізація витрат на хмарні ресурси.
Redis Backup на AWS S3¶
19 березня 2025 - Автоматизація резервного копіювання Redis на AWS S3.
EMM A2A Phase 1 (EN)¶
March 7, 2026 - Process Manager is the first agent with an A2A interface. Protocol theory, interaction diagrams, what's implemented.
RDS Import з Terraform¶
17 лютого 2025 - Імпорт існуючих RDS інстансів в Terraform.
RDS Import з Terraform (EN)¶
17 лютого 2025 - Імпорт існуючих RDS інстансів в Terraform (англійська версія).
AWS Lambda Cost Optimization¶
26 лютого 2025 - Стратегії оптимізації витрат на AWS Lambda.
Kubernetes Onboarding з Flux¶
10 березня 2025 - Автоматизація онбордингу в Kubernetes з використанням Flux.
RDS Migration Cases¶
9 лютого 2025 - Різні сценарії міграції баз даних на AWS RDS.
SPA Deployment на S3 з CloudFront¶
12 лютого 2025 - Розгортання Single Page Application на AWS S3 з CloudFront.
Karpenter Properties¶
8 грудня 2024 - Властивості та налаштування Karpenter для Kubernetes.
AI Stable Diffusion¶
8 лютого 2025 - Використання Stable Diffusion для генерації зображень.
ARM vs AMD¶
5 грудня 2024 - Порівняння ARM та AMD архітектур для хмарних рішень.
My First Blog Post¶
27 квітня 2024 - Привітання та вступ до блогу.