使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
本文档详细介绍如何使用 kind 创建 Kubernetes 集群,并在其上使用 Helm 部署 StarRocks 集群(非高可用模式)。同时也包括如何访问 StarRocks 集群并导入数据。
目录
- 前提条件
- 参考文档
- [第一部分:使用 kind 创建 Kubernetes 集群](#第一部分:使用 kind 创建 Kubernetes 集群)
- [第二部分:使用 Helm 部署 StarRocks 集群](#第二部分:使用 Helm 部署 StarRocks 集群)
- [第三部分:访问 StarRocks 集群](#第三部分:访问 StarRocks 集群)
- 第四部分:导入数据并验证
- 常见问题与解决方案
- 清理资源
前提条件
在开始之前,请确保已安装以下工具:
- Docker
- kind
- kubectl
- Helm
- MySQL 客户端(推荐 8.0 版本)
- curl
参考文档
第一部分:使用 kind 创建 Kubernetes 集群
1.1 创建 kind 配置文件
创建一个配置文件 kind-config.yaml
,内容如下:
yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30001
hostPort: 30001
protocol: TCP
- containerPort: 30002
hostPort: 30002
protocol: TCP
- containerPort: 30003
hostPort: 30003
protocol: TCP
- role: worker
- role: worker
这个配置定义了一个有 1 个控制平面节点和 2 个工作节点的集群,并映射了 3 个端口用于外部访问。
1.2 创建集群
bash
kind create cluster --name starrocks-cluster --config kind-config.yaml
1.3 验证集群状态
bash
kubectl cluster-info --context kind-starrocks-cluster
kubectl get nodes
第二部分:使用 Helm 部署 StarRocks 集群
2.1 添加 StarRocks Helm Chart 仓库
bash
helm repo add starrocks https://starrocks.github.io/starrocks-kubernetes-operator
helm repo update
2.2 查看可用的 Chart
bash
helm search repo starrocks
2.3 创建 values.yaml 文件
创建一个文件 starrocks-values.yaml
,内容如下:
yaml
operator:
enabled: true
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 100m
memory: 256Mi
starrocks:
enabled: true
# 配置 MySQL 密码
passwd:
root: "password123"
fe:
replicas: 1
resources:
limits:
cpu: 2
memory: 4Gi
requests:
cpu: 500m
memory: 1Gi
storage:
size: 10Gi
service:
type: NodePort
ports:
mysql:
nodePort: 30001
be:
replicas: 1
resources:
limits:
cpu: 4
memory: 8Gi
requests:
cpu: 500m
memory: 1Gi
storage:
size: 20Gi
cn:
enabled: false
这个配置文件定义了一个非高可用的 StarRocks 集群,包含 1 个 FE 节点和 1 个 BE 节点。
2.4 部署 StarRocks 集群
bash
helm install starrocks starrocks/kube-starrocks -f starrocks-values.yaml
2.5 检查部署状态
bash
kubectl get pods
kubectl get starrockscluster
等待所有 Pod 状态变为 Running
,StarRocks 集群状态变为 running
。
第三部分:访问 StarRocks 集群
3.1 创建服务来暴露 StarRocks 接口
为了外部访问,我们需要创建 3 个 NodePort 服务。
3.1.1 MySQL 服务(可能已由 Helm Chart 创建)
如果 MySQL 协议端口未自动暴露,创建文件 starrocks-mysql-service.yaml
:
yaml
apiVersion: v1
kind: Service
metadata:
name: starrocks-mysql-nodeport
spec:
type: NodePort
ports:
- port: 9030
targetPort: 9030
nodePort: 30001
protocol: TCP
name: mysql
selector:
app.kubernetes.io/component: fe
app.starrocks.ownerreference/name: kube-starrocks-fe
应用配置:
bash
kubectl apply -f starrocks-mysql-service.yaml
3.1.2 FE HTTP 服务
创建文件 starrocks-fe-http-service.yaml
:
yaml
apiVersion: v1
kind: Service
metadata:
name: starrocks-fe-http
spec:
type: NodePort
ports:
- port: 8030
targetPort: 8030
nodePort: 30002
protocol: TCP
name: http
selector:
app.kubernetes.io/component: fe
app.starrocks.ownerreference/name: kube-starrocks-fe
应用配置:
bash
kubectl apply -f starrocks-fe-http-service.yaml
3.1.3 BE HTTP 服务
创建文件 starrocks-be-http-service.yaml
:
yaml
apiVersion: v1
kind: Service
metadata:
name: starrocks-be-http
spec:
type: NodePort
ports:
- port: 8040
targetPort: 8040
nodePort: 30003
protocol: TCP
name: http
selector:
app.kubernetes.io/component: be
app.starrocks.ownerreference/name: kube-starrocks-be
应用配置:
bash
kubectl apply -f starrocks-be-http-service.yaml
3.2 连接 StarRocks
3.2.1 使用 MySQL 客户端连接
bash
mysql -h 127.0.0.1 -P 30001 -u root -ppassword123
3.2.2 如果连接遇到问题
可能需要确保安装的 MySQL 客户端版本与 StarRocks 兼容。推荐使用 MySQL 8.0 客户端:
bash
# 卸载当前 MySQL 客户端(如果需要)
brew uninstall mysql
# 安装 MySQL 8.0 客户端
brew install [email protected]
# 添加到 PATH
export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
# 检查版本
mysql --version
第四部分:导入数据并验证
4.1 创建测试数据库和表
sql
CREATE DATABASE IF NOT EXISTS test;
USE test;
CREATE TABLE IF NOT EXISTS users (
id INT,
name VARCHAR(50),
age INT
) ENGINE=OLAP
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES('replication_num' = '1');
4.2 准备测试数据
创建测试数据文件 test_data.csv
:
id,name,age
101,刘备,45
102,关羽,42
103,张飞,38
104,诸葛亮,27
105,赵云,30
4.3 使用 Stream Load 导入数据
创建脚本 stream_load.sh
:
bash
#!/bin/bash
# 设置环境变量
FE_HOST=127.0.0.1
FE_PORT=30002
BE_HOST=127.0.0.1
BE_PORT=30003
DB_NAME=test
TABLE_NAME=users
USER=root
PASSWORD=password123
FILE=test_data.csv
# 第一步:向 FE 发送请求获取重定向 URL
echo "向 FE 发送请求获取重定向 URL..."
REDIRECT_RESPONSE=$(curl -v -X PUT -i "http://$FE_HOST:$FE_PORT/api/$DB_NAME/$TABLE_NAME/_stream_load" \
-u "$USER:$PASSWORD" \
-H "Expect: 100-continue" \
-H "label:test_load_$(date +%s)" \
-H "column_separator:," \
-H "skip_header:1" \
2>&1)
echo "FE 响应: $REDIRECT_RESPONSE"
# 从响应中提取 location 头部
LOCATION=$(echo "$REDIRECT_RESPONSE" | grep -i "location:" | awk '{print $2}' | tr -d '\r')
echo "重定向 URL: $LOCATION"
# 从 location 中提取 URL 路径部分
URL_PATH=$(echo "$LOCATION" | sed -n 's|http://.*:[0-9]*/\(.*\)|\1|p')
echo "URL 路径: $URL_PATH"
# 使用 BE NodePort 构建新的 URL
NEW_URL="http://$BE_HOST:$BE_PORT/$URL_PATH"
echo "新的 URL: $NEW_URL"
# 第二步:向 BE 发送实际数据
echo "向 BE 发送数据..."
curl -v -X PUT "$NEW_URL" \
-u "$USER:$PASSWORD" \
-H "Expect: 100-continue" \
-H "label:test_load_$(date +%s)" \
-H "column_separator:," \
-H "skip_header:1" \
-T "$FILE"
echo "导入完成。"
执行脚本导入数据:
bash
chmod +x stream_load.sh
./stream_load.sh
4.4 验证数据导入
sql
USE test;
SELECT * FROM users;
常见问题与解决方案
1. MySQL 客户端兼容性问题
问题:
ERROR 2059 (HY000): Authentication plugin 'mysql_native_password' cannot be loaded
解决方案 :
使用兼容的 MySQL 客户端版本(推荐 MySQL 8.0)。
### 2. Stream Load 重定向问题
**问题**:
StarRocks Stream Load 流程是先请求 FE,然后重定向到 BE,但是重定向 URL 指向集群内部,外部无法直接访问。
**解决方案**:
使用自定义脚本(如上面的 `stream_load.sh`)处理重定向流程,将内部 URL 替换为 NodePort 访问 URL。
### 3. Pod 无法启动
**问题**:
Pod 长时间处于 `ContainerCreating` 或 `CrashLoopBackOff` 状态。
**解决方案**:
- 检查 Pod 事件: `kubectl describe pod <pod-name>`
- 查看 Pod 日志: `kubectl logs <pod-name>`
- 检查资源限制是否合理
- 检查存储 PVC 是否正确创建
### 4. 存储问题
**问题**:
kind 集群默认使用临时存储,Pod 重启后数据会丢失。
**解决方案**:
对于持久化需求,可以考虑使用 hostPath 卷或将 kind 配置为使用持久卷。
### 5. 密码设置问题
**问题**:
通过 values.yaml 设置的密码可能未生效。
**解决方案**:
可以手动设置密码:
```sql
SET PASSWORD FOR 'root' = PASSWORD('your_password');
清理资源
当不再需要集群时,可以删除整个 kind 集群:
bash
kind delete cluster --name starrocks-cluster
或者只删除 StarRocks:
bash
helm delete starrocks
希望本指南对您部署和使用 StarRocks 有所帮助。如有任何问题,请参考官方文档或社区支持。