StarRocks on Kubernetes Operator 部署指南
编者荐语
之前准备单独写一篇的,但是自认为没有这个详细。部署文档参考:StarRocks Kubernetes Operator。
以下文章来源于 rundba,作者 landnow。

rundba:数据库及相关IT技术分享、交流。

自 StarRocks V2.4.0 开始,提供了计算和存储分离作为可选功能,新增了 CN 组件,可以承担部分 SQL 计算。CN 是一种无状态计算服务,支持基于 Kubernetes 的容器化部署,实现弹性伸缩,支撑数据湖分析等消耗大量计算资源的分析场景。
0. 环境准备
- CentOS 7.6
- golang 1.19.3
- docker 20.10.12
- GNU Make 3.82
- gcc version 4.8.5
- jdk-8u144-linux-x64.tar.gz
- StarRocks-2.4.0-test-1104.tar.gz
- starrocks-kubernetes-operator-computenodegroup.zip
说明:
- 文中使用 StarRocks Operator 在 Kubernetes 上部署 CN 并实现弹性伸缩。
- CN 作为新增组件,需要原有的 FE、BE 配合使用,需要提前部署 FE、BE,高可用 FE + 高可用 BE + CN_K8s 将是比较优化的方案。
- CN 架构最早是在腾讯内部使用,目前在 SR 处于公测阶段。
- 以下均已 root 用户操作。
0.1 安装 git
- CentOS:
yum -y install git - Ubuntu:
sudo apt-get install git - git 官网:https://git-scm.com
0.2 golang 安装
CentOS
-
下载:
bashwget https://dl.google.com/go/go1.19.3.linux-amd64.tar.gz -
解压:
bashrm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz -
设置 golang 相关环境变量:
bashcat >> /etc/profile <<-'EOF' ### go env add ### export GOPROXY=https://goproxy.cn export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin export GOPATH=/opt/go export PATH=$PATH:$GOPATH/bin ### go env end ### EOF -
创建 GOPATH 目录:
bashmkdir -p /opt/go -
使环境变量生效:
bashsource /etc/profile -
查看版本:
bashgo version
Ubuntu
bash
sudo apt-get install golang
- golang 官网:https://golang.google.cn/dl
0.3 docker 安装
CentOS
-
使用阿里云 docker 镜像:
bashwget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo -
安装最新版本:
bashyum -y install docker-ce -
启动 docker 服务:
bashsystemctl restart docker systemctl enable docker
Ubuntu
bash
sudo apt install docker.io
0.4 系统软件安装
bash
yum -y install gcc-c++ libstdc++-static ant cmake byacc flex automake libtool binutils-devel bison ncurses-devel make unzip wget vim
0.5 部署 StarRocks
部署 StarRocks 方式:
- 以二进制安装包方式手动部署 StarRocks;
- 从源码编译安装 StarRocks;
- 通过 Docker 镜像安装(测试环境);
- 通过 StarRocks Manager 安装;
- StarGo 安装 StarRocks。
安装详情参考官方链接:StarRocks 部署文档
为快速安装测试,可参考文档《0188.S 使用 Docker 部署 StarRocks V2.4.0 测试环境》 -> "8. 直接拉取(参考)" 部分,使用两条命令快速完成 FE、BE 的搭建,连接如下:
0188.S 使用 Docker 部署 StarRocks V2.4.0 测试环境
1. 制作 StarRocks Operator 镜像
1.1 下载 StarRocks Operator 代码,并保存至目录
创建下载目录:
bash
mkdir /soft/SR && cd /soft/SR
浏览器进入 starrocks-kubernetes-operator 的 computenodegroup 分支,点击 Code -> Download ZIP,下载压缩包 starrocks-kubernetes-operator-computenodegroup.zip。
或者使用 wget 直接下载:
bash
wget -O starrocks-kubernetes-operator-computenodegroup.zip https://github.com/StarRocks/starrocks-kubernetes-operator/archive/refs/heads/computenodegroup.zip
说明:
官方提供直接使用 git clone:
bash
git clone https://github.com/StarRocks/starrocks-kubernetes-operator
提供的 starrocks-kubernetes-operator 这个版本作为 main 分支,后面有很多异常,故使用官方同学提供的上述 computenodegroup 分支。
1.2 进入 StarRocks Operator 代码目录
bash
unzip starrocks-kubernetes-operator-computenodegroup.zip
cd starrocks-kubernetes-operator-computenodegroup
1.3 制作 StarRocks Operator 镜像
为了和官方首次提供的分支进行区别,故后续名称进行调整,原有名称:
bash
make docker IMG="starrocks-kubernetes-operator:v1.0"
更新后名称:
bash
make docker IMG="starrocks-kubernetes-operator-computenodegroup:v1.0"
如果有类似报错:
bash
go: sigs.k8s.io/controller-tools/cmd/controller-gen@v0.8.0: Get "https://proxy.golang.org/sigs.k8s.io/controller-tools/cmd/controller-gen/@v/v0.8.0.info": dial tcp 172.217.160.113:443: i/o timeout
解决方法,设置本地 go 代理:
bash
go env -w GOPROXY=https://goproxy.cn
再次执行 make docker 命令。
如果有类似报错:
bash
bash: /bin/controller-gen: No such file or directory
解决方法:
bash
go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.3.0
vim Makefile # 更改102行,将shell pwd更改为GOPATH,否则不能找到controller-gen命令
bash
102 CONTROLLER_GEN = $(GOPATH)/bin/controller-gen #default value $(shell pwd)/bin/controller-gen
1.4 tag 并上传镜像
可以上传到 Docker Hub,也可上传到私有仓库。
1.4.1 查看镜像名称
bash
docker images | grep operator
1.4.2 上传 Docker Hub 方法
-
docker login:
bashcat ./hub_password.txt | docker login --username landnow --password-stdin -
标记 StarRocks Operator 镜像:
bashdocker tag 86ea1e20551b landnow/starrocks-kubernetes-operator-computenodegroup:v1.0 -
推送至远端 Docker 仓库:
bashdocker push landnow/starrocks-kubernetes-operator-computenodegroup:v1.0
1.4.3 上传私有仓库方法
-
docker login:
bashdocker login https://reg.rundba.com -uwk -
标记 StarRocks Operator 镜像:
bashdocker tag 86ea1e20551b reg.rundba.com/starrocks/starrocks-kubernetes-operator-computenodegroup:v1.0 -
推送至私有仓库:
bashdocker push reg.rundba.com/starrocks/starrocks-kubernetes-operator-computenodegroup:v1.0
2. 制作 CN 镜像
官方首次提供的测试版本介质不能完成完成部署,和官方同学沟通后,使用提供的新介质,需要重新制作 CN 镜像。介质目前(2022-11-07),官方文档尚未更新。
2.1 下载 StarRocks 2.4
浏览器下载 StarRocks-2.4.0-test-1104.tar.gz:
bash
http://cdn-release.starrocks.com/StarRocks-2.4.0-test-1104.tar.gz?Expires=1668769223&OSSAccessKeyId=LTAI4GFYjbX9e7QmFnAAvkt8&Signature=AWNyYuJR7w9fSpbjsO3KVe9ad10%3D
或直接使用 wget 下载:
bash
wget -SO /soft/SR/StarRocks-2.4.0-test-1104.tar.gz "http://cdn-release.starrocks.com/StarRocks-2.4.0-test-1104.tar.gz?Expires=1668996477&OSSAccessKeyId=LTAI4GFYjbX9e7QmFnAAvkt8&Signature=zUNVpBk3oqb4MZTcTnflyiI5XKo%3D"
2.2 解压
bash
tar zxvf StarRocks-2.4.0-test-1104.tar.gz
cd StarRocks-2.4.0-test-1104
2.3 创建 Dockerfile
bash
cat >> Dockerfile <<-'EOF'
FROM centos:7
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
RUN yum install -y tzdata openssl curl vim ca-certificates fontconfig gzip tar mysql java-11-openjdk
COPY /be /data/starrocks/be/
ENV JAVA_HOME=/usr/lib/jvm/jre-11-openjdk/
PATH="/usr/local/bin/jdk-11.0.16/bin:$PATH"
ENV STARROCKS_ROOT=/data/starrocks
USER root
Workdir /data/starrocks
EOF
2.4 重新制作 CN 镜像
bash
docker build -f Dockerfile -t starrocks-cn:v1.0 .
2.5 查看镜像
bash
docker images | grep cn
2.6 标记 CN 镜像,并推送至远端仓库
2.6.1 推送至 Docker Hub
bash
docker tag b8b24293c71c landnow/starrocks-cn:v1.0
docker push landnow/starrocks-cn:v1.0
2.6.2 推送至私有仓库
bash
docker tag b8b24293c71c reg.rundba.com/starrocks/starrocks-cn:v1.0
docker push reg.rundba.com/starrocks/starrocks-cn:v1.0
2.6.3 上传错误解决参考
如果上传到 Docker Hub 有类似错误:
bash
error pulling image configuration: Get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/af/afc243f32f5908516972688a489d357f342e32880e6347c6dddece9cfbeca44f/data?verify=1667462637-xn87AuAb%2BmwKjR8uTxSHFPFwl5Y%3D": dial tcp 104.18.124.25:443: i/o timeout
解决方法:添加其它源
bash
cat /etc/docker/daemon.json
{
"registry-mirrors":["https://hub-mirror.c.163.com","https://registry.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://ul2pzi84.mirror.aliyuncs.com"],
"insecure-registries": ["https://reg.rundba.com"]
}
重启 docker 服务:
bash
systemctl restart docker
再次执行 build。
3. 制作 CN 辅助服务镜像
CN 辅助服务是指 component 目录下的 register、offline,会将 CN 注册到至 FE 或者从 FE 中摘除。
3.1 进入 starrocks-kubernetes-operator/components 目录
bash
cd $your_code_path/starrocks-kubernetes-operator/components
3.2 创建镜像
创建 CN 辅助服务镜像:
bash
make docker IMG="starrocks-computenodegroup:v1.0"
查看 CN 辅助服务镜像:
bash
docker images | grep computenodegroup
3.3 标记 CN 辅助镜像,并推送至远端仓库
3.3.1 推送至 Docker Hub
bash
docker tag dbffaff3f140 landnow/starrocks-computenodegroup:v1.0
docker push landnow/starrocks-computenodegroup:v1.0
3.3.2 推送至私有仓库
标记:
bash
docker tag dbffaff3f140 reg.rundba.com/starrocks/starrocks-computenodegroup:v1.0
将镜像上传到本地仓库:
bash
docker push reg.rundba.com/starrocks/starrocks-computenodegroup:v1.0
4. 部署 StarRocks Operator
4.1 进入 starrocks-kubernetes-operator/deploy 目录
bash
cd $your_code_path/starrocks-kubernetes-operator/deploy
如果镜像制作主机不在 K8s 集群内部,可将 deploy 目录下内容传输到 K8s 集群:
bash
scp -r deploy/ k8s3-master:/root/sr/
4.2 修改 manager.yaml 的 image 为制作的 StarRocks Operator 镜像标签
例如 starrocks/sr-cn-test:operator。
yaml
25 args:
26 - --leader-elect
27 image: reg.rundba.com/starrocks/starrocks-kubernetes-operator-computenodegroup:v1.0 #controller:latest
28 name: manager
4.3 部署 StarRocks Operator
bash
cd /root/sr/deploy
kubectl apply -f starrocks.com_computenodegroups.yaml
kubectl apply -f namespace.yaml
kubectl apply -f leader_election_role.yaml
kubectl apply -f role.yaml
kubectl apply -f role_binding.yaml
kubectl apply -f leader_election_role_binding.yaml
kubectl apply -f service_account.yaml
kubectl apply -f manager.yaml
如果镜像没有拉取到,报错:
bash
Normal Scheduled 6m4s default-scheduler Successfully assigned starrocks/cn-controller-manager-86c46ffb95-vl87q to k8s3-node2
Warning Failed 5m21s (x3 over 6m2s) kubelet Failed to pull image "reg.rundba.com/starrocks/starrocks-kubernetes-operator:v1.0": rpc error: code = Unknown desc = Error response from daemon: Get "https://reg.rundba.com/v2/": http: server gave HTTP response to HTTPS client
Normal Pulling 4m31s (x4 over 6m3s) kubelet Pulling image "reg.rundba.com/starrocks/starrocks-kubernetes-operator:v1.0"
Warning Failed 4m31s (x4 over 6m2s) kubelet Error: ErrImagePull
Warning Failed 4m31s kubelet Failed to pull image "reg.rundba.com/starrocks/starrocks-kubernetes-operator:v1.0": rpc error: code = Unknown desc = Error response from daemon: Get "https://reg.rundba.com/v2/": x509: certificate relies on legacy Common Name field, use SANs instead
Warning Failed 4m20s (x6 over 6m1s) kubelet Error: ImagePullBackOff
Normal BackOff 60s (x21 over 6m1s) kubelet Back-off pulling image "reg.rundba.com/starrocks/starrocks-kubernetes-operator:v1.0"
解决方法:
- 确保你的私有仓库能解析,
reg.rundba.com是我自己的,在 K8s 的每个节点配置/etc/hosts,或进行 DNS 解析; - 确保 K8s 节点可以访问
reg.rundba.com:bashcat /etc/docker/daemon.json { "insecure-registries": ["https://reg.rundba.com"] } - 每个节点配置完成后,还需要重启 docker:
bash
systemctl restart docker - 确保 SR 运行节点可以登录仓库,否则同样拉取不到镜像:
bash
docker login reg.rundba.com -uwk
4.4 执行 kubectl get pod -n starrocks 查看 pod 状态
如果返回结果中 STATUS 显示 Running,则表示 pod 正在运行。
bash
kubectl get pod -n starrocks
5. 在 K8s 中部署 CN
5.1 进入 starrocks-kubernetes-operator/examples/cn 目录
bash
cd $your_code_path/starrocks-kubernetes-operator/examples/cn
如果镜像制作主机不在 K8s 集群内部,可将 deploy 目录下内容传输到 K8s 集群:
bash
scp -r ../../examples k8s3-master:/root/sr/
5.2 修改 cn.yaml
-
修改
cnImage为推送到远端仓库的 CN 镜像文件标签:yaml17 cnImage: reg.rundba.com/starrocks/starrocks-cn:v1.0 # CN image -
修改
componentsImage为推送到远端仓库的 CN Group 镜像文件标签:yaml18 componentsImage: reg.rundba.com/starrocks/starrocks-computenodegroup:v1.0 # auxiliary components image -
修改
<fe_ip>:<fe_query_port>为任意一个 FE 节点 IP 地址和query_port端口号(默认为 9030):yaml12 feInfo: 13 accountSecret: test-secret # secret to configure FE account 14 addresses: # FE addresses 15 - 192.16.80.125:9030 # <ip>:<port> -
增加
command配置选项,路径为 CN Group 镜像中start_cn.shell的相对路径,即添加第 30、31 行:yaml22 podPolicy: 23 resources: # resources requirement of CN pod 24 limits: 25 cpu: 4000m 26 memory: 8Gi 27 requests: 28 cpu: 4000m 29 memory: 8Gi 30 command: 31 - be/bin/start_cn.sh #/root/StarRocks-2.4.0/be/bin/start_cn.sh, same with Dockerfile -> Workdir /data/starrocks -> /data/starrocks/be/bin 32 autoScalingPolicy: # auto-scaling policy of CN cluster
5.3 部署 CN
bash
cd /root/sr/examples/cn
kubectl apply -f fe-account.yaml
kubectl apply -f cn-config.yaml
kubectl apply -f cn.yaml
5.4 检查 CN 运行状态
bash
kubectl -n starrocks get pod
CN 部署成功后,StarRocks Operator 自动调用 cn.yaml 文件中配置的 FE IP 和查询端口号,将 CN 加至 StarRocks 集群中。
6. 配置自动水平扩缩容策略
6.1 HPA 说明
如果需要配置 CN 自动扩缩策略,则可以修改 cn.yaml 配置文件:
yaml
$your_code_path/starrocks-kubernetes-operator/examples/cn/cn.yaml
例如,您需要基于 K8s 中 CN 的内存和 CPU 使用率实现弹性伸缩,则需要配置内存和 CPU 平均使用率为资源指标,触发弹性伸缩的阈值。弹性伸缩上限和下限即 pod 副本数量或者 CN 数量的上限和下限。
Kubernetes 还支持使用 behavior,根据业务场景定制扩缩容行为,实现快速扩容,缓慢缩容,禁用缩容等。
6.2 CN 组件 HPA 配置
yaml
autoScalingPolicy: # auto-scaling policy of CN cluster
maxReplicas: 10 # CN 数量的上限 10
minReplicas: 1 # CN 数量的下限 1
hpaPolicy:
metrics: # 资源指标
- type: Resource
resource:
name: memory # 资源指标为内存
target:
averageUtilization: 30 # 触发水平扩缩容的阈值为30%。K8s 集群中 CN 内存使用率超过 30% 时,增加 CN 数量进行扩容,低于 30% 时,减少 CN 数量进行缩容。
type: Utilization
- type: Resource
resource: # 触发水平扩缩容的阈值为 60%。K8s 集群中 CN CPU 内存使用率超过 60% 时,增加 CN 数量进行扩容,低于 60% 时,减少 CN 数量进行缩容。
name: cpu
target:
averageUtilization: 60
type: Utilization
behavior: # 根据业务场景定制扩缩容行为,实现快速扩容,缓慢缩容,禁用缩容等。
scaleUp:
policies:
- type: Pods
value: 1
periodSeconds: 10
scaleDown:
selectPolicy: Disabled
部分配置说明如下:
-
水平扩缩时 CN 数量的上限和下限:
yamlmaxReplicas: 10 # CN 数量的上限 10 minReplicas: 1 # CN 数量的下限 1 -
触发水平扩缩的阈值:
yaml- type: Resource resource: name: cpu target: averageUtilization: 60
6.3 生效自动扩缩策略
bash
kubectl apply -f cn/cn.yaml
6.4 查看生效后的策略
bash
kubectl -n starrocks get hpa
6.5 CN 部署故障分析
如果在 CN 部署出现异常,可通过 CN 本身的日志进行查看,也可进一步通过 FE 的日志进行查看。
FE 日志查看方法:
- 登录 FE 所在主机,查看
log下的日志; - docker 部署的话,进入 fe 所在的 docker,然后查看
/data/deploy/StarRocks-2.4.0-test-1104/fe/log下面的日志。
7. 登录并查看 StarRocks 服务状态
7.1 Kubernetes 集群上临时安装 MySQL 客户端
本次使用 docker 创建临时 MySQL 客户端,也可使用 fe 的 mysql 客户端登录。
bash
kubectl run mysql-client --image=mysql --restart=Never --rm -it -- bash -il
7.2 使用 mysql-client 访问 StarRocks
bash
mysql -h 192.16.80.123 -P9030
7.3 查看各组件状态
7.3.1 查看 fe 集群状态
sql
SHOW PROC '/frontends';
7.3.2 查看 be 状态
sql
SHOW PROC '/backends';
7.3.3 查看 compute nodes
sql
SHOW COMPUTE NODES;
7.4 通过浏览器查看 FE、BE、CN 信息
- FE 信息:
http://HOST_IP:8030/ - BE 信息:
http://HOST_IP:8040/ - CN 信息: FE 主页 -> 点击“system” -> compute_nodes,即可查看,效果同
SHOW COMPUTE NODES。
8. 创建测试数据验证
sql
CREATE DATABASE TEST;
USE TEST;
CREATE TABLE `sr_on_mac` (
`c0` int(11) NULL COMMENT "",
`c1` date NULL COMMENT "",
`c2` datetime NULL COMMENT "",
`c3` varchar(65533) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`c0`)
PARTITION BY RANGE (c1) (
START ("2022-02-01") END ("2022-02-10") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(`c0`) BUCKETS 1
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);
INSERT INTO sr_on_mac VALUES (1, '2022-02-01', '2022-02-01 10:47:57', '111');
INSERT INTO sr_on_mac VALUES (2, '2022-02-02', '2022-02-02 10:47:57', '222');
INSERT INTO sr_on_mac VALUES (3, '2022-02-03', '2022-02-03 10:47:57', '333');
SELECT * FROM sr_on_mac WHERE c1 >= '2022-02-02';
如果无错误返回,则表明您已成功在 K8s 中环境中部署 CN,并结合 FE、BE 正常提供服务。
9. 参考
end
