作者:蘇厚鎮 青雲科技數據庫研發工程師
目前從事 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