Apache Solr Operator 介绍与选型指南

Apache Solr Operator 的定位、三大 CRD 体系(SolrCloud/SolrPrometheusExporter/SolrBackup)与调谐产物、版本线与依赖组件,以及与手工 YAML/Helm 部署方式的选型对比

Apache Solr OperatorSolr OperatorSolrKubernetes2026/10/15

Apache Solr Operator 介绍与选型指南

目标:讲清 Apache Solr Operator 是什么、由哪些 CRD 与依赖组件构成、一个 SolrCloud 声明会被调谐出哪些 Kubernetes 资源、版本线怎么选,以及"是否值得为 Solr 上 Operator"的选型对比。本文结论均已在 Ubuntu 22.04 + Kind(Kubernetes 1.32)环境部署 Solr Operator 0.9.1 并完成 SolrCloud 创建、扩容、Collection 数据读写全流程实测(部署过程见《Ubuntu 22.04 部署 Apache Solr Operator(Kind 集群)安装指南》)。

一、环境信息

本文结论基于以下实测环境:

  • 操作系统:Ubuntu 22.04(x86_64)
  • Kubernetes:Kind v0.25.0 单节点集群,Server Version v1.32.0(containerd 1.7.24)
  • 组件版本:Apache Solr Operator 0.9.1(helm chart 与 app 版本一致,appVersion: v0.9.1)
  • 依赖组件:cert-manager v1.16.2(TLS 证书管理)、ZooKeeper Operator 0.2.15(随 chart 子模块安装)
  • Solr 默认镜像:library/solr:8.11(未显式指定 solrImage 时由 operator 注入的默认版本)
  • Helm:v3.17.1
  • 官方站点:https://solr.apache.org/operator/
  • 源码仓库:https://github.com/apache/solr-operator

二、Apache Solr Operator 是什么

Apache Solr Operator 是 Solr 官方的 Kubernetes Operator:把"运行一套 SolrCloud 集群需要哪些 Kubernetes 资源"沉淀为自定义资源(CRD),用户只写一个声明式 CR,控制器持续调谐(reconcile)出全部底层对象并负责后续运维。

它解决的核心问题——SolrCloud 在 Kubernetes 上的"最后一公里"太厚:原生 StatefulSet 方式需要自己编排 ZooKeeper 连接、头less/common Service、ConfigMap、滚动重启顺序、扩容后的数据再平衡等十几个对象和操作;Operator 把这些全部收敛为 spec 字段。

实测一个最小声明(仅 2 行有效配置):

apiVersion: solr.apache.org/v1beta1
kind: SolrCloud
metadata:
  name: demo
spec:
  replicas: 2
  zookeeperRef:
    provided:
      replicas: 1

apply 后约 6 分钟,实测得到完全就绪的集群:

NAME   VERSION   TARGETVERSION   DESIREDNODES   NODES   READYNODES   UPTODATENODES
demo   8.11                      3              3       3            3

三、CRD 体系与调谐产物

3.1 三个核心 CRD(实测 kubectl get crd)

solrbackups.solr.apache.org
solrclouds.solr.apache.org
solrprometheusexporters.solr.apache.org
zookeeperclusters.zookeeper.pravega.io     # 依赖的 ZooKeeper Operator 注册
CRD职责
SolrCloud声明一套 SolrCloud:节点数、镜像、存储、ZK 连接、TLS、安全认证、模块加载、升级策略
SolrPrometheusExporter声明一个对接 SolrCloud 的 Prometheus 指标导出器 Deployment
SolrBackup声明一次对 SolrCloud 的集合备份(到 volume/Google Cloud Storage/S3)

3.2 一个 SolrCloud 会被调谐出什么(实测)

operator 日志实录(kubectl logs deploy/solr-operator):

INFO Setting default settings for SolrCloud  {"SolrCloud": {"name":"demo",...}}
INFO Creating Zookeeer Cluster               {"SolrCloud": {"name":"demo",...}}
INFO Creating Common Service                 {"SolrCloud": {"name":"demo",...}}
INFO Creating Headless Service               {"SolrCloud": {"name":"demo",...}}
INFO Creating ConfigMap                      {"SolrCloud": {"name":"demo",...}}
INFO Creating StatefulSet                    {"SolrCloud": {"name":"demo",...}}

最终集群内资源(实测 kubectl get svc,statefulset):

service/demo-solrcloud-common                    ClusterIP   # 统一读写入口(负载均衡到节点)
service/demo-solrcloud-headless                  ClusterIP(None)  # 节点间点对点
service/demo-solrcloud-zookeeper-client          ClusterIP
service/demo-solrcloud-zookeeper-headless        ClusterIP(None)
service/demo-solrcloud-zookeeper-admin-server    ClusterIP
statefulset.apps/demo-solrcloud             3/3
statefulset.apps/demo-solrcloud-zookeeper   1/1

即:2 个 StatefulSet + 5 个 Service + ConfigMap +(ZK 模式时)1 个 ZookeeperCluster CR 全部由一个 CR 派生,命名规律 <名字>-solrcloud-*。

3.3 依赖组件

  • cert-manager(硬依赖):operator 启动参数带 --tls-watch-cert=true,用 cert-manager 签发的证书保护 Solr 与 ZK 之间及 operator 自身的 webhook/metrics 通信。不装 cert-manager,operator 无法完成安装;
  • ZooKeeper Operator(可选但推荐):Solr Operator 内嵌集成(实测启动参数 -zk-operator=true)。zookeeperRef.provided 模式要求它存在,负责创建/管理 ZookeeperCluster;
  • 注意:主 chart 默认 不注册 zookeeperclusters CRD(避免卸载误删),provided 模式安装时需 --set zookeeper-operator.crd.create=true(实测踩坑,见安装指南)。

四、版本线与兼容性

实测 helm 仓库(https://solr.apache.org/charts,重定向到 nightlies.apache.org)可见版本序列:

NAME                       CHART VERSION   APP VERSION
apache-solr/solr-operator  0.9.1           v0.9.1       # 最新
(历史:0.9.0 / 0.8.1 / 0.8.0 / 0.7.1 / 0.7.0 / 0.6.0 ...)

选型结论:

  • 生产用 0.9.1(0.9 线当前最新,CRD 字段以 v1beta1 提供);
  • 0.9 线 API 有破坏性重构:zookeeperRef 从旧版的 provisionZookeeperCR/externalConnectionString 简化为 provided(托管 ZK)与 connectionInfo(外接 ZK)两个分支(实测:旧字段 apply 直接报 unknown field 严格校验错误);
  • K8s 兼容:实测 v1.32 正常;cert-manager v1.16.2 正常;
  • 默认 Solr 镜像 8.11(spec.solrImage 可覆盖,如 solr:9.8.1),版本字段在 status 显示 VERSION 8.11;
  • 同仓库另有 apache-solr/solr chart(封装 SolrCloud CR 的模板化部署),适合"helm 一把梭"的团队,CR 级管理仍推荐直接写 SolrCloud。

五、核心能力实测速览

能力实测结果
声明式创建 ZK + SolrCloud✅ 一个 CR 拉起 2 个 StatefulSet + 5 个 Service,6 分钟内全 Ready
扩容✅ kubectl patch replicas 2→3,operator 自动创建 demo-solrcloud-2 并加入集群(DESIREDNODES 3,READYNODES 3/3)
Collection 管理✅ 经 common Service 做 Collections API(CREATE/LIST/CLUSTERSTATUS)正常,2 个 shard 自动分布到不同节点
文档索引与查询✅ JSON POST 索引 + commit + select 查询闭环,numFound/命中内容正确
状态可视化✅ kubectl get solrcloud 直接显示 VERSION/DESIREDNODES/READYNODES/UPTODATENODES

详细操作与回显见《Apache Solr Operator CRD 详解与调谐实测》《Apache Solr Operator 数据操作与验证指南》。

六、选型对比:要不要为 Solr 上 Operator

方案适用场景短板
裸 StatefulSet + 自管 ZK集群结构固定、运维能力强的团队滚动升级/扩容/证书/备份全部手写脚本,跨环境不可复制
Helm chart 模板化部署(apache-solr/solr)一次性交付、版本固定升级扩容仍靠改 values 重发;运行时状态 helm 管不到
Solr Operator需要持续运维动作(扩缩容、滚动升级、备份、TLS 轮换、多套环境复制)引入 operator + cert-manager 两个常驻组件;CRD 版本升级需跟随
云托管(托管 Solr/搜索服务)不想自运维数据出域与成本考量

选型建议:

  1. 多环境复制 + 频繁运维动作:Operator 收益最大——一份 CR 即一份环境定义,kubectl patch 一个字段完成扩容(实测验证);
  2. 强调与 ZK 生命周期绑定:zookeeperRef.provided 让 Solr 与 ZK 同生共死(都由 CR 管),比自建 ZK 集群再拼装省心;
  3. 单环境、几乎不变的 Solr:直接 StatefulSet 或 helm 模板也够,避免为低频运维引入 operator 组件栈;
  4. 需要备份到对象存储、Prometheus 监控导出、Basic Auth 安全:这三个能力在 Operator 中都是一等公民(对应 SolrBackup、SolrPrometheusExporter、spec.solrSecurity),裸部署需自行拼装。

七、限制与注意事项

以下均经实测确认:

  1. cert-manager 是硬依赖:跳过 cert-manager 直接装 operator 会在 webhook/TLS 环节失败;
  2. 镜像拉取是国内环境的最大障碍:operator 及其派生的 pod 涉及 5 个以上镜像(solr-operator、zookeeper-operator、k8s-kubectl hook、solr、zookeeper、busybox init),Kind 等自建集群需配好镜像加速(节点内 containerd 与宿主机 docker 的加速配置互不相通),或 docker save + ctr images import 预注入(实测可行,见安装指南第 8 节);
  3. init 容器镜像易被忽略:Solr pod 的 init 容器默认 library/busybox:1.28.0-glibc,只预拉 solr 镜像 pods 会卡在 Init:0/1(实测踩坑);
  4. CRD 严格校验:0.9 线删除了旧字段,从旧文档/旧 chart 抄 CR 会报 strict decoding error: unknown field,改用 provided/connectionInfo;
  5. ZookeeperCluster CRD 默认不注册:provided 模式首次安装需显式开启,否则 operator 反复重启报 no matches for kind "ZookeeperCluster"(实测日志实录见安装指南)。

八、小结

  • Apache Solr Operator 把 SolrCloud 的完整生命周期(ZK 托管、StatefulSet、Service、ConfigMap、扩缩容、升级、备份、监控导出)收敛为三个 CRD,实测一个 2 行配置的 CR 即可拉起全栈;
  • 生产首选 0.9.1;注意 0.9 线 zookeeperRef API 重构与 cert-manager 硬依赖;
  • 选型一句话:Solr 在 K8s 上需要"持续被运维"就上 Operator,只需要"被部署一次"可以不上;
  • 国内环境部署的前置功课是镜像加速方案,本文实测给出两条可靠路径(节点内 mirror 配置 / docker save + ctr 预注入)。