改版通知

巨人肩膀网站已全新改版。若您仍依赖旧站功能或数据,欢迎联系我们,我们会协助处理。联系我们

StarRocks on Kubernetes Operator 部署指南

ckckck2025年1月10日36 浏览

编者荐语

之前准备单独写一篇的,但是自认为没有这个详细。部署文档参考:StarRocks Kubernetes Operator

以下文章来源于 rundba,作者 landnow。

Image

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

Image

自 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

0.2 golang 安装

CentOS

  1. 下载:

    bash 复制代码
    wget https://dl.google.com/go/go1.19.3.linux-amd64.tar.gz
  2. 解压:

    bash 复制代码
    rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz
  3. 设置 golang 相关环境变量:

    bash 复制代码
    cat >> /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
  4. 创建 GOPATH 目录:

    bash 复制代码
    mkdir -p /opt/go
  5. 使环境变量生效:

    bash 复制代码
    source /etc/profile
  6. 查看版本:

    bash 复制代码
    go version

Ubuntu

bash 复制代码
sudo apt-get install golang

0.3 docker 安装

CentOS

  1. 使用阿里云 docker 镜像:

    bash 复制代码
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  2. 安装最新版本:

    bash 复制代码
    yum -y install docker-ce
  3. 启动 docker 服务:

    bash 复制代码
    systemctl 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 方式:

  1. 以二进制安装包方式手动部署 StarRocks;
  2. 从源码编译安装 StarRocks;
  3. 通过 Docker 镜像安装(测试环境);
  4. 通过 StarRocks Manager 安装;
  5. 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 方法

  1. docker login:

    bash 复制代码
    cat ./hub_password.txt | docker login --username landnow --password-stdin
  2. 标记 StarRocks Operator 镜像:

    bash 复制代码
    docker tag 86ea1e20551b landnow/starrocks-kubernetes-operator-computenodegroup:v1.0
  3. 推送至远端 Docker 仓库:

    bash 复制代码
    docker push landnow/starrocks-kubernetes-operator-computenodegroup:v1.0

1.4.3 上传私有仓库方法

  1. docker login:

    bash 复制代码
    docker login https://reg.rundba.com -uwk
  2. 标记 StarRocks Operator 镜像:

    bash 复制代码
    docker tag 86ea1e20551b reg.rundba.com/starrocks/starrocks-kubernetes-operator-computenodegroup:v1.0
  3. 推送至私有仓库:

    bash 复制代码
    docker 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 目录下的 registeroffline,会将 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"

解决方法:

  1. 确保你的私有仓库能解析,reg.rundba.com 是我自己的,在 K8s 的每个节点配置 /etc/hosts,或进行 DNS 解析;
  2. 确保 K8s 节点可以访问 reg.rundba.com
    bash 复制代码
    cat /etc/docker/daemon.json
    {
      "insecure-registries": ["https://reg.rundba.com"]
    }
  3. 每个节点配置完成后,还需要重启 docker:
    bash 复制代码
    systemctl restart docker
  4. 确保 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

  1. 修改 cnImage 为推送到远端仓库的 CN 镜像文件标签

    yaml 复制代码
    17     cnImage: reg.rundba.com/starrocks/starrocks-cn:v1.0                 # CN image
  2. 修改 componentsImage 为推送到远端仓库的 CN Group 镜像文件标签

    yaml 复制代码
    18     componentsImage: reg.rundba.com/starrocks/starrocks-computenodegroup:v1.0           # auxiliary components image
  3. 修改 <fe_ip>:<fe_query_port> 为任意一个 FE 节点 IP 地址和 query_port 端口号(默认为 9030)

    yaml 复制代码
    12   feInfo:
    13     accountSecret: test-secret # secret to configure FE account
    14     addresses: # FE addresses
    15       - 192.16.80.125:9030     # <ip>:<port>
  4. 增加 command 配置选项,路径为 CN Group 镜像中 start_cn.shell 的相对路径,即添加第 30、31 行

    yaml 复制代码
    22   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 数量的上限和下限

    yaml 复制代码
    maxReplicas: 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 日志查看方法:

  1. 登录 FE 所在主机,查看 log 下的日志;
  2. 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