高可用部署

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

关键步骤概览

配置高可用 Connector 需要三个步骤:

  1. 设置 replicas ≥ 2 — 在每个 Connectors Component 上指定 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 server、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

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

没有 Workloads 的组件

其他 connector 组件不包含 Deployment 类型的 workloads,因此不需要配置副本数。

内置 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:
            # Hard requirement: pods must be distributed across different zones
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  control-plane: api
                  app.kubernetes.io/name: connectors
              topologyKey: topology.kubernetes.io/zone
            # Soft requirement: prefer distributing pods across different nodes within the same zone
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    control-plane: api
                    app.kubernetes.io/name: connectors
                topologyKey: kubernetes.io/hostname

此配置可确保:

  • Pod 严格分布在不同的可用区中(硬性要求)
  • 在同一可用区内,Pod 优先调度到不同节点上(软性要求)
  • 同时具备针对可用区级和节点级故障的高可靠性