高可用部署
对于生产环境,建议以高可用(HA)配置部署 Connectors 系统,以确保服务连续性和容错能力。
关键步骤概览
配置高可用 Connector 需要三个步骤:
- 设置 replicas ≥ 2 — 在每个 Connectors Component 上指定
spec.workloads[].replicas。至少为 ConnectorsCore(api、controller-manager、proxy)以及你使用的任何插件组件进行配置。
- 依赖内置反亲和性 — 系统会自动添加
preferredDuringSchedulingIgnoredDuringExecution 的 Pod 反亲和性规则,使从节点分布到不同节点上,无需额外配置。
- 为多可用区集群自定义亲和性(可选) — 如有需要,可覆盖
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 反亲和性规则,以确保副本分布在不同节点上。默认情况下,系统使用权重为 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:
# 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 优先调度到不同节点上(软性要求)
- 同时具备针对可用区级和节点级故障的高可靠性