更新时间:2024-09-14 GMT+08:00
分享

CCE部署使用ClickHouse

ClickHouse是一款用于联机分析(OLAP)的列式数据库管理系统,适用于处理大规模数据集的实时查询和分析。ClickHouse容器化部署方式主要有4种,具体请参见表1。ClickHouse Operator是在Kubernetes上部署和管理ClickHouse集群的工具,它具备复制集群、管理用户与配置文件以及处理数据持久化的存储卷等功能。这些功能共同简化了应用程序的配置、管理和监控工作。

表1 ClickHouse容器化部署方式

部署方式

部署方便程度

管理方便程度

Kubectl原生部署

Kubectl+Operator部署

Helm部署

Helm+Operator部署

下面将介绍在CCE集群中如何利用Kubectl+Operator方式部署ClickHouse,参考文档:https://github.com/Altinity/clickhouse-operator

前提条件

部署ClickHouse的基本步骤

以1.29版本CCE Turbo集群为例部署ClickHouse,集群的相关参数请参见表2

表2 集群部分参数配置

集群类型

CCE Turbo集群

集群版本

1.29

Region

上海一

容器引擎

Containerd

网络模型

云原生网络2.0

服务转发模式

iptables

  1. 创建ClickHouse Operator。

    1. 下载官方提供yaml文件“clickhouse-operator-install-bundle.yaml”创建ClickHouse Operator,其中clickhouse-operator-install-bundle.yaml来源于https://github.com/Altinity/clickhouse-operator/blob/master/deploy/operator/clickhouse-operator-install-bundle.yaml

      clickhouse-operator-install-bundle.yaml将ClickHouse Operator部署在系统命名空间kube-system中,因此ClickHouse Operator能够监控Kubernetes中所有的命名空间的相关资源。若ClickHouse Operator部署在其他命名空间中,则只会监控该特定命名空间内的资源。

      kubectl apply -f clickhouse-operator-install-bundle.yaml

      回显结果如下:

      customresourcedefinition.apiextensions.k8s.io/clickhouseinstallations.clickhouse.altinity.comcreated
      customresourcedefinition.apiextensions.k8s.io/clickhouseinstallationtemplates.clickhouse.altinity.com created
      customresourcedefinition.apiextensions.k8s.io/clickhouseoperatorconfigurations.clickhouse.altinity.com created
      ...
    2. 检查ClickHouse Operator是否创建成功。
      kubectl get pod -n kube-system | grep clickhouse

      回显结果如下,若Pod状态为Running则说明ClickHouse Operator创建成功。

      clickhouse-operator-656d67bd4d-k64gm          2/2      Running    4 (15m ago)    3d23h
    3. 通过以下命令查看集群中所有与ClickHouse相关的CRD资源。
      kubectl get crd | grep clickhouse

      回显结果如下:

      clickhouseinstallations.clickhouse.altinity.com                2024-08-20T09:30:30Z
      clickhouseinstallationtemplates.clickhouse.altinity.com        2024-08-20T09:30:30Z
      clickhousekeeperinstallations.clickhouse-keeper.altinity.com   2024-08-20T09:30:30Z
      clickhouseoperatorconfigurations.clickhouse.altinity.com       2024-08-20T09:30:30Z

  2. 创建ClickHouse集群。

    1. 创建命名空间test-clickhouse-operator。为了方便验证测试,后续的操作都将在test-clickhouse-operator内进行。
      kubectl create namespace test-clickhouse-operator
    2. 创建一个名为simple-01.yaml的YAML文件,其中simple-01.yaml为自定义名称。simple-01.yaml来源于https://raw.githubusercontent.com/Altinity/clickhouse-operator/master/docs/chi-examples/01-simple-layout-01-1shard-1repl.yaml
      vim simple-01.yaml

      ClickHouseInstallation是一个在Kubernetes集群中使用ClickHouse Operator时定义的自定义资源对象(CR),创建或更新ClickHouseInstallation资源后,ClickHouse Operator会根据这些配置自动创建和管理相应的Kubernetes资源,如StatefulSets、Services、PersistentVolumeClaims等,以确保ClickHouse集群按照预期运行。

      文件内容如下:

      apiVersion: "clickhouse.altinity.com/v1"
      kind: "ClickHouseInstallation"
      metadata:
         name: "simple-01"
      spec:
        configuration:
          users:
            # printf 'test_password' | sha256sum
            test_user/password_sha256_hex: 10a6e6cc8311a3e2bcc09bf6c199adecd5dd59408c343e926b129c4914f3cb01
            test_user/password: test_password
            # to allow access outside from kubernetes
            test_user/networks/ip:
            - 0.0.0.0/0
          clusters:
          - name: "simple"

      利用上述文件创建ClickHouse集群。

      kubectl apply -n test-clickhouse-operator -f simple-01.yaml
    3. 检查ClickHouse资源是否创建成功。
      1. 查看命名空间test-clickhouse-operator的Pod资源,若Pod状态都为Running,则说明Pod创建成功。
        kubectl get pod -n test-clickhouse-operator

        回显结果如下:

        NAME                               READY   STATUS    RESTARTS      AGE
        chi-simple-01-simple-0-0-0         2/2     Running   0             3d7h
      2. 其次,查看相关的服务资源。
        kubectl get service -n test-clickhouse-operator

        回显结果如下:

        NAME                         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
        chi-simple-01-simple-0-0     ClusterIP   None          <none>        9000/TCP,8123/TCP,9009/TCP   3d7h
        clickhouse-simple-01         ClusterIP   None          <none>        9000/TCP,8123/TCP            3d8h
      3. 连接ClickHouse DataBase。
        kubectl -n test-clickhouse-operator exec -ti chi-simple-01-simple-0-0-0 -- clickhouse-client

        若回显结果如下,则说明连接成功。输入“exit”,按下回车键,可退出ClickHouse DataBase。

        ClickHouse client version 24.8.2.3 (official build).
        Connecting to localhost:9000 as user default.
        Connected to ClickHouse server version 24.8.2.
        
        Warnings:
         * Linux transparent hugepages are set to "always". Check /sys/kernel/mm/transparent_hugepage/enabled
        
        chi-simple-01-simple-0-0-0.chi-simple-01-simple-0-0.test-clickhouse-operator.svc.cluster.local :) 

  3. 创建绑定持久化存储的ClickHouse集群。以云硬盘存储卷为例,介绍如何使用动态挂载的方式为ClickHouse集群提供持久化存储。

    动态挂载(VolumeClaimTemplate)仅支持挂载云硬盘存储和本地持久卷,并且仅有状态工作负载支持动态挂载。

    1. 创建StorageClass。

      首先,创建一个名为csi-disk-ssd.yaml的YAML文件,其中csi-disk-ssd.yaml为自定义名称。

      vim csi-disk-ssd.yaml

      文件内容如下,CCE默认支持的SAS类型的云硬盘。 若想使用其他类型的云硬盘,需要创建对应的StorageClass,StorageClass部分参数说明请参见表3

      allowVolumeExpansion: true
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: csi-disk-ssd
      provisioner: everest-csi-provisioner
      parameters:
        csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
        csi.storage.k8s.io/fstype: ext4
        everest.io/disk-volume-type: SSD
        everest.io/passthrough: "true"
      reclaimPolicy: Delete
      volumeBindingMode: Immediate
      表3 StorageClass部分参数说明

      参数

      说明

      provisioner

      存储资源提供商,CCE均由everest插件提供,此处只能填写everest-csi-provisioner。

      parameters

      存储参数,不同类型的存储支持的参数不同。详情请参见parameters参数说明

      须知:

      everest.io/disk-volume-type表示云盘类型,有多种选择。

      • SAS:高I/O。
      • SSD:超高I/O。
      • GPSSD:通用型SSD。
      • ESSD:极速型SSD。
      • GPSSD2:通用型SSD v2,everest版本为2.4.4及以上支持使用,使用时需同时指定everest.io/disk-iops和everest.io/disk-throughput注解。
      • ESSD2:极速型SSD v2,everest版本为2.4.4及以上支持使用,使用时需指定everest.io/disk-iops注解。

      默认类型:SAS。

      reclaimPolicy

      用来指定创建PV的persistentVolumeReclaimPolicy字段值,支持Delete和Retain。如果StorageClass对象被创建时没有指定reclaimPolicy,它将默认为Delete。

      • Delete:表示动态创建的PV,在PVC销毁的时候PV也会自动销毁。
      • Retain:表示动态创建的PV,在PVC销毁的时候PV不会自动销毁。

      volumeBindingMode

      表示卷绑定模式,即动态创建PV的时间,分为立即创建和延迟创建。

      • Immediate:创建PVC时完成PV绑定和动态创建。
      • WaitForFirstConsumer:延迟PV的绑定和创建,当在工作负载中使用该PVC时才执行PV创建和绑定流程。
      其次,根据csi-disk-ssd.yaml,创建名为csi-disk-ssd的StorageClass。
      kubectl create -f csi-disk-ssd.yaml
    2. 为ClickHouse集群绑定持久化存储。
      首先,创建一个名为pv-simple.yaml的YAML文件,其中pv-simple.yaml为自定义名称。
      vim pv-simple.yaml

      文件内容如下,参考https://github.com/Altinity/clickhouse-operator/blob/master/docs/chi-examples/03-persistent-volume-01-default-volume.yaml

      云硬盘存储卷只支持单个节点读写的访问模式,即accessModes需设置为ReadWriteOnce。

      apiVersion: "clickhouse.altinity.com/v1"
      kind: "ClickHouseInstallation"
      metadata:
        name: "pv-simple"
        namespace: test-clickhouse-operator
      spec:
        defaults:
          templates:
            dataVolumeClaimTemplate: data-volume-template
            logVolumeClaimTemplate: log-volume-template
        configuration:
          clusters:
            - name: "simple"
              layout:
                shardsCount: 1
                replicasCount: 1
        templates:
          volumeClaimTemplates:                   # 动态挂载
            - name: data-volume-template          # 定义数据存储卷的模板
              spec:
                accessModes:
                  - ReadWriteOnce                 # 云硬盘存储卷只支持单个节点读写的访问模式,即ReadWriteOnce
                resources:
                  requests:
                    storage: 10Gi
                storageClassName: csi-disk-ssd    # 指定使用的存储类为新建的csi-disk-ssd 
            - name: log-volume-template           # 定义的日志存储卷的模板
              spec:
                accessModes:
                  - ReadWriteOnce                 # 云硬盘存储卷只支持单个节点读写的访问模式,即ReadWriteOnce
                resources:
                  requests:
                    storage: 10Gi
                storageClassName: csi-disk-ssd    # 指定使用的存储类为新建的csi-disk-ssd 

      其次,利用pv-simple.yaml创建ClickHouse集群。

      kubectl -n test-clickhouse-operator create -f pv-simple.yaml
    3. 检查相关资源是否创建成功。
      kubectl get pod -n test-clickhouse-operator

      回显结果如下,则说明Pod创建成功。

      NAME                            READY   STATUS    RESTARTS   AGE
      chi-pv-simple-simple-0-0-0      2/2     Running   0          5m2s
      chi-simple-01-simple-0-0-0      1/1     Running   0          3d7h

      查看名为data-volume-template和log-volume-template的PVC是否创建成功。

      kubectl get pvc -n test-clickhouse-operator

      回显结果如下,STATUS为Bound则说明PVC绑定成功。

      NAME                                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      data-volume-template-chi-pv-simple-simple-0-0-0   Bound    pvc-981b1d73-a13e-41d5-aade-ea8c6b1199d7   10Gi       RWO            csi-disk-ssd   <unset>                 28s
      log-volume-template-chi-pv-simple-simple-0-0-0    Bound    pvc-fcf70a2e-131d-4da1-a9c2-eddd89887b45   10Gi       RWO            csi-disk-ssd   <unset>                 28s
    4. 检查存储卷挂载情况。

      首先,进入chi-pv-simple-simple-0-0-0容器的命令行界面。

      kubectl -n test-clickhouse-operator exec -ti chi-pv-simple-simple-0-0-0 -c clickhouse bash

      其次,输入以下命令查看存储卷挂载情况。

      df -h

      由回显结果可知,相关存储卷已挂载至ClickHouse集群。Ctrl+D可退出当前命令行界面。

      Filesystem                    Size    Used   Avail  Use% Mounted on
      overlay                        99G    5.1G     89G    6% /
      tmpfs                          64M       0     64M    0% /dev
      tmpfs                          3.9G      0    3.9G    0% /sys/fs/cgroup
      /dev/mapper/vgpaas-share       99G    5.1G     89G    6% /etc/hosts
      shm                            64M       0     64M    0% /dev/shm
      /dev/sdb                       9.8G    66M    9.8G    1% /var/lib/clickhouse
      /dev/sda                       9.8G    37M    9.8G    1% /var/log/clickhouse-server
      tmpfs                          6.3G     12K    6.3G   1% /run/secrets/kubernetes.io/serviceaccount
      tmpfs                          3.9G       0    3.9G   0% /proc/acpi
      tmpfs                          3.9G       0    3.9G   0% /proc/scsi
      tmpfs                          3.9G       0    3.9G   0% /sys/firmware
    5. 连接ClickHouse Database。
      kubectl -n test-clickhouse-operator exec -ti chi-pv-simple-simple-0-0-0 -- clickhouse-client

      回显结果如下,则说明连接ClickHouse Database成功。输入“exit”,按下回车键,可退出ClickHouse DataBase。

      Defaulted container "clickhouse" out of: clickhouse, clickhouse-log
      ClickHouse client version 24.8.2.3 (official build).
      Connecting to localhost:9000 as user default.
      Connected to ClickHouse server version 24.8.2.
      
      Warnings:
       * Linux transparent hugepages are set to "always". Check /sys/kernel/mm/transparent_hugepage/enabled
      
      chi-pv-simple-simple-0-0-0.chi-pv-simple-simple-0-0.test-clickhouse-operator.svc.cluster.local :) 

  4. 为ClickHouse集群建立弹性负载均衡(ELB),创建ELB可以方便用户访问ClickHouse集群。

    1. 创建一个名为elb.yaml的YAML文件,其中elb.yaml为自定义名称。
      vim elb.yaml

      文件内容如下,annotations kubernetes.io/elb.autocreate部分参数请参见表4

      apiVersion: "clickhouse.altinity.com/v1"
      kind: "ClickHouseInstallation"
      metadata:
        name: "ck-elb"
        namespace: test-clickhouse-operator
      spec:
        defaults:
          templates:
            dataVolumeClaimTemplate: data-volume-nas                    
            serviceTemplate: chi-service-elb                        
        configuration:
          clusters:
            - name: "ck-elb"
              templates:
                podTemplate: pod-template-with-nas
              layout:
                shardsCount: 1
                replicasCount: 1
        templates:
          podTemplates:
            - name: pod-template-with-nas
              spec:
                containers:
                  - name: clickhouse
                    image: clickhouse/clickhouse-server:23.8
                    volumeMounts:
                      - name: data-volume-nas
                        mountPath: /var/lib/clickhouse
          volumeClaimTemplates:               # 数据卷声明模板,指定存储访问模式、请求的存储的大小和存储类
            - name: data-volume-nas
              spec:
                accessModes:
                  - ReadWriteOnce
                resources:
                  requests:
                    storage: 20Gi
                storageClassName: csi-disk-ssd
          serviceTemplates:                  # 服务模板
            - name: chi-service-elb 
              metadata:
                annotations:
                  # 表示负载均衡器类型,union(默认值)-共享型负载均衡,performance-独享型负载均衡
                  kubernetes.io/elb.class: union   
                  # 自动创建Ingress关联的ELB,定义用于配置负载均衡器的相关参数
                  kubernetes.io/elb.autocreate: >-                             
                    {"type":"public","bandwidth_name":"cce-bandwidth-ck","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp"}
              spec:
                ports:
                  - name: http
                    port: 8123
                  - name: client
                    port: 9000
                type: LoadBalancer             # 服务类型被设置为负载均衡器
      表4 kubernetes.io/elb.autocreate部分参数说明

      参数

      是否必填

      参数类型

      描述

      type

      String

      负载均衡实例网络类型,公网或者私网。

      • public :公网型负载均衡。
      • inner :私网型负载均衡。

      默认类型:inner。

      bandwidth_name

      公网型负载均衡必填

      String

      带宽的名称,默认值为:cce-bandwidth-******。

      取值范围:只能由中文、英文字母、数字、下划线、中划线、点组成,且长度范围为1-64个字符。

      bandwidth_chargemode

      String

      带宽付费模式。

      • bandwidth :按带宽计费。
      • traffic :按流量计费。

      默认类型:bandwidth。

      bandwidth_size

      公网型负载均衡必填

      Integer

      带宽大小,默认1Mbit/s~2000Mbit/s,请根据Region带宽支持范围设置。

      调整带宽时的最小单位会根据带宽范围不同存在差异。

      • 小于等于300Mbit/s:默认最小单位为1Mbit/s。
      • 大于300Mbit/s且小于等于1000Mbit/s:默认最小单位为50Mbit/s。
      • 大于1000Mbit/s:默认最小单位为500Mbit/s。

      bandwidth_sharetype

      公网型负载均衡必填

      String

      带宽共享方式,PER表示独享带宽。

      eip_type

      公网型负载均衡必填

      String

      弹性公网IP类型。

      • 5_telcom:电信。
      • 5_union:联通。
      • 5_bgp:全动态BGP。
      • 5_sbgp:静态BGP。

      具体类型以各区域配置为准,详情请参见弹性公网IP控制台。

    2. 根据elb.yaml创建ClickHouse集群。
      kubectl create -f elb.yaml -n test-clickhouse-operator
    3. 检验相关资源是否创建成功。
      kubectl get pod -n test-clickhouse-operator

      回显结果如下,则说明ClickHouseInstallation创建成功。

      NAME                            READY   STATUS    RESTARTS   AGE
      chi-ck-elb-ck-elb-0-0-0         1/1     Running   0          3m4s
      chi-pv-simple-simple-0-0-0      2/2     Running   0          33m
      chi-simple-01-simple-0-0-0      1/1     Running   0          3d7h

      利用以下命令查看负载均衡服务是否创建成功。

      kubectl get svc -n test-clickhouse-operator

      回显结果如下,则说明创建成功。

      NAME                          TYPE          CLUSTER-IP     EXTERNAL-IP    PORT(S)                          AGE
      chi-ck-elb-ck-elb-0-0         ClusterIP     None           <none>         9000/TCP,8123/TCP,9009/TCP       2s
      chi-pv-simple-simple-0-0      ClusterIP     None           <none>         9000/TCP,8123/TCP,9009/TCP       35m
      chi-simple-01-simple-0-0      ClusterIP     None           <none>         9000/TCP,8123/TCP,9009/TCP       38m
      clickhouse-pv-simple          ClusterIP     None           <none>         8123/TCP,9000/TCP                35m
      clickhouse-simple-01          ClusterIP     None           <none>         8123/TCP,9000/TCP                3d7h
    4. 连接ClickHouse Database。
      kubectl -n test-clickhouse-operator exec -ti chi-ck-elb-ck-elb-0-0-0 -- clickhouse-client

      回显结果如下,则说明连接ClickHouse Database成功。输入“exit”,按下回车键,可退出ClickHouse DataBase。

      ClickHouse client version 23.8.16.16 (official build).
      Connecting to localhost:9000 as user default.
      Connected to ClickHouse server version 23.8.16 revision 54465.
      
      Warnings:
       * Linux transparent hugepages are set to "always". Check /sys/kernel/mm/transparent_hugepage/enabled
      
      chi-ck-elb-ck-elb-0-0-0.chi-ck-elb-ck-elb-0-0.test-clickhouse-operator.svc.cluster.local :) 

  5. 集群清理。

    1. 利用以下命令删除ELB。
      kubectl delete -f elb.yaml  -n test-clickhouse-operator

      回显结果如下:

      clickhouseinstallation.clickhouse.altinity.com "ck-elb1" deleted
    2. 利用以下命令删除持久化存储相关PV和PVC。
      kubectl delete -f pv-simple.yaml -n test-clickhouse-operator

      回显结果如下:

      clickhouseinstallation.clickhouse.altinity.com "pv-simple" deleted
    3. 利用以下命令删除ClickHouse集群。
      kubectl delete -f simple-01.yaml -n test-clickhouse-operator

      回显结果如下:

      clickhouseinstallation.clickhouse.altinity.com "simple-01" deleted
    4. 利用以下命令删除命名空间test-clickhouse-operator。
      kubectl delete namespace test-clickhouse-operator

      回显结果如下:

      namespace "test-clickhouse-operator" deleted
    5. 利用以下命令删除ClickHouse Operator。
      kubectl delete -f clickhouse-operator-install-bundle.yaml

      回显结果如下:

      customresourcedefinition.apiextensions.k8s.io "clickhouseinstallations.clickhouse.altinity.com" deleted
      customresourcedefinition.apiextensions.k8s.io "clickhouseinstallationtemplates.clickhouse.altinity.com" deleted
      customresourcedefinition.apiextensions.k8s.io "clickhouseoperatorconfigurations.clickhouse.altinity.com" deleted
      customresourcedefinition.apiextensions.k8s.io "clickhousekeeperinstallations.clickhouse-keeper.altinity.com" deleted
      ...

相关文档