高可用部署

对于生产环境,建议以高可用(HA)配置方式部署 Connectors 系统,以确保服务的连续性和容错能力。

关键步骤概览

配置高可用 Connector 包含三个步骤:

  1. 设置副本数 ≥ 2 — 在每个 Connectors 组件的 spec.workloads[].replicas 中指定副本数。至少需要配置 ConnectorsCore(api、controller-manager、proxy)及您使用的任何插件组件。
  2. 依赖内置的反亲和性 — 系统会自动添加 preferredDuringSchedulingIgnoredDuringExecution 的 Pod 反亲和规则,使副本分布在不同节点,无需额外配置。
  3. 自定义多可用区集群的亲和性(可选) — 如有需要,可通过覆盖 spec.workloads[].template.spec.affinity,使用 requiredDuringSchedulingIgnoredDuringExecution 强制实现基于可用区的分布。

以下提供了每个步骤的详细说明。

配置副本数

您可以通过增加每个工作负载的副本数来实现高可用。此配置通过组件 spec 中的 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 组件的所有 Pod 副本数均为 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 组件的所有 Pod 副本数均为 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 组件的所有 Pod 副本数均为 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 组件的所有 Pod 副本数均为 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 组件的所有 Pod 副本数均为 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 组件没有 Deployment 工作负载,因此无需配置副本数。

内置 Pod 反亲和性

系统内置了 Pod 反亲和规则,确保副本分布在不同节点。默认情况下,系统使用权重为 100preferredDuringSchedulingIgnoredDuringExecution,这意味着调度器会尽量将 Pod 安排在不同节点,但如果没有其他选项,也会调度到同一节点。

此默认配置确保:

  • Pod 尽可能分布在不同节点
  • 即使集群节点有限,Deployment 仍可调度
  • 节点不可用时具备自动故障转移能力

自定义亲和规则

如果默认亲和规则无法满足需求,您可以通过 workloads 配置覆盖。template.spec.affinity 字段允许您指定自定义亲和规则。

对于多可用区集群,您可以配置感知可用区的调度,将 Pod 分布在不同可用区。以下示例使用 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:
            # 硬性要求:Pod 必须分布在不同可用区
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  control-plane: api
                  app.kubernetes.io/name: connectors
              topologyKey: topology.kubernetes.io/zone
            # 软性要求:优先将 Pod 分布在同一区域的不同节点
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    control-plane: api
                    app.kubernetes.io/name: connectors
                topologyKey: kubernetes.io/hostname

该配置确保:

  • Pod 严格分布在不同可用区(硬性要求)
  • 同一区域内优先调度到不同节点(软性要求)
  • 提供针对可用区和节点级别故障的弹性保障