高可用部署
对于生产环境,建议以高可用(HA)配置方式部署 Connectors 系统,以确保服务的连续性和容错能力。
关键步骤概览
配置高可用 Connector 包含三个步骤:
- 设置副本数 ≥ 2 — 在每个 Connectors 组件的
spec.workloads[].replicas 中指定副本数。至少需要配置 ConnectorsCore(api、controller-manager、proxy)及您使用的任何插件组件。
- 依赖内置的反亲和性 — 系统会自动添加
preferredDuringSchedulingIgnoredDuringExecution 的 Pod 反亲和规则,使副本分布在不同节点,无需额外配置。
- 自定义多可用区集群的亲和性(可选) — 如有需要,可通过覆盖
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 反亲和规则,确保副本分布在不同节点。默认情况下,系统使用权重为 100 的 preferredDuringSchedulingIgnoredDuringExecution,这意味着调度器会尽量将 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 严格分布在不同可用区(硬性要求)
- 同一区域内优先调度到不同节点(软性要求)
- 提供针对可用区和节点级别故障的弹性保障