容器化 | ClickHouse on K8s 部署篇【建議收藏】

語言: CN / TW / HK

作者:蘇厚鎮 青雲科技數據庫研發工程師

目前從事 RadonDB ClickHouse 相關工作,熱衷於研究數據庫內核。

延續上篇《容器化 ClickHouse on K8s 基本概念解析篇》,可以瞭解到 Operator 提供簡便管理 ClickHouse 集羣功能,Helm 提供便捷部署集羣功能。

本篇將以部署 RadonDB ClickHouse[1] 作為示例。在同樣選用 Operator 的條件下,比較Kubectl 和 Helm 兩種方式在 K8s 上部署 ClickHouse 集羣的便捷性。並簡要介紹如何在 K8s 上通過 Operator 輕便快速地管理 ClickHouse 集羣。

| 使用 Kubectl + Operator 部署

前置條件

  • 已安裝 Kubernetes 集羣。

部署步驟

1、部署 RadonDB ClickHouse Operator

$ kubectl apply -f https://github.com/radondb/radondb-clickhouse-kubernetes/clickhouse-operator-install.yaml

注意:若需 Operator 監控所有的 Kubernetes namespace,則需將其部署在 kube-system namespace 下。否則只會監控部署到的 namespace。

2、編寫 CR 的部署文件

以下 yaml 文件描述了應用 RadonDB ClickHouse Operator 安裝兩分片兩副本集羣的 ClickHouse 的配置規範。

apiVersion: "clickhouse.radondb.com/v1"
kind: "ClickHouseInstallation"  # 應用 Operator 創建集羣
metadata:
  name: "ClickHouse"
spec:
  defaults:
 templates:                  # 磁盤掛載
   dataVolumeClaimTemplate: data
   logVolumeClaimTemplate: data
  configuration:
    clusters:                   # 集羣節點描述,三分片兩副本
      - name: "replicas"
        layout:
          shardsCount: 2
          replicasCount: 2
  templates:
     volumeClaimTemplates:   # 磁盤信息描述
       - name: data
            reclaimPolicy: Retain
         spec:
           accessModes:
             - ReadWriteOnce
           resources:
             requests:
               storage: 10Gi

3、使用 Kubectl 部署

以 test 名稱空間為例:

$ kubectl -n test apply -f hello-kubernetes.yaml
clickhouseinstallation.clickhouse.radondb.com/ClickHouse created

注意:若 RadonDB ClickHouse Operator 沒有部署在 kube-system 中,則需要將 RadonDB ClickHouse 集羣與 Operator 部署在同一名稱空間。

部署成功後,Kubernetes 會將 CR 信息存入 etcd 中,而 Operator 則將感知 etcd 的變化。當 Operator 獲取 CR 變化內容時,將根據 CR 的內容創建對應的 StatefulSet、Service 等相關內容。

4、查看集羣的運行情況

可獲取四個正在運行的 RadonDB ClickHouse Pod,組成兩片兩副本的集羣,同時提供一個 LoadBalancer SVC,供外部訪問使用。

# 查看 Pod 運行狀態
$ kubectl get pods -n test
NAME                               READY   STATUS    RESTARTS   AGE
pod/chi-ClickHouse-replicas-0-0-0   1/1     Running   0          3m13s
pod/chi-ClickHouse-replicas-0-1-0   1/1     Running   0          2m51s
pod/chi-ClickHouse-replicas-1-0-0   1/1     Running   0          2m34s
pod/chi-ClickHouse-replicas-1-1-0   1/1     Running   0          2m17s

# 查看 SVC 運行狀態
$ kubectl get service -n test
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
service/chi-ClickHouse-replicas-0-0   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      2m53s
service/chi-ClickHouse-replicas-0-1   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      2m36s
service/chi-ClickHouse-replicas-1-0   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      2m19s
service/chi-ClickHouse-replicas-1-1   ClusterIP      None            <none>        8123/TCP,9000/TCP,9009/TCP      117s
service/clickhouse-ClickHouse         LoadBalancer   10.96.137.152   <pending>     8123:30563/TCP,9000:30615/TCP   3m14s

至此,如何使用 Kubectl + Operator 的方式部署 RadonDB ClickHouse 集羣便介紹完畢,可看到整個過程還是需要一定 K8s 知識 “功底” 的。

| 使用 Helm + Operator 部署

前置條件

  • 已安裝 Kubernetes 集羣;
  • 已安裝 Helm 包管理工具。

部署步驟

1、添加 RadonDB ClickHouse 的 Helm 倉庫

$ helm repo add ck https://radondb.github.io/radondb-clickhouse-kubernetes/
$ helm repo update

2、部署 RadonDB ClickHouse Operator

$ helm install clickhouse-operator ck/clickhouse-operator

3、部署 RadonDB ClickHouse 集羣

$ helm install clickhouse ck/clickhouse-cluster

4、查看集羣的運行情況

可獲取六個正在運行的 RadonDB ClickHouse Pod,以及三個 Zookeeper Pod,組成三分片兩副本的集羣,同時提供一個 ClusterIP service,供訪問使用。如果需要在外部對集羣進行訪問,此處可通過 kubectl edit service/clickhouse-ClickHouse 將 service 的類型自行修改為 NodePort 或 LoadBalancer。

# 查看 Pod 運行狀態
$ kubectl get pods -n test
NAME                                READY   STATUS    RESTARTS   AGE
pod/chi-ClickHouse-replicas-0-0-0   2/2     Running   0          3m13s
pod/chi-ClickHouse-replicas-0-1-0   2/2     Running   0          2m51s
pod/chi-ClickHouse-replicas-1-0-0   2/2     Running   0          2m34s
pod/chi-ClickHouse-replicas-1-1-0   2/2     Running   0          2m17s
pod/chi-ClickHouse-replicas-2-0-0   2/2     Running   0          115s
pod/chi-ClickHouse-replicas-2-1-0   2/2     Running   0          48s
pod/zk-clickhouse-cluster-0         1/1     Running   0          3m13s
pod/zk-clickhouse-cluster-1         1/1     Running   0          3m13s
pod/zk-clickhouse-cluster-2         1/1     Running   0          3m13s

# 查看 SVC 運行狀態
$ kubectl get service -n test
NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
service/chi-ClickHouse-replicas-0-0   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      2m53s
service/chi-ClickHouse-replicas-0-1   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      2m36s
service/chi-ClickHouse-replicas-1-0   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      2m19s
service/chi-ClickHouse-replicas-1-1   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      117s
service/chi-ClickHouse-replicas-2-0   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      50s
service/chi-ClickHouse-replicas-2-1   ClusterIP   None            <none>        8123/TCP,9000/TCP,9009/TCP      13s
service/clickhouse-ClickHouse         ClusterIP   10.96.137.152   <none>        8123/TCP,9000/TCP               3m14s
service/zk-client-clickhouse-cluster  ClusterIP   10.107.33.51    <none>        2181/TCP,7000/TCP               3m13s
service/zk-server-clickhouse-cluster  ClusterIP   None            <none>        2888/TCP,3888/TCP               3m13s

至此 ,通過 Helm 方式部署 RadonDB ClickHouse on Kubernetes 集羣完畢,可以看到 Helm 部署方式相對更方便和簡捷。簡化了 CR 部署文件配置過程,無需掌握全部 Kubernetes 的 Yaml 語法和 CR 部署文件各參數含義,可以通過打包應用快速部署。

| 使用 Operator 管理 RadonDB ClickHouse 集羣

上面演示瞭如何使用 Operator 部署 RadonDB ClickHouse 集羣,下面我們來驗證一下 Operator 管理集羣的功能。

添加分片

如果需要給 ClickHouse 添加一個額外的分片應該怎麼操作呢?此時只需要修改我們部署的 CR 即可。

$ kubectl get chi -n test
NAME         CLUSTERS   HOSTS   STATUS
clickhouse   1          6       Completed

$ kubectl edit chi/clickhouse -n test
# 這裏我們僅截取需要修改的內容
spec:
  configuration:
    clusters:
      - name: "replicas"
        layout:
          shardsCount: 4        # 將分片改為 4
          replicasCount: 2

修改成功後,Kubernetes 會將 CR 信息存入 etcd 中,而 Operator 則將感知 etcd 的變化。當 Operator 獲取 CR 變化內容時,將根據 CR 的內容創建對應的 StatefulSet、Service 等相關內容。

下面查看 RadonDB ClickHouse 集羣的運行情況,可以看到增加了兩個 RadonDB ClickHouse Pod,完成集羣分片的增加。

$ kubectl get pods -n test
NAME                               READY   STATUS    RESTARTS   AGE
pod/chi-ClickHouse-replicas-0-0-0   1/1     Running   0          14m
pod/chi-ClickHouse-replicas-0-1-0   1/1     Running   0          14m
pod/chi-ClickHouse-replicas-1-0-0   1/1     Running   0          13m
pod/chi-ClickHouse-replicas-1-1-0   1/1     Running   0          13m
pod/chi-ClickHouse-replicas-2-0-0   1/1     Running   0          13m
pod/chi-ClickHouse-replicas-2-1-0   1/1     Running   0          12m
pod/chi-ClickHouse-replicas-3-0-0   1/1     Running   0          102s
pod/chi-ClickHouse-replicas-3-1-0   1/1     Running   0          80s

硬盤擴容

同樣的,如果需要給 ClickHouse Pods 進行擴容,也只需修改 CR 即可。

$ kubectl get chi -n test
NAME         CLUSTERS   HOSTS   STATUS
clickhouse   1          8       Completed

$ kubectl edit chi/clickhouse -n test

以修改存儲容量為 20 Gi 為例。

volumeClaimTemplates:
- name: data
  reclaimPolicy: Retain
  spec:
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 20Gi 

修改成功後,Operator 將自動申請擴容,重建 StatefulSet,並掛載擴容後的硬盤。

通過查看集羣的 PVC 掛載情況,可以看到硬盤已經更新為 20Gi 容量。

$ kubectl get pvc -n clickhouse
NAME                                          STATUS   VOLUME   CAPACITY   ACCESS MODES
data-chi-clickhouse-cluster-all-nodes-0-0-0   Bound    pv4      20Gi       RWO         
data-chi-clickhouse-cluster-all-nodes-0-1-0   Bound    pv5      20Gi       RWO         
data-chi-clickhouse-cluster-all-nodes-1-0-0   Bound    pv7      20Gi       RWO         
data-chi-clickhouse-cluster-all-nodes-1-1-0   Bound    pv6      20Gi       RWO         
...

結語

至此,我們便了解到在 Kubernetes 平台上部署 RadonDB ClickHouse 集羣的兩種方法,以及 Operator 管理 ClickHouse 集羣的基本操作。

下期預告

有關 ClickHouse Operator 項目的更多具體細節、原理、代碼架構等。盡請期待……

參考

[1]. RadonDB ClickHouse:https://github.com/radondb/radondb-clickhouse-kubernetes

關於 RadonDB

RadonDB開源社區 是一個面向雲原生、容器化的數據庫開源社區。為數據庫技術愛好者提供圍繞主流開源數據庫(MySQL、PostgreSQL、Redis、MongoDB、ClickHouse 等)的技術分享平台,並提供企業級 RadonDB 開源產品及服務。

目前 RadonDB 開源數據庫系列產品已被 光大銀行、浦發硅谷銀行、哈密銀行、泰康保險、太平保險、安盛保險、陽光保險、百年人壽、安吉物流、安暢物流、藍月亮、天財商龍、羅克佳華、升哲科技、無錫匯跑體育、北京電信、江蘇交通控股、四川航空、昆明航空、國控生物 等上千家企業及社區用户採用。

RadonDB 可基於雲平台與 Kubernetes 容器平台交付,不僅提供覆蓋多場景的數據庫產品解決方案,而且提供專業的集羣管理和自動化運維能力,主要功能特性包括:高可用主從切換、數據強一致性、讀寫分離、一鍵安裝部署、多維指標監控&告警、彈性擴容&縮容、橫向自由擴展、自動備份&恢復、同城多活、異地災備 等。RadonDB 僅需企業及社區用户專注於業務層邏輯開發,無需關注集羣高可用選型、管理和運維等複雜問題,幫助企業及社區用户大幅度提升業務開發與價值創新的效率!

GitHub:https://github.com/radondb

微信羣: 請搜索添加羣助手微信號 radondb