暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

0199.S K8s上部署StarRocks v3.1.5存算分离验证环境

rundba 2024-01-03
192

 

存算分离的S3存储(Rook提供)已提前就绪,本文主要验证在K8s部署SR,并和S3进行对接,部署存算分离组件FE、CN,没有BE组件。

           


 注:存算分离K8s是可选的,选择K8s是因rook是基于K8s的存储系统,另外我当前架构计划将StarRocks部署到K8s。



0. ENV


 

  • 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.conf和cn.conf中的额外配置项。


1.1 官方存算分离说明

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

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

  • 廉价且可无缝扩展的存储。

  • 弹性可扩展的计算能力。由于数据不存储在 CN 节点中,因此集群无需进行跨节点数据迁移或 Shuffle 即可完成扩缩容。

  • 热数据的本地磁盘缓存,用以提高查询性能。

  • 可选异步导入数据至对象存储,提高导入效率。

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

图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-sr14c16G200G10G*21G*2块K8s-mater/K8s-node1
2k8s-sr24c16G200G10G*21G*2块K8s-node2
3
k8s-sr34c16G200G10G*21G*2块K8s-node3
4sr-bak4c16G200G10G*31G*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

    kubectl -n rook-ceph exec -it deploy/rook-ceph-tools-operator-image -- bash


    2) 设置环境变量

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

      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) 创建凭据

        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) 上传和下载对象存储

        # 上传文件到桶中:

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

          如:

            [rook@rook-ceph-tools-operator-image-857944b455-9sp7c ]$ echo "Hello Rook" > tmp/rookObj
            [rook@rook-ceph-tools-operator-image-857944b455-9sp7c ]$ s5cmd --endpoint-url http://$AWS_HOST:$PORT cp tmp/rookObj s3://$BUCKET_NAME
            cp tmp/rookObj s3://ceph-bkt-1731eb81-3860-468e-96ee-f865accd48db/rookObj


            #从桶中下载并验证文件:

              s5cmd --endpoint-url http://$AWS_HOST:$PORT cp s3://$BUCKET_NAME/rookObj tmp/rookObj-download
              cat tmp/rookObj-download

              如:

                [rook@rook-ceph-tools-operator-image-857944b455-9sp7c ]$ s5cmd --endpoint-url http://$AWS_HOST:$PORT cp s3://$BUCKET_NAME/rookObj tmp/rookObj-download
                cp s3://ceph-bkt-1731eb81-3860-468e-96ee-f865accd48db/rookObj tmp/rookObj-download
                [rook@rook-ceph-tools-operator-image-857944b455-9sp7c ]$ cat tmp/rookObj-download
                Hello Rook


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

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

                存算分离官方连接:

                  https://docs.starrocks.io/zh/docs/deployment/deploy_shared_data/


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

                    run_mode = shared_data          #存算分离模式
                    cloud_native_meta_port = 6090 #云原生元数据服务监听端口,默认端口6090
                    cloud_native_storage_type = S3 #存储类型S3


                    # 如 testbucket/subpath
                    aws_s3_path = <s3_path>
                    aws_s3_path = ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948 #此处选择bueket名称


                    # 例如:http://172.26.xx.xxx:7480
                    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配置。

                      ...
                      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

                            创建自定义资源:

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

                        如:

                          [root@k8s-sr1 sr]# kubectl apply -f starrocks.com_starrocksclusters.yaml
                          customresourcedefinition.apiextensions.k8s.io/starrocksclusters.starrocks.com created


                          3.2 部署StarRocks Operator

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

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

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

                            curl -O https://raw.githubusercontent.com/StarRocks/starrocks-kubernetes-operator/main/deploy/operator.yaml


                            2) 部署Operator

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

                              kubectl apply -f operator.yaml

                              如:

                                [root@k8s-sr1 sr]# kubectl apply -f operator.yaml
                                namespace/starrocks created
                                serviceaccount/starrocks created
                                clusterrole.rbac.authorization.k8s.io/kube-starrocks-operator created
                                clusterrolebinding.rbac.authorization.k8s.io/kube-starrocks-operator created
                                role.rbac.authorization.k8s.io/cn-leader-election-role created
                                rolebinding.rbac.authorization.k8s.io/cn-leader-election-rolebinding created
                                deployment.apps/kube-starrocks-operator created


                                3) 检查Operator状态

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

                                  [root@k8s-sr1 sr]# kubectl -n starrocks get pod
                                  NAME READY STATUS RESTARTS AGE
                                  kube-starrocks-operator-768ccbdf9c-pzsst 1/1 Running 0 73s


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

                                    [root@k8s-sr1 sr]# grep -n namespace operator.yaml
                                    12: namespace: starrocks
                                    102: namespace: starrocks
                                    109: namespace: starrocks
                                    148: namespace: starrocks
                                    156: namespace: starrocks
                                    163: namespace: starrocks


                                     


                                    4. 部署StarRocks集群


                                     

                                    4.1 配置示范简述

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

                                      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.yaml和deploy_a_starrocks_cluster_with_fe_proxy.yaml,通过配置部署了fe、cn、fe-proxy,并同时使用fe.conf、cn.conf对组件进行参数定义,方便后续优化。

                                      • fe:使用localPath,分别缓存meta(/opt/starrocks/fe/meta)、log(/opt/starrocks/fe/log),元数据占用空间不大;

                                      • cn:使用localPath作为热数据缓存cn cahce(/opt/starrocks/cn/storage),生产环境可配置200G - 2T,主要是将热数据从S3拉取本地;

                                      • fe-proxy:解决从集群外导入数据提示K8是内部域名不能识别问题


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


                                      4.3 准备shared-data-fe-cn-feproxy-v1.0.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: #部署Fe部分
                                        # 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: #部署FeProxy部分
                                        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文件

                                          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集群

                                            [root@k8s-sr1 sr]# kubectl apply -f shared-data-fe-cn-feproxy-v1.0.yaml 
                                            starrockscluster.starrocks.com/a-starrocks-in-share-data-mode created
                                            configmap/starrockscluster-sample-fe-cm created
                                            configmap/starrockscluster-sample-cn-cm created


                                            此时否则fe会一直pengding:

                                              [root@k8s-sr1 sr]# kubectl -n starrocks get pod -w
                                              NAME READY STATUS RESTARTS AGE
                                              a-starrocks-in-share-data-mode-fe-0 0/1 Pending 0 30s
                                              kube-starrocks-operator-768ccbdf9c-6wq4w 1/1 Running 0 2m9s


                                              2) 创建LocalPath存储

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

                                                [root@k8s-sr1 sr]# kubectl apply -f localStorageClassV1.0.yaml 
                                                storageclass.storage.k8s.io/local-storage created
                                                persistentvolume/starrocks-fe-meta-pv created
                                                persistentvolume/starrocks-fe-log-pv created
                                                persistentvolume/starrocks-cn-cache-pv created


                                                查看已经创建好的SC,PV及自动创建好的PVC

                                                  [root@k8s-sr1 sr]# kubectl -n starrocks get sc,pv,pvc
                                                  NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
                                                  storageclass.storage.k8s.io/local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 58s
                                                  storageclass.storage.k8s.io/rook-ceph-retain-bucket-starrocks   rook-ceph.ceph.rook.io/bucket   Retain          Immediate              false                  3h26m


                                                  NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
                                                  persistentvolume/starrocks-cn-cache-pv 200Gi RWO Delete Available local-storage 42s
                                                  persistentvolume/starrocks-fe-log-pv 5Gi RWO Delete Bound starrocks/fe-storage-log-a-starrocks-in-share-data-mode-fe-0 local-storage 58s
                                                  persistentvolume/starrocks-fe-meta-pv 10Gi RWO Delete Bound starrocks/fe-storage-meta-a-starrocks-in-share-data-mode-fe-0 local-storage 58s


                                                  NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
                                                  persistentvolumeclaim/fe-storage-log-a-starrocks-in-share-data-mode-fe-0 Bound starrocks-fe-log-pv 5Gi RWO local-storage 96s
                                                  persistentvolumeclaim/fe-storage-meta-a-starrocks-in-share-data-mode-fe-0 Bound starrocks-fe-meta-pv 10Gi RWO local-storage 96s


                                                  3) 查看pod已经启动

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

                                                    [root@k8s-sr1 sr]# kubectl -n starrocks get pod
                                                    NAME READY STATUS RESTARTS AGE
                                                    a-starrocks-in-share-data-mode-cn-0 1/1 Running 0 3m55s
                                                    a-starrocks-in-share-data-mode-fe-0 1/1 Running 0 7m3s
                                                    a-starrocks-in-share-data-mode-fe-proxy-5dfc8d5989-x9vsq 1/1 Running 0 3m55s
                                                    kube-starrocks-operator-768ccbdf9c-vlrg7 1/1 Running 0 8m43s


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

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

                                                      [root@k8s-sr1 sr]# kubectl -n starrocks describe pod a-starrocks-in-share-data-mode-fe-proxy-857455f4df-pbdpv
                                                      ...
                                                      ---- ------ ---- ---- -------
                                                      Normal Scheduled 2m1s default-scheduler Successfully assigned starrocks/a-starrocks-in-share-data-mode-fe-proxy-857455f4df-pbdpv to k8s-sr2
                                                      Warning Failed 79s kubelet Failed to pull image "nginx:1.24.0": rpc error: code = DeadlineExceeded desc =

                                                        

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

                                                        [root@k8s-sr1 sr]# kubectl -n starrocks edit deployments.apps/a-starrocks-in-share-data-mode-fe-proxy 
                                                        ...
                                                        48 containers:
                                                        49 - image: nginx:latest #default nginx:1.24.


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

                                                            starRocksFeProxySpec:     #部署FeProxy部分
                                                          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)。

                                                            [root@k8s-sr1 sr]# kubectl -n starrocks get svc
                                                            NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                                                            a-starrocks-in-share-data-mode-cn-search ClusterIP None <none> 9050/TCP 2m53s
                                                            a-starrocks-in-share-data-mode-cn-service ClusterIP 11.101.158.34 <none> 9060/TCP,8040/TCP,9050/TCP,8060/TCP 2m53s
                                                            a-starrocks-in-share-data-mode-fe-proxy-service NodePort 11.101.81.244 <none> 8080:30180/TCP 2m53s
                                                            a-starrocks-in-share-data-mode-fe-search ClusterIP None <none> 9030/TCP 6m2s
                                                            a-starrocks-in-share-data-mode-fe-service ClusterIP 11.111.196.31 <none> 8030/TCP,9020/TCP,9030/TCP,9010/TCP 6m1s


                                                            2) K8s内部登录Fe

                                                              [root@k8s-sr3 ~]# kubectl -n starrocks exec -it a-starrocks-in-share-data-mode-fe-0 -- bash


                                                              3) 以CLUSTER-IP登录StarRocks

                                                                root@a-starrocks-in-share-data-mode-fe-0:/opt/starrocks# mysql -h 11.111.196.31 -P 9030 -uroot
                                                                Welcome to the MySQL monitor. Commands end with ; or \g.
                                                                Your MySQL connection id is 2
                                                                Server version: 5.1.0 3.1.5-5d8438a


                                                                Copyright (c) 2000, 2023, Oracle and/or its affiliates.


                                                                Oracle is a registered trademark of Oracle Corporation and/or its
                                                                affiliates. Other names may be trademarks of their respective
                                                                owners.


                                                                Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


                                                                4) 也可以service name登录StarRocks

                                                                  root@a-starrocks-in-share-data-mode-fe-0:/opt/starrocks# mysql -h a-starrocks-in-share-data-mode-fe-service -P 9030 -uroot


                                                                  5) 查看fe、cn节点状态-正常

                                                                    mysql> SHOW PROC '/frontends'\G
                                                                    *************************** 1. row ***************************
                                                                    Name: a-starrocks-in-share-data-mode-fe-0.a-starrocks-in-share-data-mode-fe-search.starrocks.svc.cluster.local_9010_1701757616554
                                                                    IP: a-starrocks-in-share-data-mode-fe-0.a-starrocks-in-share-data-mode-fe-search.starrocks.svc.cluster.local
                                                                    EditLogPort: 9010
                                                                    HttpPort: 8030
                                                                    QueryPort: 9030
                                                                    RpcPort: 9020
                                                                    Role: LEADER
                                                                    ClusterId: 117990822
                                                                    Join: true
                                                                    Alive: true
                                                                    ReplayedJournalId: 140
                                                                    LastHeartbeat: 2023-12-05 06:34:07
                                                                    IsHelper: true
                                                                    ErrMsg:
                                                                    StartTime: 2023-12-05 06:27:17
                                                                    Version: 3.1.5-5d8438a
                                                                    1 row in set (0.04 sec)




                                                                    mysql> SHOW PROC '/compute_nodes'\G
                                                                    *************************** 1. row ***************************
                                                                    ComputeNodeId: 10004
                                                                    IP: a-starrocks-in-share-data-mode-cn-0.a-starrocks-in-share-data-mode-cn-search.starrocks.svc.cluster.local
                                                                    HeartbeatPort: 9050
                                                                    BePort: 9060
                                                                    HttpPort: 8040
                                                                    BrpcPort: 8060
                                                                    LastStartTime: 2023-12-05 06:28:07
                                                                    LastHeartbeat: 2023-12-05 06:34:12
                                                                    Alive: true
                                                                    SystemDecommissioned: false
                                                                    ClusterDecommissioned: false
                                                                    ErrMsg:
                                                                    Version: 3.1.5-5d8438a
                                                                    CpuCores: 4
                                                                    NumRunningQueries: 0
                                                                    MemUsedPct: 0.14 %
                                                                    CpuUsedPct: 0.0 %
                                                                    HasStoragePath: true
                                                                    StarletPort: 9070
                                                                    WorkerId: 1
                                                                    1 row in set (0.01 sec)


                                                                    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。

                                                                      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)。

                                                                        $ kubectl -n starrocks get svc
                                                                        NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                                                                        be-domain-search ClusterIP None <none> 9050/TCP 127m
                                                                        fe-domain-search ClusterIP None <none> 9030/TCP 129m
                                                                        starrockscluster-sample-fe-service LoadBalancer 10.100.162.xxx a7509284bf3784983a596c6eec7fc212-618xxxxxx.us-west-2.elb.amazonaws.com 8030:30629/TCP,9020:32544/TCP,9030:32244/TCP,9010:32024/TCP 129m ClusterIP None <none> 9030/TCP 23h


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

                                                                          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进行演示。

                                                                            [root@k8s-sr1 sr]# cat fe-nodeport-svc.yaml 
                                                                            apiVersion: v1
                                                                            kind: Service
                                                                            metadata:
                                                                            labels:
                                                                            app.kubernetes.io/component: fe # svc lable, --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


                                                                            ###2 创建nodePort

                                                                              [root@k8s-sr1 sr]# kubectl apply -f fe-nodeport-svc.yaml
                                                                              service/starrocks-fe-nodeport created


                                                                              ###3 查看nodePort

                                                                                [root@k8s-sr1 sr]# kubectl -n starrocks get svc
                                                                                NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                                                                                a-starrocks-in-share-data-mode-cn-search ClusterIP None <none> 9050/TCP 45m
                                                                                a-starrocks-in-share-data-mode-cn-service ClusterIP 11.101.158.34 <none> 9060/TCP,8040/TCP,9050/TCP,8060/TCP 45m
                                                                                a-starrocks-in-share-data-mode-fe-proxy-service NodePort 11.101.81.244 <none> 8080:30180/TCP 45m
                                                                                a-starrocks-in-share-data-mode-fe-search ClusterIP None <none> 9030/TCP 48m
                                                                                a-starrocks-in-share-data-mode-fe-service ClusterIP 11.111.196.31 <none> 8030/TCP,9020/TCP,9030/TCP,9010/TCP 48m
                                                                                starrocks-fe-nodeport NodePort 11.106.160.152 <none> 8030:32030/TCP,9030:32630/TCP 64s #当前为生成的nodePort


                                                                                ###4 在K8s外登录StarRocks

                                                                                  mysql -h192.168.80.20 -P32630 -uroot

                                                                                   


                                                                                  6. 官方参考


                                                                                   

                                                                                    https://docs.starrocks.io/zh/docs/deployment/sr_operator/
                                                                                    https://docs.starrocks.io/zh/docs/deployment/deploy_shared_data/
                                                                                    https://docs.starrocks.io/zh/docs/quick_start/Create_table/
                                                                                    https://github.com/StarRocks/starrocks-kubernetes-operator/blob/main/doc/mount_persistent_volume_howto.md
                                                                                    https://github.com/StarRocks/starrocks-kubernetes-operator/blob/main/examples/starrocks/deploy_a_starrocks_cluster_running_in_share_data_mode.yaml
                                                                                    https://github.com/StarRocks/starrocks-kubernetes-operator/blob/main/examples/starrocks/deploy_a_starrocks_cluster_with_fe_proxy.yaml
                                                                                    https://docs.starrocks.io/zh/docs/data_source/data_cache/#be-%E9%85%8D%E7%BD%AE


                                                                                    不足之处,还望抛转。

                                                                                    作者:王坤,微信公众号:rundba,欢迎转载,转载请注明出处。

                                                                                    如需公众号转发,请联系wx:landnow。


                                                                                       




                                                                                                                 长按二维码                                   


                                                                                    欢迎加入>>西安K8S小组


                                                                                           

                                                                                       请注明:来自rundba,加入XAK8S小组                

                                                                                                 


                                                                                    往期推荐

                                                                                    阿里云负载均衡SLB版本CLB、ALB和NLB有什么区别如何选择?

                                                                                    0197.K kubernetes创建及更改HPA

                                                                                    0198.K 图解-Kubernetes&OpenShift容器网络发展

                                                                                    0196.K 为什么VMware的Kubernetes野心取决于MinIO

                                                                                    0195.K Kubernetes上部署MinIO Operator

                                                                                    0194.K 使用ORACLE MySQL Operator在Kubernetes上部署MySQL高可用集群

                                                                                    0193.O 使用Docker快速部署OceanBase v4.0测试环境

                                                                                    0192.C CDP中增删yarn队列失败,提示需要重启处理-Failed to add queue

                                                                                    0191.C ranger数据清理(HDFS和DB清理)

                                                                                    0190.C hdfs查看目录数量-目录大小-文件数量-文件大小排序

                                                                                    0189.S 使用StarRocks Operator在Kubernetes部署和管理CN

                                                                                    0188.S 使用Docker部署StarRocks V2.4.0测试环境

                                                                                    0187.C 使用FineBI同时连接开启Kerberos的CDP和CDH的impala

                                                                                    0186.C CentOS上FineBI V5.1.26安装

                                                                                    Rancher Kubernetes 发行版应用精讲训练营(10月13日至11月3日-共4期)

                                                                                    0185.K QFusion私有云数据库平台安装有礼,半小时¥150京东卡到手记

                                                                                    0184.K Kubernets上数据库高可用方案之通过ob-operator部署OceanBase-ce 3.1.3

                                                                                    0183.K ubuntu22.04上安装minikube(使用containerd和docker)

                                                                                    Ubuntu22.04上安装K8s1.24.2--3节点环境安装(一主两从)

                                                                                    0181.K 升级Kubernetes集群的Docker和Containerd版本

                                                                                    0180.K kubelet.go 2466 Error getting node not found

                                                                                    0179.U Ubuntu上ssh等效性一键脚本自动配置

                                                                                    0178. C cloudera-manager-agent被意外卸载后恢复

                                                                                    0177.U ubuntu server 22.04双网卡绑定

                                                                                    0176.K 设置master调度_去除master污点

                                                                                    0175.K delete pv状态状态一直为Terminating解决方法

                                                                                    0174.K kuboard监控套件安装

                                                                                    0173.K pod日志提示persistentvolumeclaim not found解决方法

                                                                                    0172.K pod日志提示pod has unbound immediate PersistentVolumeClaims解决

                                                                                    0171.K pod日志提示open prometheus queries.active permission denied解决

                                                                                    0170.K K8S增加node节点



                                                                                    文章转载自rundba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                    评论