Заметка

Multi-cluster ArgoCD: hub-and-spoke против per-cluster и где обоим нужен pull-mode

Hub-and-spoke — дефолт, но ломается о blast radius, inbound-сеть и compliance. Когда выбирать per-cluster local, когда — pull-mode, и как выглядит гибрид без идеологии.

Один центральный кластер держит kubeconfig'и остальных и пушит desired state. Работает, пока кластеров три и они в одной сети. На масштабе банка, страховой или edge-флота этот паттерн ломается в трёх местах сразу.

Где ломается hub-and-spoke

Blast radius. Hub держит admin-kubeconfig каждого spoke. Компрометация одного компонента управляющего кластера — это компрометация всего флота, не «инцидент в одном environment». Token rotation помогает мало: пока токен живой, у hub'а полный доступ к prod.

Сетевая модель. Hub нужен прямой inbound к API server каждого spoke. На AWS это межрегиональные security group'ы и пиринги; на edge-инфраструктуре, где spoke сидит за NAT, это не работает без VPN или туннеля.

Compliance. Регулируемые отрасли запрещают inbound в production-кластер из любой внешней сети — а hub в этой картине внешний. Требование аудитора, не ограничение архитектуры; hub-and-spoke этот барьер не обходит.

К этому добавляется операционный потолок: один application-controller-под упирается в CPU и память на 5000+ Applications. ArgoCD v3 (начало 2026) даёт horizontal scaling controller'а, до этого приходится шардировать через ARGOCD_CONTROLLER_REPLICAS с round-robin по cluster ID. На пятидесяти spoke с сотнями Applications в каждом без sharding'а control plane становится bottleneck.

Per-cluster local

Каждый кластер запускает собственный ArgoCD, который смотрит только на свой subset gitops-репозитория. Blast radius при компрометации — один кластер. Сетевая модель тривиальная: ArgoCD ↔ K8s API всегда локально, через https://kubernetes.default.svc. Sharding не нужен, потому что 5000 Applications не оказываются на одном controller'е — они физически разнесены по кластерам.

Цена — отсутствие единого pane-of-glass и N инстансов, которые нужно обновлять синхронно. UI ArgoCD показывает только локальный кластер; on-call с тремя продами держит три вкладки. ApplicationSet matrix-generator работает локально, но только с двумя child-генераторами одновременно — больше не поддерживается. Локальный кластер при этом нужно перерегистрировать через явный cluster-Secret с уникальным именем, потому что дефолтное in-cluster ломает matching по {{name}}.

Per-cluster local выигрывает там, где compliance запрещает централизацию, где сеть spoke'а недоверенная, и где fleet'у в принципе не нужна централизованная audit-консоль.

Pull-mode: третий вариант

Sveltos Addon Controller в pull-mode (с v1.0.0, стабилизация в v1.4.0) переворачивает направление: spoke сам инициирует outbound к hub и подтягивает desired state. Hub при этом не держит admin-токены spoke'ов — он держит SA-токены, которыми spoke ходит к нему read-only за собственным конфигом. Компрометация hub'а становится компрометацией read-only API, а не админского доступа к флоту.

Use cases — регулируемые отрасли (банки, healthcare), edge и IoT (POS-системы, factory floors, корабли с intermittent connectivity), air-gapped окружения (только outbound), multi-cloud с единой моделью GitOps поверх AWS/GCP/Azure/on-prem. Argo CD core движется в ту же сторону через argocd-agent (KubeCon EU 2025) и Akuity Platform, но Sveltos pull-mode на начало 2026 — самая зрелая production-implementation.

Когда какой паттерн

Per-cluster local — air-gapped, edge, compliance-restricted spokes, отсутствие сетевой связности между кластерами. Хороший дефолт для команды, которой не нужен единый dashboard.

Hub-and-spoke — централизованный governance, fleet до десятка кластеров в одной сети, команда выигрывает от единого UI. Готовьте sharding controller'а заранее, если суммарно идёт к 1000+ Applications.

Pull-mode — всё, где hub-and-spoke ломается о compliance или сетевую модель, а per-cluster local не подходит из-за требования к централизованному control plane.

Гибрид жизнеспособен: ArgoCD hub-and-spoke для app delivery в trusted-сегменте, Sveltos pull-mode для compliance-restricted сегмента. Не стартовая архитектура — итог эволюции, когда часть кластеров уезжает в edge или в регулируемый периметр.

Отдельный случай — managed Argo CD на EKS Capabilities. AWS управляет installation, upgrades и HA; цена — Argo живёт снаружи кластера, https://kubernetes.default.svc как destination не работает, EKS нужно регистрировать как remote target. Identity Center обязателен. Это hub-and-spoke с zero ops на самом hub'е, но с теми же compliance-ограничениями, что у self-hosted hub.