使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南

发布于:2025-04-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

使用 kind 创建 K8s 集群并部署 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 有所帮助。如有任何问题,请参考官方文档或社区支持。