
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
本文档详细介绍如何使用 kind 创建 Kubernetes 集群,并在其上使用 Helm 部署 StarRocks 集群(非高可用模式)。同时也包括如何访问 StarRocks 集群并导入数据。
目录
- 前提条件
- 参考文档
- 第一部分:使用 kind 创建 Kubernetes 集群
- 第二部分:使用 Helm 部署 StarRocks 集群
- 第三部分:访问 StarRocks 集群
- 第四部分:导入数据并验证
- 常见问题与解决方案
- 清理资源
前提条件
在开始之前,请确保已安装以下工具:
- Docker
- kind
- kubectl
- Helm
- MySQL 客户端(推荐 8.0 版本)
- curl
参考文档
第一部分:使用 kind 创建 Kubernetes 集群
1.1 创建 kind 配置文件
创建一个配置文件 kind-config.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 创建集群
kind create cluster --name starrocks-cluster --config kind-config.yaml
1.3 验证集群状态
kubectl cluster-info --context kind-starrocks-cluster
kubectl get nodes
第二部分:使用 Helm 部署 StarRocks 集群
2.1 添加 StarRocks Helm Chart 仓库
helm repo add starrocks https://starrocks.github.io/starrocks-kubernetes-operator
helm repo update
2.2 查看可用的 Chart
helm search repo starrocks
2.3 创建 values.yaml 文件
创建一个文件 starrocks-values.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 集群
helm install starrocks starrocks/kube-starrocks -f starrocks-values.yaml
2.5 检查部署状态
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
:
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
应用配置:
kubectl apply -f starrocks-mysql-service.yaml
3.1.2 FE HTTP 服务
创建文件 starrocks-fe-http-service.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
应用配置:
kubectl apply -f starrocks-fe-http-service.yaml
3.1.3 BE HTTP 服务
创建文件 starrocks-be-http-service.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
应用配置:
kubectl apply -f starrocks-be-http-service.yaml
3.2 连接 StarRocks
3.2.1 使用 MySQL 客户端连接
mysql -h 127.0.0.1 -P 30001 -u root -ppassword123
3.2.2 如果连接遇到问题
可能需要确保安装的 MySQL 客户端版本与 StarRocks 兼容。推荐使用 MySQL 8.0 客户端:
# 卸载当前 MySQL 客户端(如果需要)
brew uninstall mysql
# 安装 MySQL 8.0 客户端
brew install mysql-client@8.0
# 添加到 PATH
export PATH="/opt/homebrew/opt/mysql-client@8.0/bin:$PATH"
# 检查版本
mysql --version
第四部分:导入数据并验证
4.1 创建测试数据库和表
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
:
#!/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 "导入完成。"
执行脚本导入数据:
chmod +x stream_load.sh
./stream_load.sh
4.4 验证数据导入
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 集群:
kind delete cluster --name starrocks-cluster
或者只删除 StarRocks:
helm delete starrocks
希望本指南对您部署和使用 StarRocks 有所帮助。如有任何问题,请参考官方文档或社区支持。
更多推荐
所有评论(0)