• Русский
  • Развертывание с высокой доступностью

    Для производственных сред рекомендуется развертывать систему Connectors в конфигурации с высокой доступностью (HA) для обеспечения непрерывности сервиса и отказоустойчивости.

    Краткий обзор ключевых шагов

    Настройка Connector с высокой доступностью включает три шага:

    1. Установить replicas ≥ 2 — Укажите spec.workloads[].replicas для каждого компонента Connectors. Минимально необходимо настроить ConnectorsCore (api, controller-manager, proxy) и любые используемые вами компоненты плагинов.
    2. Использовать встроенную антиаффинность — Система автоматически добавляет правила pod anti-affinity preferredDuringSchedulingIgnoredDuringExecution, чтобы реплики распределялись по узлам без дополнительной настройки.
    3. Настроить affinity для мультизональных кластеров (опционально) — При необходимости переопределите spec.workloads[].template.spec.affinity для обеспечения распределения на уровне зон с помощью requiredDuringSchedulingIgnoredDuringExecution.

    Более подробная информация по каждому шагу приведена ниже.

    Настройка реплик

    Вы можете увеличить количество реплик для каждой нагрузки, чтобы обеспечить высокую доступность. Это делается через поле workloads в спецификации компонента. Для производственных сред рекомендуется настраивать не менее 2 реплик для каждой нагрузки, чтобы обеспечить непрерывность сервиса при сбоях узлов или при обновлениях с перезапуском.

    Ниже приведены конкретные примеры для каждого основного компонента Connector:

    ConnectorsCore

    ConnectorsCore включает три основные нагрузки: API сервер, controller manager и proxy. Для высокой доступности настройте все три с несколькими репликами:

    apiVersion: operator.connectors.alauda.io/v1alpha1
    kind: ConnectorsCore
    metadata:
      name: connectors-core
      namespace: connectors-system
    spec:
      workloads:
      - name: connectors-api
        replicas: 2
      - name: connectors-controller-manager
        replicas: 2
      - name: connectors-proxy
        replicas: 2

    Через некоторое время все поды компонента connectors-core имеют количество реплик 2, за исключением connectors-csi.

    $ kubectl get pod -n connectors-system
    NAME                                             READY   STATUS    RESTARTS   AGE
    connectors-api-58fc8b45c4-9n8hc                  1/1     Running   0          67s
    connectors-api-58fc8b45c4-12da7                  1/1     Running   0          67s
    connectors-controller-manager-548659cdff-1d2dd   1/1     Running   0          35s
    connectors-controller-manager-548659cdff-s7gnn   1/1     Running   0          35s
    connectors-proxy-64bb994cd9-jbp2l                1/1     Running   0          61s
    connectors-proxy-64bb994cd9-dfade                1/1     Running   0          61s

    ConnectorsGit

    ConnectorsGit запускает один плагин для интеграции с Git Server:

    apiVersion: operator.connectors.alauda.io/v1alpha1
    kind: ConnectorsGit
    metadata:
      name: connectors-git
      namespace: connectors-system
    spec:
      workloads:
      - name: connectors-git-plugin
        replicas: 2

    Через некоторое время все поды компонента connectors-git имеют количество реплик 2.

    $ kubectl get pod -n connectors-system
    NAME                                                    READY   STATUS    RESTARTS   AGE
    connectors-git-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s
    connectors-git-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s

    ConnectorsOCI

    ConnectorsOCI запускает один плагин для интеграции с OCI registry:

    apiVersion: operator.connectors.alauda.io/v1alpha1
    kind: ConnectorsOCI
    metadata:
      name: connectors-oci
      namespace: connectors-system
    spec:
      workloads:
      - name: connectors-oci-plugin
        replicas: 2

    Через некоторое время все поды компонента connectors-oci имеют количество реплик 2.

    $ kubectl get pod -n connectors-system
    NAME                                                    READY   STATUS    RESTARTS   AGE
    connectors-oci-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s
    connectors-oci-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s

    ConnectorsMaven

    ConnectorsMaven запускает один плагин для интеграции с Maven registry:

    apiVersion: operator.connectors.alauda.io/v1alpha1
    kind: ConnectorsMaven
    metadata:
      name: connectors-maven
      namespace: connectors-system
    spec:
      workloads:
      - name: connectors-maven-plugin
        replicas: 2

    Через некоторое время все поды компонента connectors-maven имеют количество реплик 2.

    $ kubectl get pod -n connectors-system
    NAME                                                      READY   STATUS    RESTARTS   AGE
    connectors-maven-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s
    connectors-maven-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s

    ConnectorsHarbor

    ConnectorsHarbor запускает один плагин для функций, специфичных для Harbor:

    apiVersion: operator.connectors.alauda.io/v1alpha1
    kind: ConnectorsHarbor
    metadata:
      name: connectors-harbor
      namespace: connectors-system
    spec:
      workloads:
      - name: connectors-harbor-plugin
        replicas: 2

    Через некоторое время все поды компонента connectors-harbor имеют количество реплик 2.

    $ kubectl get pod -n connectors-system
    NAME                                                      READY   STATUS    RESTARTS   AGE
    connectors-harbor-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s
    connectors-harbor-plugin-84985b9d7d-vllp6                  1/1     Running   0          67s

    Компоненты без нагрузок

    Другие компоненты Connector не имеют workloads Deployment и поэтому не требуют настройки реплик.

    Встроенная антиаффинность Pod

    Система включает встроенные правила pod anti-affinity, чтобы обеспечить распределение реплик по разным узлам. По умолчанию используется preferredDuringSchedulingIgnoredDuringExecution с весом 100, что означает, что планировщик будет стараться размещать поды на разных узлах, но при отсутствии других вариантов может разместить их на одном узле.

    Эта конфигурация по умолчанию обеспечивает:

    • Распределение подов по разным узлам, когда это возможно
    • Возможность планирования даже при ограниченном количестве узлов в кластере
    • Автоматический failover при недоступности узла

    Настройка правил affinity

    Если стандартные правила affinity не соответствуют вашим требованиям, вы можете переопределить их через конфигурацию workloads. Поле template.spec.affinity позволяет задать пользовательские правила affinity.

    Для мультизональных кластеров можно настроить зону-ориентированное планирование, чтобы распределять поды по зонам доступности. В следующем примере используется requiredDuringSchedulingIgnoredDuringExecution для жесткого требования распределения по зонам, в сочетании с preferredDuringSchedulingIgnoredDuringExecution для предпочтительного распределения по узлам внутри каждой зоны:

    apiVersion: operator.connectors.alauda.io/v1alpha1
    kind: ConnectorsCore
    metadata:
      name: connectors-core
      namespace: connectors-system
    spec:
      workloads:
      - name: connectors-api
        replicas: 3
        template:
          spec:
            affinity:
              podAntiAffinity:
                # Жесткое требование: поды должны распределяться по разным зонам
                requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchLabels:
                      control-plane: api
                      app.kubernetes.io/name: connectors
                  topologyKey: topology.kubernetes.io/zone
                # Мягкое требование: предпочтительно распределять поды по разным узлам внутри одной зоны
                preferredDuringSchedulingIgnoredDuringExecution:
                - weight: 100
                  podAffinityTerm:
                    labelSelector:
                      matchLabels:
                        control-plane: api
                        app.kubernetes.io/name: connectors
                    topologyKey: kubernetes.io/hostname

    Эта конфигурация обеспечивает:

    • Строгое распределение подов по разным зонам доступности (жесткое требование)
    • Предпочтительное планирование подов на разных узлах внутри одной зоны (мягкое требование)
    • Устойчивость к сбоям как на уровне зон, так и на уровне узлов