Ответ
Для деплоя на несколько кластеров Kubernetes мы используем GitOps-подход с инструментами вроде ArgoCD или FluxCD. Это позволяет централизованно управлять состоянием всех кластеров из одного Git-репозитория.
Пример с ArgoCD и ApplicationSet:
- Устанавливаем ArgoCD в каждый целевой кластер (или используем центральный сервер с доступом к ним).
- В Git-репозитории храним манифесты приложения (например, Helm-чарт или raw YAML).
- Создаем
ApplicationSet, который автоматически создает приложение (Application) в каждом кластере, соответствующем селектору.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-app-multicluster
spec:
generators:
- clusters: # Генератор, перебирающий все зарегистрированные кластеры
selector:
matchLabels:
environment: production # Или пустой селектор {} для всех кластеров
template:
metadata:
name: '{{name}}-{{cluster.name}}'
spec:
project: default
source:
repoURL: 'https://github.com/my-org/app-manifests.git'
targetRevision: main
path: ./k8s/overlays/prod
destination:
server: '{{cluster.server}}' # Сервер API каждого кластера подставляется автоматически
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
Ключевые моменты:
- Единственный источник истины: Состояние всех кластеров определяется содержимым Git-репозитория.
- Автоматическая синхронизация: ArgoCD постоянно сравнивает желаемое состояние (Git) с фактическим (кластер) и вносит исправления.
- Безопасность: Доступ к кластерам настраивается через сертификаты и контексты kubeconfig в ArgoCD.
- Альтернативы: Для более простых сценариев можно использовать скрипты с
kubectl --context=<cluster-name> apply -f ...или инструменты вроде Rancher Fleet.