访问实例

客户端通过 operator 创建的 Service 访问 Alauda Data Services Analytical Database E1,并使用您在实例 spec 中声明的用户进行身份验证。

Service

默认创建两种 Service:

Service名称类型用途
实例范围clickhouse-<instance>LoadBalancer,外部流量策略为 Local客户端入口点。仅选择已就绪的主机。
每个主机chi-<instance>-<cluster>-<shard>-<replica>无头(ClusterIP: None),发布未就绪地址稳定的 Pod 级 DNS。用于复制以及定位单个主机。

除非您提供 clusterServiceTemplateshardServiceTemplate,否则不会创建集群级和分片级 Service。没有这些模板就不存在此类对象,因此不要针对其名称编写客户端配置。

WARNING

实例范围的 Service 默认类型为 LoadBalancer。在没有负载均衡器提供程序的集群上,它将无限期地处于没有外部地址的状态。如果您只希望进行集群内访问,请使用 Service 模板覆盖其类型:

spec:
  defaults:
    templates:
      serviceTemplate: internal
  templates:
    serviceTemplates:
      - name: internal
        spec:
          type: ClusterIP
          ports:
            - name: http
              port: 8123
            - name: tcp
              port: 9000

Service 模板中的端口号会经过验证,必须介于 1 和 65535 之间。

端口

端口名称协议
8123httpHTTP 接口
9000tcp原生协议
9009interserver从节点到从节点的数据交换。不是客户端端口。

连接

集群内原生协议:

kubectl -n <namespace> run ch-client --rm -it --restart=Never \
  --image=<server-image> -- \
  clickhouse-client -h clickhouse-<instance>.<namespace>.svc.cluster.local \
  -u <user> --password <password>

集群内 HTTP:

curl "http://clickhouse-<instance>.<namespace>.svc.cluster.local:8123/" \
  -u "<user>:<password>" --data-binary "SELECT version()"

定位到某个特定主机,例如检查单个从节点:

kubectl -n <namespace> exec chi-<instance>-<cluster>-0-0-0 -c clickhouse -- \
  clickhouse-client -q "SELECT hostName(), uptime()"

用户

用户、配置文件和配额在 spec.configuration 下声明,并呈现到服务器的 users.d 目录中。spec.configuration.settings 下的设置则呈现到 config.d 中。

apiVersion: clickhouse.altinity.com/v1
kind: ClickHouseInstallation
metadata:
  name: e1-users
spec:
  configuration:
    users:
      # plain password — acceptable only for non-production
      app/password: <password>
      app/networks/ip:
        - "10.0.0.0/8"
      app/profile: app_profile
      app/quota: app_quota
      app/allow_databases/database:
        - analytics
      # preferred: SHA-256 hex of the password
      admin/password_sha256_hex: <sha256-hex>
      admin/networks/ip:
        - "::/0"
      reporting/profile: readonly
    profiles:
      app_profile/max_memory_usage: "10000000000"
      readonly/readonly: "1"
    quotas:
      app_quota/interval/duration: "3600"
    clusters:
      - name: main
        layout:
          shardsCount: 1
          replicasCount: 1

键的语法类似路径:第一个 / 之前的所有内容都是用户、配置文件或配额名称,其余部分则是其下的 XML 路径。将键与列表值重复使用即可生成多个元素。

使用以下命令生成密码哈希:

printf '%s' '<password>' | sha256sum | cut -d' ' -f1

default 用户被有意限制

随附的 operator 默认设置为 default 用户分配 default 配置文件、default 配额,以及仅允许 ::1127.0.0.1 的网络允许列表。因此,它无法从其他 pod 使用。请声明您自己的用户,而不是放宽 default

默认情况下还会应用主机正则表达式,将入站连接限制为与同一命名空间中实例自身的 pod 及其实例范围 Service 名称匹配的连接。如果您扩大了 networks/ip 的范围但连接仍被拒绝,请检查这一第二道限制。

operator 的账户

operator 会连接到每台服务器以读取指标、维护架构并清除 DNS 缓存。它使用自己的账户,通过 operator 配置中指定的 Secret 读取凭据,并通过 HTTP 端口连接,同时使用较短的连接和查询超时时间。请勿删除或挪作他用该账户:没有它,架构传播和指标收集都会停止。

集群共享 Secret

集群内的服务器间通信可以使用共享 Secret 进行身份验证,该 Secret 按集群声明:

spec:
  configuration:
    clusters:
      - name: main
        secret:
          auto: "yes"
        layout:
          shardsCount: 2
          replicasCount: 2

auto: "yes" 让 operator 生成该值,并将其存储在由 operator 管理的 Secret 中。或者,以纯文本形式提供 value,或提供 valueFrom.secretKeyRef,指向与实例位于同一命名空间中的 Secret。优先使用 autosecretKeyRefvalue 会将 Secret 写入实例清单。

文件

可以使用 spec.configuration.files 注入任意配置文件,其中每个键都是文件名,值是其内容。YAML !!binary 标签支持二进制内容。可以为文件名前置前缀,以选择其目标目录 — common、users 或 host。未知前缀和子文件夹会被忽略,因此文件未出现通常是因为前缀拼写错误。


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

Alauda 是一家独立供应商。本产品与 ClickHouse, Inc. 无关联,也未获得其认可或赞助。所有商标均为其各自所有者的财产,此处仅用于标识目的。