Apache Solr Operator 介绍与选型指南
Apache Solr Operator 的定位、三大 CRD 体系(SolrCloud/SolrPrometheusExporter/SolrBackup)与调谐产物、版本线与依赖组件,以及与手工 YAML/Helm 部署方式的选型对比
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 默认 不注册
zookeeperclustersCRD(避免卸载误删),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/solrchart(封装 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/搜索服务) | 不想自运维 | 数据出域与成本考量 |
选型建议:
- 多环境复制 + 频繁运维动作:Operator 收益最大——一份 CR 即一份环境定义,
kubectl patch一个字段完成扩容(实测验证); - 强调与 ZK 生命周期绑定:
zookeeperRef.provided让 Solr 与 ZK 同生共死(都由 CR 管),比自建 ZK 集群再拼装省心; - 单环境、几乎不变的 Solr:直接 StatefulSet 或 helm 模板也够,避免为低频运维引入 operator 组件栈;
- 需要备份到对象存储、Prometheus 监控导出、Basic Auth 安全:这三个能力在 Operator 中都是一等公民(对应 SolrBackup、SolrPrometheusExporter、
spec.solrSecurity),裸部署需自行拼装。
七、限制与注意事项
以下均经实测确认:
- cert-manager 是硬依赖:跳过 cert-manager 直接装 operator 会在 webhook/TLS 环节失败;
- 镜像拉取是国内环境的最大障碍:operator 及其派生的 pod 涉及 5 个以上镜像(solr-operator、zookeeper-operator、k8s-kubectl hook、solr、zookeeper、busybox init),Kind 等自建集群需配好镜像加速(节点内 containerd 与宿主机 docker 的加速配置互不相通),或
docker save+ctr images import预注入(实测可行,见安装指南第 8 节); - init 容器镜像易被忽略:Solr pod 的 init 容器默认
library/busybox:1.28.0-glibc,只预拉 solr 镜像 pods 会卡在Init:0/1(实测踩坑); - CRD 严格校验:0.9 线删除了旧字段,从旧文档/旧 chart 抄 CR 会报
strict decoding error: unknown field,改用provided/connectionInfo; - 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 预注入)。