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

    Для производственных сред рекомендуется развертывать систему 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 anti-affinity, чтобы обеспечить распределение реплик по разным узлам. По умолчанию используется preferredDuringSchedulingIgnoredDuringExecution с весом 100, что означает, что планировщик будет стараться размещать поды на разных узлах, но при отсутствии других вариантов может разместить их на одном узле.

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

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

    Настройка правил 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

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

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