创建实例

Alauda Data Services Analytical Database E1 的一个实例是一个 ClickHouseInstallation (CHI) 资源。operator 会将其转换为 StatefulSets、Services、ConfigMaps 和 PersistentVolumeClaims。

前提条件

  • operator 已安装并正在运行。它以 OLM bundle 的形式提供,其 package name 为 clickhouse-operator,随附的安装 manifest 会将其放置在 operators namespace 中。
  • 如果需要持久化数据,则需要 StorageClass。如果没有 volume claim template,数据目录会位于 pod 的可写层中,并会在重启时丢失。
  • 正在运行的 ZooKeeper-compatible quorum,在需要 replication 或 ON CLUSTER DDL 时需要。请参阅配置复制集群
WARNING

请勿应用 operator repository 中的 kustomize-config/samples/sample.yaml。它硬编码了 namespace,固定使用 2021 operand image,并设置了 log volume claim template,却没有匹配的 container security context,因此在启用了 Pod Security Admission restricted 的 namespace 中会被拒绝。请使用本页面上的 manifest。

最小实例

一个 shard、一个 replica 和一个 20 GiB 数据卷:

apiVersion: clickhouse.altinity.com/v1
kind: ClickHouseInstallation
metadata:
  name: e1-demo
spec:
  defaults:
    templates:
      dataVolumeClaimTemplate: data-volume
  configuration:
    clusters:
      - name: main
        layout:
          shardsCount: 1
          replicasCount: 1
  templates:
    volumeClaimTemplates:
      - name: data-volume
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 20Gi

将其应用到要运行数据库的 namespace 中:

kubectl -n <namespace> apply -f e1-demo.yaml

请注意该 manifest 中没有的内容:其中没有 container image。请将其省略。当 pod template 未指定 image 时,operator 会使用安装时配置的 operand image;该 image 从 CK_SERVER_IMAGE 环境变量中读取,并在前面加上 HARBOR 中的 registry。若 CK_SERVER_IMAGE 为空,operator 将拒绝启动,并明确指出该变量名称。

WARNING

对于由 ACP 提供的安装,请保持 HARBOR 值与 package 设置的值完全一致。平台会在 admission 时将 operand image 引用重写为其自身的 registry,并且仅适用于它所期望的确切格式;更改 registry 会导致 image 拉取失败,包括在 air-gapped 环境中。

operator 创建的内容

对于上述 manifest,在 namespace <namespace> 中:

对象名称备注
StatefulSetchi-e1-demo-main-0-0每个主机一个。始终为 replicas: 1
Podchi-e1-demo-main-0-0-0StatefulSet 的唯一 pod。
Service(实例)clickhouse-e1-demo端口 http/8123 和 tcp/9000。
Service(每个主机)chi-e1-demo-main-0-0无头 Service。
ConfigMapchi-e1-demo-common-configd共享的服务器设置,渲染到 config.d
ConfigMapchi-e1-demo-common-usersd用户、配置文件、配额,渲染到 users.d
ConfigMapchi-e1-demo-deploy-confd-main-0-0每个主机的设置,渲染到 conf.d
PVC从 claim template 和主机派生挂载到 /var/lib/clickhouse
PodDisruptionBudget每个实例在每次 reconcile 开始时创建。

“主机”是一个 shard-从节点对。shardsCount × replicasCount 给出主机数量,每个主机都有自己的 StatefulSet,并且恰好包含一个 pod——CRD 明确说明:“每个 replica 都是一个独立的 StatefulSet,其中仅包含一个 Pod”。扩容通过添加主机完成,而不是提高 StatefulSet 的 replica 数量。

多 shard 实例

三个 shard,不进行复制,因此不需要 ZooKeeper:

apiVersion: clickhouse.altinity.com/v1
kind: ClickHouseInstallation
metadata:
  name: e1-sharded
spec:
  defaults:
    templates:
      dataVolumeClaimTemplate: data-volume
      podTemplate: ch-pod
  configuration:
    clusters:
      - name: main
        layout:
          shardsCount: 3
          replicasCount: 1
  templates:
    podTemplates:
      - name: ch-pod
        spec:
          securityContext:
            runAsUser: 101
            runAsGroup: 101
            fsGroup: 101
            runAsNonRoot: true
            seccompProfile:
              type: RuntimeDefault
          containers:
            - name: clickhouse
              resources:
                requests:
                  cpu: "2"
                  memory: 8Gi
                limits:
                  cpu: "4"
                  memory: 16Gi
              securityContext:
                allowPrivilegeEscalation: false
                readOnlyRootFilesystem: true
                capabilities:
                  drop:
                    - ALL
    volumeClaimTemplates:
      - name: data-volume
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 100Gi

pod template 中的容器必须命名为 clickhouse,才能被视为服务器容器。uid/gid 101 与构建服务器 image 时使用的用户一致。

请为服务器设置一个经过规划的内存限制。限制过小会产生 OOMKilled,随后产生 CrashLoopBackOff——operator repository 提供了该确切故障的示例,其内存限制为 32 MiB。

顶层 spec 中的实用字段

字段作用
taskID为更新命名,以便你可以在 status.taskIDsStarted / status.taskIDsCompleted 中跟踪它。未设置时,每次更新使用随机名称。
stop"1" 将每个 StatefulSet 设置为 Replicas: 0。Pod 和实例 Service 会消失,但 PVC 会保留。"0" 会使用保留的 PVC 将它们恢复。
restart"RollingUpdate" 会触发平滑的滚动重启。之后请移除此字段,否则后续编辑会导致不必要的重启。
troubleshoot"1" 会在服务器无法启动时保持 Pod 运行。
namespaceDomainPattern自定义集群 DNS 后缀。默认值为 %s.svc.cluster.local
defaults.replicasUseFQDN<host> 条目是否使用 FQDN。默认为 "yes"
defaults.storageManagement.reclaimPolicyDelete(默认)或 RetainRetain 会在删除 StatefulSet 时保留 PVC。

验证

检查 Pod 和 StatefulSet,而不仅仅是资源状态:

kubectl -n <namespace> get chi e1-demo
kubectl -n <namespace> get statefulset,pod -l clickhouse.altinity.com/chi=e1-demo
kubectl -n <namespace> exec chi-e1-demo-main-0-0-0 -c clickhouse -- \
  clickhouse-client -q "SELECT 1"

当每个 StatefulSet 报告的 ReadyReplicas 等于其所需的副本数时,实例即为健康状态——这正是 operator 自身使用的就绪检查。有关较旧版本中仅状态字段不足以判断实例健康状况的原因,请参阅实例报告为 Completed,但 Pod 不健康


ClickHouse 是 ClickHouse, Inc. 的注册商标。https://clickhouse.com

Alauda 是独立供应商。本产品与 ClickHouse, Inc. 没有关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,本文仅出于标识目的使用。