본문으로 바로가기
본문으로 바로가기

ClickHouse Operator 구성 가이드

이 가이드에서는 ClickHouse Operator를 사용하여 ClickHouse 및 Keeper 클러스터를 구성하는 방법을 설명합니다.

ClickHouseCluster 구성

기본 설정

apiVersion: clickhouse.com/v1alpha1
kind: ClickHouseCluster
metadata:
  name: my-cluster
spec:
  replicas: 3           # Number of replicas per shard
  shards: 2             # Number of shards
  keeperClusterRef:
    name: my-keeper     # Reference to KeeperCluster
  dataVolumeClaimSpec:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 10Gi

레플리카와 세그먼트

  • Replicas: 세그먼트당 ClickHouse 인스턴스 수 (고가용성을 위해)
  • Shards: 수평 파티션 수 (확장을 위해)
spec:
  replicas: 3  # Default: 3
  shards: 2    # Default: 1

replicas: 3shards: 2로 구성된 클러스터는 총 6개의 ClickHouse 파드를 생성합니다.

Keeper 통합

모든 ClickHouse 클러스터는 조정 작업을 위해 KeeperCluster를 참조해야 합니다:

spec:
  keeperClusterRef:
    name: my-keeper  # Name of the KeeperCluster in the same namespace

KeeperCluster 구성

apiVersion: clickhouse.com/v1alpha1
kind: KeeperCluster
metadata:
  name: my-keeper
spec:
  replicas: 3  # Must be odd: 1, 3, 5, 7, 9, 11, 13, or 15
  dataVolumeClaimSpec:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 5Gi

스토리지 구성

영구 스토리지를 설정합니다:

spec:
  dataVolumeClaimSpec:
    storageClassName: fast-ssd  # Optional: consider your storage class based on the installed CSI
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 100Gi
참고

사용 중인 스토리지 클래스가 볼륨 확장을 지원하는 경우에만 Operator가 기존 PVC를 수정할 수 있습니다.

파드 구성

자동 토폴로지 분산 및 어피니티

파드를 여러 가용 영역에 분산하도록 구성합니다:

spec:
  podTemplate:
    topologyZoneKey: topology.kubernetes.io/zone
    nodeHostnameKey: kubernetes.io/hostname
참고

Kubernetes 클러스터에 노드가 여러 가용 영역에 충분히 분산되어 있어 분산 제약 조건(spread constraints)을 충족하는지 확인하십시오.

수동 구성

임의의 파드 선호/비선호 규칙과 토폴로지 분산 제약 조건을 정의할 수 있습니다.

spec:
  podTemplate:
    affinity:
      <your-affinity-rules-here>
    topologySpreadConstraints:
      <your-topology-spread-constraints-here>

지원되는 파드 템플릿 옵션 전체 목록은 API Reference를 참조하십시오.

컨테이너 구성

사용자 정의 이미지

특정 ClickHouse 이미지를 사용하십시오:

spec:
  containerTemplate:
    image:
      repository: clickhouse/clickhouse-server
      tag: "25.12"
    imagePullPolicy: IfNotPresent

컨테이너 리소스

ClickHouse 컨테이너의 CPU와 메모리를 구성하십시오:

# default values
spec:
  containerTemplate:
    resources:
      requests:
        cpu: "250m"
        memory: "256Mi"
      limits:
        cpu: "1"
        memory: "1Gi"

환경 변수

사용자 정의 환경 변수를 추가하십시오:

spec:
  containerTemplate:
    env:
    - name: CUSTOM_ENV_VAR
      value: "1"

볼륨 마운트

추가 볼륨 마운트를 설정합니다:

spec:
  containerTemplate:
    volumeMounts:
    - name: custom-config
      mountPath: /etc/clickhouse-server/config.d/custom.xml
      subPath: custom.xml
참고

동일한 mountPath에 여러 개의 볼륨을 마운트하도록 지정할 수 있습니다. Operator는 지정된 모든 마운트를 포함하는 projected 볼륨을 생성합니다.

지원되는 Container 템플릿 옵션 전체 목록은 API Reference를 참조하십시오.

TLS/SSL 구성

보안 엔드포인트 구성

TLS 인증서가 포함된 Kubernetes Secret에 대한 참조를 지정하여 보안 엔드포인트를 구성합니다

spec:
  settings:
    tls:
      enabled: true
      required: true # Insecure ports are disabled if set
      serverCertSecret:
        name: <certificate-secret-name>

SSL 인증서 Secret 형식

Secret에는 다음 키가 포함되어야 합니다.

  • tls.crt - PEM 인코딩된 서버 인증서
  • tls.key - PEM 인코딩된 개인 키
  • ca.crt - PEM 인코딩된 CA 인증서 체인
참고

이 형식은 cert-manager가 생성하는 인증서와 호환됩니다.

TLS를 통한 ClickHouse-Keeper 통신

KeeperCluster에서 TLS가 활성화된 경우, ClickHouseCluster는 Keeper 노드에 대한 보안 연결을 자동으로 사용합니다.

ClickHouseCluster는 Keeper 노드의 인증서를 검증할 수 있어야 합니다. ClickHouseCluster에서 TLS가 활성화된 경우, 검증을 위해 ca.crt 번들을 사용합니다. 그렇지 않으면 기본 CA 번들이 사용됩니다.

사용자는 커스텀 CA 번들 참조를 제공할 수 있습니다:

spec:
    settings:
        tls:
          caBundle:
            name: <ca-certificate-secret-name>
            key: <ca-certificate-key>

ClickHouse 설정

기본 USER 비밀번호

기본 USER 비밀번호를 설정하십시오:

spec:
  settings:
    defaultUserPassword:
      passwordType: <password-type> # Default: password
      <secret|configMap>:
        name: <resource name>
        key: <password>
참고

ConfigMap에 평문 비밀번호를 저장하는 것은 권장되지 않습니다.

Secret을 생성합니다:

kubectl create secret generic clickhouse-password --from-literal=password='your-secure-password'

사용자 비밀번호를 위한 ConfigMap 사용

민감 정보가 아닌 기본 비밀번호는 ConfigMap을 사용하여 설정할 수도 있습니다:

spec:
  settings:
    defaultUserPassword:
      passwordType: password_sha256_hex
      configMap:
        name: clickhouse-config
        key: default_password

설정에서 사용자 정의 계정

설정 파일에서 추가 사용자를 구성합니다.

사용자용 ConfigMap과 Secret을 생성합니다:

apiVersion: v1
kind: ConfigMap
metadata:
  name: user-config
data:
  reader.yaml: |
    users:
      reader:
        password:
          - '@from_env': READER_PASSWORD
        profile: default
        grants:
          - query: "GRANT SELECT ON *.*"
---
apiVersion: v1
kind: Secret
metadata:
  name: reader-password
data:
  password: "c2VjcmV0LXBhc3N3b3Jk"  # base64("secret-password")

ClickHouseCluster에 사용자 정의 설정을 추가합니다:

spec:
  podTemplate:
    volumes:
      - name: reader-user
        configMap:
          name: user-config
  containerTemplate:
    env:
      - name: READER_PASSWORD
        valueFrom:
          secretKeyRef:
            name: reader-password
            key: password
    volumeMounts:
      - mountPath: /etc/clickhouse-server/users.d/
        name: reader-user
        readOnly: true

데이터베이스 동기화

새 레플리카에 대해 자동 데이터베이스 동기화를 활성화하십시오:

spec:
  settings:
    enableDatabaseSync: true  # Default: true

활성화하면 오퍼레이터가 복제된 테이블(Replicated Table)과 통합 테이블을 새 레플리카에 동기화합니다.

사용자 지정 구성

임베디드 추가 설정

사용자 지정 설정 파일을 마운트하는 대신, ClickHouse에 대한 추가 설정 옵션을 직접 지정할 수 있습니다.

extraConfig를 사용하여 ClickHouse 사용자 지정 설정을 추가하십시오:

spec:
  settings:
    extraConfig:
      background_pool_size: 20

임베디드 추가 사용자 구성

extraUsersConfig를 사용하여 ClickHouse 사용자 구성을 추가로 지정할 수도 있습니다. 이는 클러스터 스펙에서 사용자, 프로필, QUOTA 및 권한(Grants)을 직접 정의할 때 유용합니다.

spec:
  settings:
    extraUsersConfig:
      users:
        analyst:
          password:
            - '@from_env': ANALYST_PASSWORD
          profile: "readonly"
          quota: "default"
      profiles:
        readonly:
          readonly: 1
          max_memory_usage: 10000000000
      quotas:
        default:
          interval:
            duration: 3600
            queries: 1000
            errors: 100
참고

extraUsersConfig는 k8s ConfigMap 객체에 저장됩니다. 그 안에 시크릿을 평문으로 저장하지 마십시오.

지원되는 ClickHouse 사용자 구성 옵션 전체는 문서를 참고하십시오.

구성 예시

전체 구성 예제는 다음과 같습니다:

apiVersion: clickhouse.com/v1alpha1
kind: KeeperCluster
metadata:
  name: sample
spec:
  replicas: 3
  dataVolumeClaimSpec:
    storageClassName: <storage-class-name>
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 10Gi
  podTemplate:
    topologyZoneKey: topology.kubernetes.io/zone
    nodeHostnameKey: kubernetes.io/hostname
  containerTemplate:
    resources:
      requests:
        cpu: "2"
        memory: "4Gi"
      limits:
        cpu: "4"
        memory: "8Gi"
  settings:
    tls:
      enabled: true
      required: true
      serverCertSecret:
        name: <keeper-certificate-secret>
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: default-user-password
data:
  # secret-password
  password: "..." # sha256 hex of the password
---
apiVersion: clickhouse.com/v1alpha1
kind: ClickHouseCluster
metadata:
  name: sample
spec:
  replicas: 2
  dataVolumeClaimSpec:
    storageClassName: <storage-class-name>
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 200Gi
  keeperClusterRef:
    name: sample
  podTemplate:
    topologyZoneKey: topology.kubernetes.io/zone
    nodeHostnameKey: kubernetes.io/hostname
  settings:
    tls:
      enabled: true
      required: true
      serverCertSecret:
        name: clickhouse-cert
    defaultUserPassword:
      passwordType: password_sha256_hex
      configMap:
        key: password
        name: default-password