改版通知

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

0199SK8s上部署StarRocksv315存算分离验证环境

ckckck2025年1月10日81 浏览

StarRocks 存算分离集群部署指南

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

Image

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

概述

存算分离的 S3 存储(由 Rook 提供)已提前就绪。本文主要验证在 Kubernetes(K8s)上部署 StarRocks(SR),并与 S3 进行对接,部署存算分离组件 FE 和 CN,不包含 BE 组件。

Image

:存算分离 K8s 是可选的,选择 K8s 是因为 Rook 是基于 K8s 的存储系统,且当前架构计划将 StarRocks 部署到 K8s。

环境准备

  • 操作系统:CentOS 7.6 (5.4.261-1.el7.elrepo.x86_64)
  • Kubernetes:1.27.6
  • Rook-Ceph:v1.12.8(与 StarRocks 在同一个 K8s 集群部署)
  • StarRocks Operator:1.8.7
  • StarRocks FE:3.1.5
  • StarRocks CN:3.1.5
  • StarRocks FE-proxy:nginx:1.21.5

1. 存算分离及资源准备

StarRocks 存算分离功能从 3.0 版本开始支持,但存算分离集群需要部署 CN 节点而非 BE 节点。可以理解为 CN 和 BE 是同一个组件,BE 存算分离后变为 CN(Compute Node),CN 只提供计算,而 BE 既有计算,又有存储。

部署 StarRocks 存算分离集群时,需要在 FE 和 CN 的配置文件 fe.confcn.conf 中添加额外配置项。

1.1 官方存算分离说明

StarRocks 存算分离集群采用了存储计算分离架构,特别为云存储设计。在存算分离模式下,StarRocks 将数据存储在兼容 S3 协议的对象存储(例如 AWS S3、OSS 以及 MinIO)或 HDFS 中,而本地盘作为热数据缓存,用以加速查询。通过存储计算分离架构,您可以降低存储成本并且优化资源隔离。除此之外,集群的弹性扩展能力也得以加强。在查询命中缓存的情况下,存算分离集群的查询性能与存算一体集群性能一致。

相对存算一体架构,StarRocks 的存储计算分离架构提供以下优势:

  • 廉价且可无缝扩展的存储。
  • 弹性可扩展的计算能力。由于数据不存储在 CN 节点中,因此集群无需进行跨节点数据迁移或 Shuffle 即可完成扩缩容。
  • 热数据的本地磁盘缓存,用以提高查询性能。
  • 可选异步导入数据至对象存储,提高导入效率。

通过官方说明来看,存算分离主要是作为云端部署而提供,云端存储数据相对是安全有保障的。

Image

图 1:StarRocks 存算分离集群架构图

1.2 本次验证说明

存算分离需要的基础环境:S3 协议对象存储(或 HDFS)、StarRocks,缺一不可。

可以在 K8s 上部署,也可在非 K8s 上部署,只是将数据存储于 S3 或 HDFS 上。当前演示环境在 K8s(云原生)上部署,如果非云原生部署,则在原有架构上将 S3 或 HDFS 配置写入 fe.conf,也可实现存算分离。

  • 本次是对 StarRocks 存算分离的私有化部署进行验证,未在云厂商及云端产品中部署,验证后,可采购数台硬件进行物理支撑。
  • FE meta、FE log 也需要数据持久化,同样使用 CN 相同方法。如果不做持久化,重启 FE 后,因元数据丢失,不能访问到 S3 数据。
  • 验证了本地盘作为 CN 热数据缓存,可以使用 StorageClass 或 LocalPath 实现,本次使用 LocalPath 实现,后续可在生产环境使用该架构进行部署,生产环境可以考虑使用 1-2T NvMe SSD 同时作为 FE meta、log 及 CN cache 磁盘使用。
  • 生产环境如果具有高可用 StorageClass,可以使用 StorageClass 替换 LocalPath,使用 LocalPath 作为生产也是可以的,FE 采用 3 副本,CN 也建议多个节点部署,使用 LocalPath 自动扩缩容功能受限。
  • S3 存储的信息配置在 fe.conf 中,而数据的读写是由 CN 根据 FE 广播 S3 配置,将读写到 S3 中,cn.conf 中没有 S3 配置。

1.3 资源说明

  • 采用 3 节点主机,安装 K8s,1 个 master,3 个 node,其中主节点同时充当 node 节点。
  • rook-ceph 采用 RGW(对象存储)实现 S3 功能,每个节点 2 空闲块外置磁盘,充当 rook-ceph osd 使用。
  • StarRocks 和 rook-ceph 部署在同一套 K8s 集群中。
  • 外加 1 台作为单节点伪分布式 HDFS,用于 StarRocks 备份,采用 1 副本,较大利用磁盘。
  • 同时可以考虑外加 3 台作为 rook-ceph RGW 容灾使用,验证未涉及这部分,生产环境可以考虑规划。
  • 每台 K8s/存储节点两块网卡,一个为 public 网络,作为业务使用,一块 cluster 网络,作为 rook-ceph 内部数据同步使用。

资源清单

序号 主机名 CPU 内存 本地磁盘 外接磁盘 网卡 功能描述
1 k8s-sr1 4c 16G 200G 10G*2 1G*2块 K8s-master/K8s-node1
2 k8s-sr2 4c 16G 200G 10G*2 1G*2块 K8s-node2
3 k8s-sr3 4c 16G 200G 10G*2 1G*2块 K8s-node3
4 sr-bak 4c 16G 200G 10G*3 1G*2块 单机伪分布式,HDFS 共 300G 容量

2. rook-ceph S3 存储验证及 fe.conf 配置

部署 StarRocks 前,确保 rook-ceph S3 存储已就绪,S3 作为 StarRocks 对接的存储,如果未能就绪,后续数据读写会有问题。

验证后根据 rook-ceph S3 参数准备 fe.conf 共享存储内容。

2.1 验证 rook-ceph S3 可用性(rook-ceph 知识)

可通过关键参数在 toolbox-operator-image 中设置变量值。这部分为 rook-ceph 知识,对此不熟悉内容,可在我 rook-ceph RGW 对象创建部分了解。

1) 登录 toolbox-operator-image

bash 复制代码
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools-operator-image -- bash

2) 设置环境变量

每个人环境变量不尽相同,当前是我 rook-ceph 部署的环境信息:

bash 复制代码
export AWS_HOST=rook-ceph-rgw-my-store.rook-ceph.svc      # 如果使用 K8s 内地址,可以使用该地址,如果使用是外部 rook-ceph,可以使用 IP 或域名
export PORT=800
export BUCKET_NAME=ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948
export AWS_ACCESS_KEY_ID=Q2HLJBVD739N9XOR3SNZ
export AWS_SECRET_ACCESS_KEY=pevdQm9d82AR1vAuIrVmpUNSth0G6nkQ5KzmmJdG

3) 创建凭据

bash 复制代码
mkdir ~/.aws
cat > ~/.aws/credentials << EOF
[default]
aws_access_key_id = ${AWS_ACCESS_KEY_ID}
aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}
EOF

4) 上传和下载对象存储

上传文件到桶中

bash 复制代码
echo "Hello Rook" > /tmp/rookObj
s5cmd --endpoint-url http://$AWS_HOST:$PORT cp /tmp/rookObj s3://$BUCKET_NAME

从桶中下载并验证文件

bash 复制代码
s5cmd --endpoint-url http://$AWS_HOST:$PORT cp s3://$BUCKET_NAME/rookObj /tmp/rookObj-download
cat /tmp/rookObj-download

2.2 对接 Rook-Ceph S3 参数准备(StarRocks + Ceph 知识)

对于不同的对象存储类型,参考官方链接获取不同的参数值。

存算分离官方链接

下面以 Ceph S3(rook-ceph)为例,详细参数见“存算分离官方参考”:

plaintext 复制代码
run_mode = shared_data          # 存算分离模式
cloud_native_meta_port = 6090    # 云原生元数据服务监听端口,默认端口 6090
cloud_native_storage_type = S3  # 存储类型 S3
aws_s3_path = ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948    # 此处选择 bucket 名称
aws_s3_endpoint = rook-ceph-rgw-my-store.rook-ceph.svc.cluster.local:800  # endpoint 即 http://IP+port,rook-ceph-rgw-my-store.rook-ceph.svc.cluster.local 写法为 K8s 内部域名格式,应当前 rook-ceph 和 starrocks 在同一个集群内部,采用 K8s 内部域名,我的对象存储配置端口为 800
aws_s3_access_key = Q2HLJBVD739N9XOR3SNZ        # access_key,每个 bucket 唯一
aws_s3_secret_key = pevdQm9d82AR1vAuIrVmpUNSth0G6nkQ5KzmmJdG    # secret_key,每个 bucket 唯一
enable_load_volume_from_conf = true  # true 表示 StarRocks 将使用 FE 配置文件中存储相关属性创建内置存储卷 builtin_storage_volume,并将其设置为默认存储卷。但如果没有指定存储相关的属性,StarRocks 将无法启动。

将以上配置加入到 fe.conf 中,后续会提供完整的 fe.conf 配置。

plaintext 复制代码
...
100     # config for share data mode
101     run_mode = shared_data
102     cloud_native_meta_port = 6090
103     cloud_native_storage_type = S3
104     aws_s3_path = ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948
105     #aws_s3_region = <region>   # 公有云 aws 需要改参数,ceph 对接不需要该参数
106     aws_s3_endpoint = rook-ceph-rgw-my-store.rook-ceph.svc.cluster.local:800
107     aws_s3_access_key = Q2HLJBVD739N9XOR3SNZ
108     aws_s3_secret_key = pevdQm9d82AR1vAuIrVmpUNSth0G6nkQ5KzmmJdG
109     # create the default storage volume manually after the cluster is created
110     enable_load_volume_from_conf = true

3. 部署 StarRocks Operator

3.1 添加定制资源 StarRocksCluster

创建自定义资源:

bash 复制代码
curl -O https://raw.githubusercontent.com/StarRocks/starrocks-kubernetes-operator/main/deploy/starrocks.com_starrocksclusters.yaml
kubectl apply -f starrocks.com_starrocksclusters.yaml

3.2 部署 StarRocks Operator

1) 下载 CRDs(StarRocks 在 K8s 中自定义资源定义)

使用默认配置文件或者自定义配置文件部署 StarRocks Operator。

下载用于部署 StarRocks Operator 的配置文件:

bash 复制代码
curl -O https://raw.githubusercontent.com/StarRocks/starrocks-kubernetes-operator/main/deploy/operator.yaml

2) 部署 Operator

StarRocks Operator 默认会部署至 starrocks 命名空间下,并且管理所有命名空间下的 StarRocks 集群。如果有必要,可修改配置文件进行部署。

bash 复制代码
kubectl apply -f operator.yaml

3) 检查 Operator 状态

检查 StarRocks Operator 运行状态。如果 Pod 处于 Running 状态且 Pod 内所有容器都 READY,则表示 StarRocks Operator 成功运行。

bash 复制代码
kubectl -n starrocks get pod

说明:如要更改 StarRocks Operator 所在 Namespace,则需要修改 starrocks 为自定义的 Namespace。

bash 复制代码
grep -n namespace operator.yaml

4. 部署 StarRocks 集群

4.1 配置示范简述

可以直接使用 StarRocks 提供的配置文件范例,部署 StarRocks 集群(定制资源 StarRocks Cluster 实例化的对象)。例如使用 starrocks-fe-and-be.yaml,部署一个 StarRocks 集群,包含三个 FE 和三个 BE 节点。本次未采用此默认配置,下面提供自定义配置。

bash 复制代码
curl -O https://raw.githubusercontent.com/StarRocks/starrocks-kubernetes-operator/main/examples/starrocks/starrocks-fe-and-be.yaml
kubectl apply -f starrocks-fe-and-be.yaml

4.2 本次部署 yaml 文件说明

本次未直接使用官方提供的 starrocks-fe-and-be.yaml,因现有主机资源较小,故参考官方提供 yaml 进行修改,分别借鉴 starrocks-fe-and-be.yamldeploy_a_starrocks_cluster_with_fe_proxy.yaml,通过配置部署了 FE、CN、FE-proxy,并同时使用 fe.confcn.conf 对组件进行参数定义,方便后续优化。

  • FE:使用 localPath,分别缓存 meta(/opt/starrocks/fe/meta)、log(/opt/starrocks/fe/log),元数据占用空间不大。
  • CN:使用 localPath 作为热数据缓存 cn cache(/opt/starrocks/cn/storage),生产环境可配置 200G - 2T,主要是将热数据从 S3 拉取本地。
  • FE-proxy:解决从集群外导入数据提示 K8s 内部域名不能识别问题。

按上述规划,创建 StarRocks 集群需准备好 shared-data-fe-cn-feproxy-v1.0.yaml(内含 fe.confcn.conf)和 localStorageClassV1.0.yaml,前者作为集群主体,后者作为 localPath 必备的 SC(StorageClass)和 PV(PersistentVolume)。

4.3 准备 shared-data-fe-cn-feproxy-v1.0.yaml 文件

yaml 复制代码
cat > shared-data-fe-cn-feproxy-v1.0.yaml <<-'EOF'
# This manifest deploys a StarRocks cluster running in shared data mode.
# see https://docs.starrocks.io/en-us/latest/deployment/deploy_shared_data for more information about share data mode.
#
# You will have to download and edit this YAML file to specify the details for your shared storage. See the
# examples in the docs, and add your customizations to the ConfigMap `starrockscluster-sample-fe-cm` at the
# bottom of this file.
# https://docs.starrocks.io/en-us/latest/deployment/deploy_shared_data#configure-fe-nodes-for-shared-data-starrocks
apiVersion: starrocks.com/v1
kind: StarRocksCluster
metadata:
  name: a-starrocks-in-share-data-mode   # change the name if needed.
  namespace: starrocks
spec:
  starRocksFeSpec:     # 部署 FE 部分
    image: starrocks/fe-ubuntu:latest     # 镜像版本
    replicas: 1   # 当前测试环境启动 1 个 pod,可以后续作为扩容验证,也可启动 3 个
    limits:
      cpu: 4         # 调小所需的资源,生产环境可调大
      memory: 6Gi
    requests:
      cpu: 1
      memory: 2Gi
    configMapInfo:
      configMapName: starrockscluster-sample-fe-cm   # 引用 configmap 作为 fe.conf 内容,可以作为后续参数优化使用,完整内容在后面
      resolveKey: fe.conf
    storageVolumes:
    - name: fe-storage-meta
      storageClassName: local-storage     # 使用 LocalPath 作为 fe 持久化数据存储
      # fe container stop running if the disk free space which the fe meta directory residents, is less than 5Gi.
      storageSize: 10Gi
      mountPath: /opt/starrocks/fe/meta   # fe meta 持久化数据目录
    - name: fe-storage-log
      storageClassName: local-storage
      storageSize: 5Gi
      mountPath: /opt/starrocks/fe/log   # fe log 持久化数据目录

  starRocksCnSpec:     # 部署 CN 部分
#    cnEnvVars:   # 调试时使用参数
#      - name: LOG_CONSOLE
#        value: "1"
    image: starrocks/cn-ubuntu:latest     # 镜像版本
    replicas: 1   # 当前测试环境启动 1 个 pod,可以后续作为扩容验证,也可启动 3 个
    limits:
      cpu: 4           # 调小所需的资源,生产环境可调大
      memory: 6Gi
    requests:
      cpu: 1
      memory: 2Gi
    configMapInfo:
      configMapName: starrockscluster-sample-cn-cm   # 引用 configmap 作为 cn.conf 内容,可以作为后续参数优化使用,完整内容在后面
      resolveKey: cn.conf
    storageVolumes:
    - name: cn-storage-cache
      storageClassName: local-storage          # 使用 LocalPath 作为 cn 持久化数据存储
      # fe container stop running if the disk free space which the fe meta directory residents, is less than 5Gi.
      storageSize: 200Gi
      mountPath: /opt/starrocks/cn/storage   # cn 缓存等持久化数据目录

  starRocksFeProxySpec:     # 部署 FE Proxy 部分
    image: nginx:latest     # 镜像版本
    replicas: 1   # 当前测试环境启动 1 个 pod,可以后续作为扩容验证,也可启动 3 个
    limits:
      cpu: 1           # 调小所需的资源,生产环境可调大
      memory: 2Gi
    requests:
      cpu: 200m
      memory: 500Mi
    service:
      type: NodePort   # export fe proxy service
      ports:
        - containerPort: 8080
          name: http-port
          nodePort: 30180   # The range of valid ports is 30000-32767
          port: 8080
    resolver: "kube-dns.kube-system.svc.cluster.local"  # this is the default dns server.

---
# fe config
apiVersion: v1
kind: ConfigMap
metadata:
  name: starrockscluster-sample-fe-cm
  namespace: starrocks
  labels:
    cluster: starrockscluster-sample
data:
  fe.conf: |
    LOG_DIR = ${STARROCKS_HOME}/log
    DATE = "$(date +%Y%m%d-%H%M%S)"
    # 降低 JVM 内存大小为 4G: Xmx4096m, 共 3 处
    JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx4096m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:${LOG_DIR}/fe.gc.log.$DATE"
    JAVA_OPTS_FOR_JDK_9="-Dlog4j2.formatMsgNoLookups=true -Xmx4096m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
    JAVA_OPTS_FOR_JDK_11="-Dlog4j2.formatMsgNoLookups=true -Xmx4096m -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
    http_port = 8030
    rpc_port = 9020
    query_port = 9030
    edit_log_port = 9010
    mysql_service_nio_enabled = true
    sys_log_level = INFO
    # config for share data mode
    # 将之前 S3 的信息填充到下方
    run_mode = shared_data
    cloud_native_meta_port = 6090
    cloud_native_storage_type = S3
    aws_s3_path = ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948
    #aws_s3_region = <region>
    aws_s3_endpoint = rook-ceph-rgw-my-store.rook-ceph.svc.cluster.local:800
    aws_s3_access_key = Q2HLJBVD739N9XOR3SNZ
    aws_s3_secret_key = pevdQm9d82AR1vAuIrVmpUNSth0G6nkQ5KzmmJdG
    # create the default storage volume manually after the cluster is created
    enable_load_volume_from_conf = true

---
# cn config
apiVersion: v1
kind: ConfigMap
metadata:
  name: starrockscluster-sample-cn-cm
  namespace: starrocks
  labels:
    cluster: starrockscluster-sample
data:
  cn.conf: |
    starlet_port = 9070
    storage_root_path = /opt/starrocks/cn/storage
    #block_cache_mem_size = 2147483648
    #block_cache_disk_size = 21474836480
EOF

4.4 准备 localStorageClassV1.0.yaml 文件

yaml 复制代码
cat > localStorageClassV1.0.yaml << -'EOF'
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage      # StorageClass 名称,可自定义
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: starrocks-fe-meta-pv     # fe-meta pv 名称
  namespace: starrocks
spec:
  capacity:
    storage: 10Gi             # fe meta 大小
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage     # 使用上述定义的 SC 名称
  local:
    path: /opt/starrocks/fe/meta      # fe meta 本机路径
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-sr1    # 后续 fe-meta 固定在该节点,如果有多个节点,则更改每个节点主机名,需要 label 进行标记

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: starrocks-fe-log-pv    # fe-log pv 名称
  namespace: starrocks
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /opt/starrocks/fe/log         # fe log 本机路径
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-sr1

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: starrocks-cn-cache-pv     # cn-cache pv 名称
  namespace: starrocks
spec:
  capacity:
    storage: 200Gi         # cn cache 个人建议 200G - 2T
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /opt/starrocks/cn/storage     # cn cache 本机路径
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-sr1
EOF

4.5 创建 StarRocks 集群

1) 创建 StarRocks 集群

bash 复制代码
kubectl apply -f shared-data-fe-cn-feproxy-v1.0.yaml

2) 创建 LocalPath 存储

创建 fe-meta、fe-log、cn-cache 所用到的 local 存储,PVC 会自动创建:

bash 复制代码
kubectl apply -f localStorageClassV1.0.yaml

3) 查看 pod 已经启动

正常情况下,FE、CN、FE-proxy 都应该为 Running,且 READY 数量都为期望数量,如 1/1, N/N,此时已完成 StarRocks 存算分离部署。

bash 复制代码
kubectl -n starrocks get pod

4) FE-proxy 镜像拉取缓慢处理(可跳过)

FE-proxy 默认拉取镜像非常缓慢,pod 不能启动:

bash 复制代码
kubectl -n starrocks describe pod a-starrocks-in-share-data-mode-fe-proxy-857455f4df-pbdpv

nginx:1.24.0 拉取缓慢,经和官方老师确认,可以更换为最新 nginx:latest 版本:

bash 复制代码
kubectl -n starrocks edit deployments.apps/a-starrocks-in-share-data-mode-fe-proxy

另外一个方法是我当前使用的方法,在 shared-data-fe-cn-feproxy-v1.0.yaml 中的 starRocksFeProxySpec 一段,指定版本,参考如下:

yaml 复制代码
starRocksFeProxySpec:     # 部署 FE Proxy 部分
  image: nginx:latest     # 镜像版本

该段在“4.3 准备 shared-data-fe-cn-feproxy-v1.0.yaml 文件”中已包含。

5. 访问集群

5.1 在 Kubernetes 集群内通过 MySQL 客户端访问 StarRocks 集群

通过 FE 的 pod 进行验证访问,可以使用通过 FE Service 的 ClusterIP,或者 K8s 内的 service name 进行访问。

Service 的名称默认为 <集群名称>-<组件名称>-service,例如 a-starrocks-in-share-data-mode-fe-service,也可以在每个组件的 spec 中指定 Service 名称。

1) 查看 service 信息

FE service 的 IP 为 11.111.196.31,service name 为 a-starrocks-in-share-data-mode-fe-service,在 K8s 内部都可以通过这两个名称进行访问。

查看 FE Service 内部虚拟 CLUSTER-IP 和端口 PORT(S)。

bash 复制代码
kubectl -n starrocks get svc

2) K8s 内部登录 FE

bash 复制代码
kubectl -n starrocks exec -it a-starrocks-in-share-data-mode-fe-0 -- bash

3) 以 CLUSTER-IP 登录 StarRocks

bash 复制代码
mysql -h 11.111.196.31 -P 9030 -uroot

4) 也可以 service name 登录 StarRocks

bash 复制代码
mysql -h a-starrocks-in-share-data-mode-fe-service -P 9030 -uroot

5) 查看 FE、CN 节点状态 - 正常

sql 复制代码
SHOW PROC '/frontends'\G
SHOW PROC '/compute_nodes'\G

5.2 K8s 集群外访问 StarRocks 集群

在 Kubernetes 集群外,支持通过 FE Service 的 LoadBalancer 和 NodePort 访问 StarRocks 集群。以 LoadBalancer 为例:

1) 公有云访问方式(本次不涉及)

将 fe-service 的类型由 ClusterIP 更改为 LoadBalancer,直接使用 external-ip 进行访问,该方法使用云提供商的负载均衡器在外部公开服务。

执行命令 kubectl -n starrocks edit svc a-starrocks-in-share-data-mode-fe-service 更新 StarRocks 集群配置文件,修改 starRocksFeSpec 的 Service 类型为 LoadBalancer。

yaml 复制代码
starRocksFeSpec:
  image: starrocks/fe-ubuntu:3.0-latest
  replicas: 3
  requests:
    cpu: 4
    memory: 16Gi
  service:
    type: LoadBalancer # 指定为 LoadBalancer

查询 FE Service 向外部暴露的 IP 地址 EXTERNAL-IP 和端口 PORT(S)。

bash 复制代码
kubectl -n starrocks get svc

通过 MySQL 客户端访问 StarRocks 集群:

bash 复制代码
mysql -h a7509284bf3784983a596c6eec7fc212-618xxxxxx.us-west-2.elb.amazonaws.com -P9030 -uroot

2) 私有云访问方式(本次涉及)

###1 创建 yaml 文件

可以通过 nodeport 进行公开 FE query 和 http port,也可使用 ingress-nginx+DNS 实现域名进行访问,前者可结合 nginx 可以实现高可用访问。下面以 nodeport 对 FE http 和 FE query 进行演示。

yaml 复制代码
cat > fe-nodeport-svc.yaml <<-'EOF'
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: fe                     # svc label, --show-labels
    app.starrocks.ownerreference/name: a-starrocks-in-share-data-mode
  name: starrocks-fe-nodeport
  namespace: starrocks
spec:
  ports:
  - name: http
    port: 8030
    protocol: TCP
    targetPort: 8030
    nodePort: 32030    # http 8030 对外访问端口 32030
  - name: query
    port: 9030
    protocol: TCP
    targetPort: 9030
    nodePort: 32630    # query 8030 对外访问端口 32630
  selector:
    app.kubernetes.io/component: fe             # pod label, --show-tables
    app.starrocks.ownerreference/name: a-starrocks-in-share-data-mode-fe
  type: NodePort
EOF

###2 创建 nodePort

bash 复制代码
kubectl apply -f fe-nodeport-svc.yaml

###3 查看 nodePort

bash 复制代码
kubectl -n starrocks get svc

###4 在 K8s 外登录 StarRocks

bash 复制代码
mysql -h192.168.80.20 -P32630 -uroot

6. 官方参考

Image

end