在K8S上使用Clickhouse

作者:俊达

介绍

clickhouse是一款开源的分析型数据库,性能强大。本文介绍如何在K8S环境中部署和使用clickhouse。

我们使用开源的clickhouse operator: https://github.com/Altinity/clickhouse-operator

相关依赖:

  • k8s 1.15+。我们使用了k8s 1.20。8C16G 3节点。

  • 存储CSI。我们使用了nfs。nfs仅用作测试,生产环境不建议使用nfs作为数据库存储

安装部署

1、下载operator相关代码

wget https://github.com/Altinity/clickhouse-operator/archive/refs/tags/0.18.4.tar.gz

下载的文件解压后,主要有几个目录

  • deploy: 包含operator安装、zookeeper安装相关文件和脚本

  • docs:clickhouse集群的各种配置样例

  • cmd, pkg: operator源代码。这里我们先不关注源代码

2、安装operator

安装脚本:

bash 复制代码
deploy/operator/clickhouse-operator-install.sh

默认会把operator安装到kube-system命名空间下。

bash 复制代码
# kubectl get po -n kube-system | grep click
clickhouse-operator-994c5bb44-g9t9s        2/2     Running   2          24h

除此之外,脚本还会创建相关的CRD

bash 复制代码
# kubectl get crd | grep click
clickhouseinstallations.clickhouse.altinity.com            2022-04-19T07:43:25Z
clickhouseinstallationtemplates.clickhouse.altinity.com    2022-04-19T07:43:25Z
clickhouseoperatorconfigurations.clickhouse.altinity.com   2022-04-19T07:43:25Z

CRD:

  • clickhouseinstallations: 描述一个clickhouse安装。

  • clickhouseinstallationtemplates:

  • clickhouseoperatorconfigurations:

3、安装zookeeper

clickhouse的分布式DDL( on cluster)、表复制等功能依赖zookeeper。可以使用外置的zookeeper集群,或者使用k8s集群中的zookeeper。

这里使用了下面这个脚本创建3节点的zookeeper集群:

bash 复制代码
deploy/zookeeper/quick-start-persistent-volume/zookeeper-3-nodes-create.sh
bash 复制代码
# kubectl get po -n zoo3ns
NAME          READY   STATUS    RESTARTS   AGE
zookeeper-0   1/1     Running   2          23h
zookeeper-1   1/1     Running   1          23h
zookeeper-2   1/1     Running   0          23h

# kubectl get svc -n zoo3ns
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
zookeeper    ClusterIP   10.104.149.244   <none>        2181/TCP,7000/TCP   23h
zookeepers   ClusterIP   None             <none>        2888/TCP,3888/TCP   23h

脚本执行成功后,可以看到zookeeper的pod和service。

clickhouse配置文件中,可以使用这里的service来配置zookeeper连接。

4、安装clickhouse集群

docs/chi-examples 目录提供了大量clickhouse集群配置的样列yaml。

我们这里创建一个多分片、多副本、多集群的clickhouse环境,并以此为例来介绍clickhouse的核心概念、配置项。

clickhouse yaml文件:

bash 复制代码
apiVersion: "clickhouse.altinity.com/v1"
kind: "ClickHouseInstallation"
metadata:
  name: "ck-cluster-x"
spec:
  configuration:
    users:
      user2/networks/ip: "::/0"
      user2/password: qwerty
      user2/profile: default
    zookeeper:
      nodes:
        - host: 10.104.149.244
    clusters:
      - name: "ck-cluster-1"
        layout:
          shardsCount: 2
          replicasCount: 2
      - name: "ck-cluster-2"
        layout:
          shardsCount: 2
          replicasCount: 2
  defaults:
    templates:
      # Templates are specified as default for all clusters
      podTemplate: pod-template-resource-limit
      hostTemplate: host-template-custom-ports

  templates:

    hostTemplates:
      - name: host-template-custom-ports
        spec:
          tcpPort: 7000
          httpPort: 7001
          interserverHTTPPort: 7002

    podTemplates:
      - name: pod-template-resource-limit
        spec:
          containers:
            - name: clickhouse
              image: clickhouse/clickhouse-server:22.3
              volumeMounts:
                - name: clickhouse-data-storage
                  mountPath: /var/lib/clickhouse
              # Container has explicitly specified resource limits
              resources:
                requests:
                  memory: "1024Mi"
                  cpu: "500m"
                limits:
                  memory: "1024Mi"
                  cpu: "500m"

    volumeClaimTemplates:
      - name: clickhouse-data-storage
        spec:
          accessModes:
            - ReadWriteOnce
          # VolumeClaim has explicitly specified resource limits
          resources:
            requests:
              storage: 500Mi

关键配置描述如下:

  1. Zookeeper配置:
  • configuration.zookeeper: 配置Zookeeper。可指定多个节点。这里使用了Service IP: 10.104.149.244,默认端口。
  1. 用户账号:
  • users: 列出用户账号。
  1. 集群配置:
  • clusters: ClickHouse中的集群是一个特殊概念,可配置多个集群。
    • name: 集群名称。
    • layouts: 设置集群的分片数和副本数。
      • shardsCount: 分片数量。
      • replicasCount: 副本数量。
  1. 默认设置:
  • defaults: 默认配置。
    • templates: 指定ClickHouse相关模版,如Pod、PVC等。这里设置对应的模版名称,具体模版在templates中定义。
      • podTemplate: 可设置Pod的镜像、资源限制等参数。
      • hostTemplate: 配置ClickHouse的监听端口,一般可使用默认端口。
  1. 模版定义:
  • templates: 定义各种模版。
    • hostTemplates: 主机模版。
    • podTemplates: Pod模版,其中memory设置稍微大一些(1G),以防止可能的OOM。
    • volumeClaimTemplates: 持久卷声明模版。

创建clickhouse:

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

创建完成后,可以看到:

clickhouseinstallations:

2个集群,8个节点。完成状态。

bash 复制代码
# kubectl get clickhouseinstallations
NAME           CLUSTERS   HOSTS   STATUS      AGE
ck-cluster-x   2          8       Completed   86m

pod

总共启动了8个pod,

bash 复制代码
# kubectl get pod
NAME                                               READY   STATUS    RESTARTS   AGE
chi-ck-cluster-x-ck-cluster-1-0-0-0                1/1     Running   0          81m
chi-ck-cluster-x-ck-cluster-1-0-1-0                1/1     Running   0          79m
chi-ck-cluster-x-ck-cluster-1-1-0-0                1/1     Running   0          78m
chi-ck-cluster-x-ck-cluster-1-1-1-0                1/1     Running   0          76m
chi-ck-cluster-x-ck-cluster-2-0-0-0                1/1     Running   0          75m
chi-ck-cluster-x-ck-cluster-2-0-1-0                1/1     Running   0          73m
chi-ck-cluster-x-ck-cluster-2-1-0-0                1/1     Running   0          71m
chi-ck-cluster-x-ck-cluster-2-1-1-0                1/1     Running   0          69m

sts

每个sts对应一个pod。

bash 复制代码
# kubectl get sts
NAME                                READY   AGE
chi-ck-cluster-x-ck-cluster-1-0-0   1/1     89m
chi-ck-cluster-x-ck-cluster-1-0-1   1/1     88m
chi-ck-cluster-x-ck-cluster-1-1-0   1/1     88m
chi-ck-cluster-x-ck-cluster-1-1-1   1/1     88m
chi-ck-cluster-x-ck-cluster-2-0-0   1/1     87m
chi-ck-cluster-x-ck-cluster-2-0-1   1/1     87m
chi-ck-cluster-x-ck-cluster-2-1-0   1/1     87m
chi-ck-cluster-x-ck-cluster-2-1-1   1/1     86m

services

每个pod对应一个service。

此外还有一个LoadBalancer类型的service。

bash 复制代码
# kubectl get svc
NAME                                TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE
chi-ck-cluster-x-ck-cluster-1-0-0   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      90m
chi-ck-cluster-x-ck-cluster-1-0-1   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      90m
chi-ck-cluster-x-ck-cluster-1-1-0   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      90m
chi-ck-cluster-x-ck-cluster-1-1-1   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      89m
chi-ck-cluster-x-ck-cluster-2-0-0   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      89m
chi-ck-cluster-x-ck-cluster-2-0-1   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      89m
chi-ck-cluster-x-ck-cluster-2-1-0   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      88m
chi-ck-cluster-x-ck-cluster-2-1-1   ClusterIP      None             <none>        7001/TCP,7000/TCP,7002/TCP      88m
clickhouse-ck-cluster-x             LoadBalancer   10.100.145.161   <pending>

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

相关推荐
IT大白鼠6 小时前
Ingress 与 Ingress-Controller:K8s 七层 HTTP 反向代理技术详解与实践
http·容器·kubernetes
java_logo7 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·docker·容器·rocky linux·基础镜像·轩辕镜像·rhel 兼容
IT大白鼠13 小时前
Istio 结合 K8s 实现流量管理:服务网格灰度、熔断、限流实战
云原生·kubernetes·istio
鹤落晴春13 小时前
【K8s】认识Kubernetes API:从CRD出发的一次梳理
云原生·容器·kubernetes
yanwumuxi14 小时前
Docker记录:误删宿主机挂载目录导致 PostgreSQL 数据丢失
docker·postgresql·容器
cui_hao_nan16 小时前
Docker 学习 5
docker·容器
A黄俊辉A16 小时前
两分钟上手docker
运维·docker·容器
努力努力再努力wz19 小时前
【Docker入门系列】:从架构演进到容器化:一文建立 Docker、虚拟化与 Namespace 的底层心智模型
运维·开发语言·数据结构·c++·docker·容器·架构
吴佳浩 Alben19 小时前
多智能体系统的通信风暴与死锁治理:生产级降级与容灾方案
人工智能·docker·ai·容器·架构
玉&心20 小时前
在dockers desktop上面部署k8s的前端和后端
云原生·容器·kubernetes