文章目录
-
- 动机
- 机制
- 准备工作
-
- [1. 启动 Minikube](#1. 启动 Minikube)
- [2. 准备镜像(关键步骤)](#2. 准备镜像(关键步骤))
- [3. 安装 Helm](#3. 安装 Helm)
- 部署步骤
-
- [1. 准备配置文件 `my-values.yaml`](#1. 准备配置文件
my-values.yaml) - [2. 添加仓库并安装](#2. 添加仓库并安装)
- [3. 验证部署](#3. 验证部署)
- [4. 环境清理](#4. 环境清理)
- [1. 准备配置文件 `my-values.yaml`](#1. 准备配置文件
- 避坑指南(Troubleshooting)
-
- [场景一:Operator 状态 `ImagePullBackOff`](#场景一:Operator 状态
ImagePullBackOff) - [场景二:FE/BE 状态 `CrashLoopBackOff`](#场景二:FE/BE 状态
CrashLoopBackOff) - [场景三:Helm Upgrade 报错 `conflicts with kubectl-patch`](#场景三:Helm Upgrade 报错
conflicts with kubectl-patch) - [深度思考:为什么 `my-values.yaml` 有时无效,必须用 Patch?](#深度思考:为什么
my-values.yaml有时无效,必须用 Patch?) - [技巧:Minikube 持久化与复用](#技巧:Minikube 持久化与复用)
- [场景一:Operator 状态 `ImagePullBackOff`](#场景一:Operator 状态
本文基于官方文档"使用 Helm 部署 StarRocks 集群"及实战经验整理,旨在帮助用户在 Minikube 环境下快速部署一套可用的 StarRocks 集群。
动机
在 Kubernetes 上部署复杂数据库系统时,手工维护 YAML 容易出错。Helm 提供了"Chart + values.yaml"的组合,能快速安装并管理版本。StarRocks 官方提供的 kube-starrocks Chart 将 Operator 与集群管理打包,降低了部署门槛。
机制
- Operator:负责监听并协调集群状态(自动拉起/恢复 FE 和 BE)。
- StarRocksCluster:自定义资源(CRD),描述了你期望的集群拓扑(如副本数、资源规格)。
流程:Helm 部署 Operator -> Operator 监听 CRD -> Operator 创建 Deployment(FE) 和 StatefulSet(BE)。
准备工作
1. 启动 Minikube
使用国内镜像源启动,并配置 Docker Hub 加速器。
bash
minikube start --image-mirror-country='cn' \
--registry-mirror=https://docker.m.daocloud.io \
--registry-mirror=https://huecker.io \
--memory=8192 --cpus=4
注意:StarRocks 对内存要求较高,建议给 Minikube 分配至少 8GB 内存。
2. 准备镜像(关键步骤)
Minikube 运行在独立环境中,无法直接读取宿主机镜像。请务必将镜像导入 Minikube,否则后续拉取极慢甚至超时。
bash
# 在宿主机终端执行
# 1. Operator 镜像
minikube image load starrocks/operator:v1.11.4
# 2. FE 和 BE 镜像(文件较大,需耐心等待)
minikube image load starrocks/fe-ubuntu:3.5-latest
minikube image load starrocks/be-ubuntu:3.5-latest
3. 安装 Helm
bash
brew install helm
部署步骤
1. 准备配置文件 my-values.yaml
关键点:默认 Chart 配置(8核/8G)远超 Minikube 承载能力。我们必须显式降低资源规格,并尝试指定镜像拉取策略。
yaml
# my-values.yaml - Minikube 适配版
operator:
enabled: true
starrocksOperator:
image:
repository: starrocks/operator
tag: v1.11.4
pullPolicy: IfNotPresent
starrocksCluster:
enabled: true
name: kube-starrocks
# FE 配置:降级为 1核/2G
starRocksFeSpec:
image: starrocks/fe-ubuntu:3.5-latest
imagePullPolicy: IfNotPresent
replicas: 1
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
storageVolumes:
- name: fe-meta
storageClassName: standard
storageSize: 5Gi
mountPath: /opt/starrocks/fe/meta
# BE 配置:降级为 1核/2G
starRocksBeSpec:
image: starrocks/be-ubuntu:3.5-latest
imagePullPolicy: IfNotPresent
replicas: 1
limits:
cpu: 1
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
storageVolumes:
- name: be-data
storageClassName: standard
storageSize: 10Gi
mountPath: /opt/starrocks/be/storage
2. 添加仓库并安装
bash
# 1. 创建命名空间
kubectl create namespace starrocks
# 2. 添加仓库
helm repo add starrocks https://starrocks.github.io/starrocks-kubernetes-operator
helm repo update
# 3. 执行安装
helm install starrocks starrocks/kube-starrocks -n starrocks -f my-values.yaml
3. 验证部署
安装命令下发后,Operator 会开始工作。你可以通过 Dashboard 或命令行监控进度。
方式一:命令行监控
bash
# 查看所有 Pod 状态
kubectl get pods -n starrocks -w
正常流程:Operator Running -> FE Pending -> FE Running -> BE Pending -> BE Running。
方式二:Dashboard(推荐)
bash
minikube dashboard
在浏览器中直观查看 Events 和 Logs,排错效率更高。
方式三:功能验证
当 FE 和 BE 状态均为 Running 时,进入 FE 容器验证:
bash
kubectl exec -it kube-starrocks-fe-0 -n starrocks -- mysql -P 9030 -h 127.0.0.1 -u root -e "SHOW FRONTENDS; SHOW BACKENDS;"
4. 环境清理
实验结束后,如果想释放资源但保留数据(以便下次继续):
bash
# 仅停止 Minikube(保留数据和镜像)
minikube stop
如果想彻底清空所有数据(慎用):
bash
# 卸载 Chart
helm uninstall starrocks -n starrocks
# 删除 PVC(数据卷)
kubectl delete pvc -n starrocks --all
# 删除命名空间
kubectl delete namespace starrocks
避坑指南(Troubleshooting)
如果你的 Pod 迟迟未能 Running,请对照以下场景进行修正。
场景一:Operator 状态 ImagePullBackOff
现象 :Operator Pod 一直无法启动,Events 显示 Failed to pull image ... context deadline exceeded。
原因 :Chart 配置未能生效,K8s 默认使用 Always 策略去联网拉取镜像,导致超时。
修正 :直接使用 kubectl patch 强制修改 Deployment。
bash
kubectl patch deployment kube-starrocks-operator -n starrocks --type='json' \
-p='[{"op": "replace", "path": "/spec/template/spec/containers/0/imagePullPolicy", "value": "IfNotPresent"}]'
执行后 Pod 会自动重建并恢复正常。
场景二:FE/BE 状态 CrashLoopBackOff
现象 :Pod 启动后立刻崩溃,Describe 显示 error setting cgroup config ... invalid argument。
原因 :Minikube 分配的 CPU 核数小于 Pod 申请的核数(默认 8 核)。
修正 :使用 kubectl patch 强制降低 CRD 对象的资源限制。
bash
# 修正 FE 资源限制(1核/2G)
kubectl patch starrockscluster kube-starrocks -n starrocks --type='merge' -p '{"spec":{"starRocksFeSpec":{"limits":{"cpu":"1","memory":"2Gi"},"requests":{"cpu":"500m","memory":"1Gi"}}}}'
# 修正 BE 资源限制(1核/2G)
kubectl patch starrockscluster kube-starrocks -n starrocks --type='merge' -p '{"spec":{"starRocksBeSpec":{"limits":{"cpu":"1","memory":"2Gi"},"requests":{"cpu":"500m","memory":"1Gi"}}}}'
# 强制重启旧 Pod 以应用新配置
kubectl delete pod -n starrocks kube-starrocks-fe-0
kubectl delete pod -n starrocks kube-starrocks-be-0
场景三:Helm Upgrade 报错 conflicts with kubectl-patch
现象 :执行 helm upgrade 时报错 Apply failed with ... conflicts。
原因 :你之前手动 Patch 过资源,Helm 拒绝覆盖这些手动变更。
修正:先删除冲突资源,再重新安装(相当于重建)。
bash
# 删除 Operator 和 Cluster(数据通常保留,取决于 PVC 策略)
kubectl delete deployment kube-starrocks-operator -n starrocks
kubectl delete starrockscluster kube-starrocks -n starrocks
# 重新执行安装
helm upgrade starrocks starrocks/kube-starrocks -n starrocks -f my-values.yaml
深度思考:为什么 my-values.yaml 有时无效,必须用 Patch?
在理想情况下,我们希望 my-values.yaml 能一次性声明所有配置。但在 Minikube 这种资源受限环境 + 官方 Chart 版本迭代的复杂场景下,往往有"坑":
-
Operator 镜像策略的"顽固性":
- StarRocks 官方 Chart 的某些版本中,Operator 的 Deployment 模板可能硬编码了
imagePullPolicy: Always,或者其 Values 变量层级非常深(如operator.starrocksOperator.image...vsimage...),导致你在values.yaml里的配置根本没有被正确渲染进去。 - Patch 的作用 :
kubectl patch是直接修改 K8s 里的运行态对象,它不讲道理,直接把Always改成IfNotPresent,专治各种配置不生效。
- StarRocks 官方 Chart 的某些版本中,Operator 的 Deployment 模板可能硬编码了
-
CRD 资源限制的"默认值覆盖":
- CRD(StarRocksCluster)有时会有自己的 Admission Webhook 或 Operator 默认逻辑。即使你在 Helm Values 里写了
limits: 1,Operator 初始化时可能还是会尝试用它代码里的默认值(比如为了性能推荐的 8 核)去覆盖或填充。 - Patch 的作用 :同样,
kubectl patch starrockscluster可以在对象创建后,强行把资源规格压下来,逼迫 Operator 按你的规矩办事。
- CRD(StarRocksCluster)有时会有自己的 Admission Webhook 或 Operator 默认逻辑。即使你在 Helm Values 里写了
总结 :my-values.yaml 是"君子协定",告诉 Helm 我想要什么;而 kubectl patch 是"强制执行",确保在环境受限(如 Minikube)或 Chart 逻辑有瑕疵时,集群依然能跑起来。
技巧:Minikube 持久化与复用
- 不要 Delete :
minikube delete会销毁所有数据和镜像。 - 使用 Stop :
minikube stop仅关机,数据保留。下次minikube start即可直接复用之前导入的镜像,无需再次image load。