Karmada перешёл в статус graduated — высший уровень зрелости в CNCF. Формально это случилось 3 сентября 2026, публично объявили 8 сентября на KubeCon в Китае.

Повод разобраться, что это за инструмент, потому что задача, которую он решает, возникает у всех, кто дорос до второго кластера, а вариантов решения немного.

Факты — из анонса CNCF , документации и репозитория проекта . Разбор мой.

Какую задачу решает

У вас несколько кластеров: разные регионы, разные облака, отдельный кластер под GPU. Приложение нужно раскатать в несколько из них, пережить отказ любого и не дублировать при этом манифесты.

Karmada добавляет к стандартному Kubernetes API централизованное размещение, распространение, аварийное переключение и мультикластерное автомасштабирование — причём без изменения самих приложений.

Последнее и есть главная идея дизайна, и её стоит подчеркнуть.

Ключевое решение: приложение остаётся обычным

Ваш Deployment остаётся ровно тем же Deployment, каким был:

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
Нажмите, чтобы развернуть и увидеть больше

Ничего мультикластерного в нём нет. Всё, что касается распределения по кластерам, живёт в отдельном объекте:

YAML
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: nginx-propagation
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
  placement:
    clusterAffinity:
      clusterNames:
        - member1
        - member2
    replicaScheduling:
      replicaDivisionPreference: Weighted
      replicaSchedulingType: Divided
      weightPreference:
        staticWeightList:
          - targetCluster:
              clusterNames:
                - member1
            weight: 1
          - targetCluster:
              clusterNames:
                - member2
            weight: 1
Нажмите, чтобы развернуть и увидеть больше

Читается просто: взять Deployment по имени nginx, разложить по кластерам member1 и member2, реплики разделить между ними (Divided) в пропорции весов.

Почему это важно: разделение манифеста приложения и политики размещения означает, что разработчик не обязан знать про мультикластерность. Он пишет обычный манифест, а платформенная команда отдельно описывает, куда это едет. Тот же принцип разделения ответственности, что и у NetworkPolicy или ResourceQuota.

Есть и второй тип политики — OverridePolicy, позволяющий менять отдельные поля для конкретных кластеров: другой реестр образов, другие переменные окружения, другое число реплик.

Как это работает внутри

Цепочка от политики до пода в целевом кластере:

  flowchart LR
    RT["Deployment<br/>+ PropagationPolicy"] --> PC["Policy controller"]
    PC --> RB["ResourceBinding"]
    RB --> BC["Binding controller"]
    BC --> W["Work<br/>(по объекту на кластер)"]
    W --> EC["Execution controller"]
    EC --> M1[("member1")]
    EC --> M2[("member2")]

Компоненты управляющего слоя:

Контроллеров четыре, и по их именам легко читается вся логика:

  1. Cluster controller — подключает кластеры Kubernetes к Karmada и ведёт их жизненный цикл.
  2. Policy controller — следит за PropagationPolicy и создаёт ResourceBinding для каждого подходящего ресурса.
  3. Binding controller — следит за ResourceBinding и создаёт объект Work для каждого кластера.
  4. Execution controller — следит за Work и раскладывает ресурсы по кластерам-участникам.

Красота здесь в том, что вся схема — это обычные контроллеры Kubernetes, работающие по привычному циклу согласования. Никакой отдельной «магии оркестрации»: та же модель, только уровнем выше.

Push и pull

Подключить кластер можно двумя способами:

Для парка из площадок с разной сетевой доступностью это принципиальная развилка: pull-режим позволяет держать в общем парке кластеры, до которых центр «не дотягивается».

Кто и зачем это использует

Цифры из анонса CNCF:

Первый коммитноябрь 2020
Sandbox → Incubating → Graduatedсентябрь 2021 → декабрь 2023 → сентябрь 2026
Контрибьюторов1214+ из 292 организаций
Звёзд на GitHub5600+

Среди пользователей — Bloomberg (автоматизация аварийного восстановления и утилизация ресурсов), Trip.com (объединение ресурсов нескольких кластеров, переключение при отказе, миграция нагрузок), Wellhub, DaoCloud (мультиоблако и мультикластерный инференс), Alibaba Cloud, Huawei, Bilibili, Kuaishou, SenseTime, vivo, ZTO.

Сценарии повторяются: аварийное восстановление, региональная устойчивость, объединение мощностей и всё чаще — инфраструктура для AI.

Что означает graduated

Не маркетинговый ярлык, а набор конкретных требований:

Для тех, кто выбирает инструмент в долгую, это и есть содержательная разница между incubating и graduated: вендоронейтральное управление и проверенная безопасность.

Куда движется

В версии 1.19 появилось планирование многокомпонентных задач для распределённого обучения, а приоритетное планирование доведено до беты и включено по умолчанию.

Дорожная карта 2026 показывает общий вектор — от простого «разложить нагрузку по кластерам» к управлению ресурсами всего парка:

Последний пункт объясняет всплеск интереса. Когда ускорители дороги и дефицитны, а обучение идёт на нескольких площадках, вопрос «в каком кластере сейчас есть свободные GPU» становится главным — и решать его вручную невозможно.

Когда всё это вам не нужно

Честная часть, потому что мультикластерная оркестрация — тяжёлая машинерия со своей ценой.

Не нужно, если:

Нужно, когда кластер целиком становится доменом отказа: регион лёг, облако недоступно, мощности одной площадки исчерпаны, а нагрузку надо разложить по парку GPU-кластеров. Вот тогда альтернатива Karmada — самописные скрипты поверх нескольких kubeconfig, и она заметно хуже.

Итог

Karmada решает реальную задачу и делает это, не заставляя переписывать приложения: манифест остаётся стандартным, мультикластерность выносится в отдельную политику. Статус graduated добавляет к этому аудит безопасности и нейтральное управление.

Вопрос, который стоит задать себе перед внедрением, простой: отказ целого кластера входит в вашу модель угроз? Если нет — вам пока рано, и это нормально.

Авторские права

Автор: Vasiliy Koshkin

Ссылка: https://notes.melancholic.tech/posts/karmada-multicluster-kubernetes/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша