メインコンテンツへスキップ
このガイドでは、Operatorを使用して ClickHouse および Keeper のクラスターを設定する方法を説明します。

ClickHouseCluster の設定

基本設定

レプリカと分片

  • レプリカ: 各分片あたりの ClickHouse インスタンス数 (高可用性のため)
  • 分片: 水平分割数 (スケーリングのため)
replicas: 3shards: 2 のクラスターでは、ClickHouse ポッドが合計 6 つ作成されます。

Keeper インテグレーション

すべてのClickHouseクラスターで、調整用のKeeperClusterを参照する必要があります。
keeperClusterRef.namespace が設定されている場合、オペレーターは両方のネームスペースを監視する必要があります。WATCH_NAMESPACE が設定されている場合は、その一覧に ClickHouse と Keeper のネームスペースを含めてください。

KeeperCluster の設定

ストレージ構成

dataVolumeClaimSpec (標準的な Kubernetes の PersistentVolumeClaimSpec) を使用して永続ストレージを設定します。オペレーターはこれをレプリカごとの PersistentVolumeClaim に変換し、 データパス /var/lib/clickhouse にマウントします:
オペレーター が既存の PVC を変更できるのは、基盤となる StorageClass がボリューム拡張に対応している場合のみです。
マルチディスク (JBOD) レイアウトでの追加ディスクの接続、永続 ボリュームなしでの実行、容量の拡張、カスタムストレージポリシー、および作成後に何を 変更できないかに関するルールについては、専用の ストレージとボリュームのガイドで説明しています。

クラスター ドメイン

spec.clusterDomain は、オペレーター が ClickHouse server の 設定に書き込む完全修飾のポッドホスト名を生成する際に使用する、Kubernetes の DNS 接尾辞を設定します。既定値は cluster.local で、 ClickHouseClusterKeeperCluster の両方にあります。
The オペレーターは、ヘッドレス Service を通じてすべてのポッドに <pod>.<headless-service>.<namespace>.svc.<clusterDomain> の形式でアクセスします。この接尾辞は、生成される構成の 2 つの箇所で使われます。
  • ClickHouseCluster では、この値が remote_servers 内のレプリカのホスト名に使用されます (レプリカ間および Distributed クエリ用) 。
  • KeeperCluster では、この値を基に、ClickHouse が協調に使用する Keeper ノードのホスト名が組み立てられます。
これを override するのは、クラスターの キューブレットcluster.local 以外の --cluster-domain で実行されている場合だけにしてください。値が実際のクラスター ドメインと一致しないと、 ClickHouse は Keeper とレプリカのホスト名を解決できず、協調と Distributed クエリは DNS 名前解決エラーで失敗します。参照先の KeeperClusterClickHouseCluster の両方に、同じ値を設定してください。

複数ディスク (JBOD) ストレージ

additionalVolumeClaimTemplates を使うと、使用に必須のプライマリ dataVolumeClaimSpec に加えて、各 ClickHouse レプリカに追加のディスクを接続できます。 各エントリは PVC テンプレートで、metadata.name と PVC の spec で構成されます。 これらのディスクは、プライマリ データディスクとまったく同様に、StatefulSet の volumeClaimTemplates としてリコンサイルされます。そのため、StatefulSet コントローラーはレプリカごとに 1 つの PVC を作成して保持し、その名前は <name>-<statefulset>-0 になります。
オペレーターは各追加ボリュームを /var/lib/clickhouse/disks/<name> にマウントし、生成された ClickHouse のストレージ構成に追加します。 名前に含まれるハイフンは ClickHouse のディスク識別子ではアンダースコアに変換されますが、マウントパスでは元の名前のままです。 プライマリデータディスクとすべての追加ディスクは、default ストレージポリシー内の 1 つのボリュームにまとめて配置されるため、ClickHouse は新しいデータパーツをそれらすべてにラウンドロビンで分散します。 使用可能容量はすべてのディスクの合計となり、独自の storage_policy を設定していないすべてのテーブル (system.* テーブルを含む) は、この統合されたディスクセットを使用します。
PVC 名は ^[a-z]([-a-z0-9]*[a-z0-9])?$ に一致している必要があり、プライマリデータボリューム名と重複してはなりません。 プライマリデータディスクと同様に、追加ディスクのセットは作成時に固定されます。作成後にエントリを追加、削除、または名前変更することはできず、拒否されます。 追加の PVC は、プライマリデータディスクと同様に、クラスターを削除しても保持されます。 StorageClass が拡張をサポートしている場合、既存エントリのストレージサイズは拡張できます。

クラスター ドメイン

spec.clusterDomain は、オペレーターが ClickHouse server の設定に書き込む ポッドの完全修飾ホスト名を構築する際に使用する Kubernetes の DNS 接尾辞を設定します。 既定値は cluster.local で、ClickHouseClusterKeeperCluster の両方にあります。
オペレーターは、ヘッドレス Service 経由で各ポッドを <pod>.<headless-service>.<namespace>.svc.<clusterDomain> として参照します。この接尾辞は、 生成される設定の次の 2 か所で使われます。
  • ClickHouseCluster では、この値が remote_servers 内のレプリカのホスト名に使用されます (レプリカ間および Distributed クエリ用) 。
  • KeeperCluster では、この値を基に、ClickHouse が協調に使用する Keeper ノードのホスト名が組み立てられます。
これを上書きするのは、クラスターの キューブレットcluster.local 以外の --cluster-domain で実行されている場合だけにしてください。値が実際のクラスター ドメインと一致しないと、ClickHouse は Keeper とレプリカのホスト名を名前解決 できず、協調および Distributed クエリが DNS 名前解決エラーで失敗します。 参照先の KeeperClusterClickHouseCluster の両方に、同じ値を設定してください。

ポッドの設定

トポロジースプレッドとアフィニティの自動設定

ポッドをアベイラビリティゾーン間に分散します:
Kubernetesクラスターに、分散制約を満たせるだけのノードが異なるゾーンに十分にあることを確認してください。

手動設定

ポッドのアフィニティ/アンチアフィニティ ルールやトポロジースプレッド制約を任意に指定できます。

サポートされているすべてのポッドテンプレートオプションについては、API リファレンスを参照してください。

ポッドの停止予算

オペレーターは、各クラスターに対して PodDisruptionBudget (PDB) を作成します。これにより、自発的な中断 (ノードのドレイン、ローリングアップグレード、オートスケーラーによるエビクション) が発生しても、クォーラムの喪失や可用性の低下につながるほど多くのポッドが停止しないようにできます。 複数の分片を持つ ClickHouse クラスターでは、分片ごとに 1 つの PDB が作成されます。これにより、ある分片での中断が別の分片の許容範囲として扱われることはありません。

デフォルト

オペレーターはクラスターのサイズに応じて安全なデフォルト値を選択するため、新規に apply した時点で、意図しないクォーラムの喪失から保護されます。 replicas: 3 の 3 分片 ClickHouseCluster では、オペレーターは分片ごとに 1 つずつ、合計 3 つの PDB を作成し、それぞれに minAvailable: 1 を設定します。

デフォルト設定の上書き

spec.podDisruptionBudget を使用して、minAvailable または maxUnavailable のいずれか一方のみを上書きできます (必ずどちらか一方のみ) :
または、パーセンテージで指定する maxUnavailable 形式:
minAvailablemaxUnavailable の両方を設定すると、検証 webhook によって拒否されます。どちらか一方を選んでください。Kubernetes 自体も、この 2 つを同時に許可していません。
生成される PDB に unhealthyPodEvictionPolicy フィールドをそのまま渡すこともできます。これは、まだ NotReady 状態のポッドのエビクションを許可する必要がある場合に便利です。

ポリシー

spec.podDisruptionBudget.policy では、オペレーターが PDB をどの程度積極的に管理するかを選択できます。 例 — 開発用クラスターで PDB 管理を完全に無効にする:
例 — 手動で作成した PDB をクラスターと同じ場所に置き、オペレーターがそれを変更しないようにします:

クラスター全体での無効化

PDB の管理は、オペレーターの ENABLE_PDB 環境変数を使用して、クラスター全体で無効にすることもできます。ENABLE_PDB=false の場合、オペレーターは すべての ClickHouseCluster と KeeperCluster について、spec.podDisruptionBudget.policy の設定にかかわらず PDB のリコンサイル手順をスキップし、PodDisruptionBudget リソースを一切監視しません。そのため、オペレーターの ServiceAccount には poddisruptionbudgets.policy/v1 に対する RBAC 権限は不要です。これは、それらの権限を意図的に含めていない制限付きの ServiceAccount でオペレーターを実行する場合に便利です。
これは、独自の中断ポリシー (たとえば Gatekeeper / Kyverno 経由) を備えており、オペレーターを完全に関与させたくない環境を対象としています。

コンテナーの設定

カスタムイメージ

特定のClickHouseイメージを使用します。

コンテナーのリソース

ClickHouse コンテナーの CPU とメモリを設定します。

環境変数

任意の環境変数を追加します:

ボリュームマウント

追加のボリュームマウントを設定します:
同じmountPathに対して複数のボリュームマウントを指定できます。 Operator は、指定されたすべてのマウントを含む projected volume を作成します。

サポートされているすべての コンテナー テンプレートオプションについては、API リファレンスを参照してください。

TLS/SSL の設定

セキュアなエンドポイントを設定する

セキュアなエンドポイントを有効にするには、TLS 証明書を含む Kubernetes Secret への参照を指定します

SSL 証明書 Secret の形式

Secret には、サーバーのキーペアが含まれている必要があります。
  • tls.crt - PEM エンコードされたサーバー証明書
  • tls.key - PEM エンコードされた秘密鍵
この形式は、cert-manager によって生成された証明書と互換性があります。

TLS を介した ClickHouse-Keeper 通信

KeeperCluster で TLS が有効になっている場合、ClickHouseCluster は Keeper ノードへのセキュアな接続を自動的に使用します。 ClickHouseCluster は、システムのトラストストアに加えて、設定した caBundle を使用して Keeper ノードの証明書を検証します。 プライベート CA (たとえば、自己署名 CA や内部 CA) を信頼するには、カスタム CA バンドルへの参照を指定します。

External Secret

デフォルトでは、オペレーター はクラスターの内部認証情報 (interserver password、management password、Keeper identity、cluster secret、named-collections key) を含む Secret を作成して管理します。この Secret にはクラスター名が付けられ、クラスターのネームスペース内に作成されます。 これらの認証情報を自分で管理したい場合 (たとえば、HashiCorp Vault、AWS Secrets Manager、または External Secrets Operator から取得する場合) は、spec.externalSecret を使用して、既存の Secret をオペレーター に指定します。
参照先のSecretは、ClickHouseClusterと同じネームスペース内に存在している必要があります。オペレーターが自ら作成していないSecretを削除することはありません。

必須のキー

Secret には、次のキーが含まれている必要があります。 完全な Secret は次のようになります。

ポリシー: Observe と Manage

spec.externalSecret.policy は、必須キーが不足している場合に オペレーター がどのように扱うかを制御します。
policy: Manage を指定していても、Secret はそのネームスペース内にあらかじめ存在している必要があります。オペレーター は Secret 自体を作成せず、既存の Secret に生成したキーを書き込むだけです。参照先の Secret が存在しない場合、ポリシーに関係なく ExternalSecretNotFound reason で リコンサイル処理 は停止されます。
外部システム (Vault、ESO、sealed-secrets、GitOps) を信頼できる情報源として扱い、設定ミスがあれば オペレーター に明確に失敗させたい場合は Observe を選択してください。自己完結的な Bootstrap を行いつつ、Secret オブジェクト自体の管理権は保持しておきたい (たとえばバックアップしたい) 場合は Manage を選択してください.

ステータス条件とトラブルシューティング

オペレーターは ClickHouseCluster.status.conditionsExternalSecretValid 条件を出力します。リコンサイルが停止しているように見える場合は、この条件を確認してください。
考えられる理由: Secret が無効な間、オペレーター はリコンサイルを再キューするため、不足しているキーを追加すれば、次回のリコンサイルで自動的に反映されます。ポッドを再起動する必要はありません。
必要なキーのセットは、実行中の ClickHouse のバージョンによって異なります。named-collections-key が検証されるのは、オペレーター の version probe が ClickHouse 25.12 以降を検出した場合のみです。古いバージョンでは、このキーが Secret に含まれていなくても問題ありません。

追加ポート

オペレーターは、すべての ClickHouse ポッドとそのヘッドレス Service で、固定のポート群を公開します。具体的には、8123 HTTP、9000 ネイティブ、9009 interserver、9001 management、9363 Prometheus メトリクス、さらに TLS が有効な場合は TLS 用の 8443/9440 です。ClickHouse で MySQL、PostgreSQL、gRPC、または任意のカスタムポートなどの追加プロトコルを待ち受けるようにするには、spec.additionalPorts で宣言します。
operator は、それらのポートをポッドの containerPorts と headless Service に追加します。完全な例は、examples/custom_protocols.yaml にあります。
additionalPorts は、Kubernetes 側でのみポートを開きます。これだけでは、ClickHouse server がそれらのポートで待ち受けるようには設定されません。対応するプロトコルを spec.settings.extraConfig.protocols で有効にする必要もあります。これを行わないと、Service 上ではポートが開いていても、ポッド内では何も応答しません。

エンドツーエンドの例: MySQLワイヤプロトコル

ポート 9004 で ClickHouse を MySQLワイヤプロトコル経由で公開するには:
適用後、クラスター内で確認します:

フィールドの制約

予約済みのポートと名前

validating webhook は、オペレーター 自身がバインドするポートと競合する additionalPorts エントリを拒否します。TLS 関連のポートは、後から spec.settings.tls.enabled を切り替えても、それまで有効だったクラスターが壊れないよう、無条件で予約されています。 次の名前も拒否されます。これらは オペレーター の内部的なプロトコル種別の識別子であり (人が読める別名ではありません) 、以下のとおりです。 拒否されたリクエストでは、次のようなエラーが生成されます。

バージョンプローブとアップグレードチャネル

オペレーターは、クラスターのバージョンに関して 2 つの独立した処理を行います。
  1. バージョン報告ClickHouseCluster では、Kubernetes の Job がコンテナーイメージを 1 回実行して実行中の ClickHouse のバージョンを検出します。KeeperCluster では、オペレーターが実行中のレプリカからサーバーが報告するバージョンを読み取ります。検出されたバージョンは .status.version に記録され、他の リコンサイル ステップで使用されます (たとえば、External Secret の named-collections キーは ClickHouse 25.12 以降でのみ必要です) 。
  2. アップグレードチャネル — 公開されている ClickHouse のリリースフィード (https://clickhouse.com/data/version_date.tsv) を定期的に確認します。オペレーターは、新しいバージョンが利用可能かどうかを VersionUpgraded ステータス条件で報告します。クラスターを自動的にアップグレードすることはなく、イメージタグはユーザーが管理します。

リリースチャネルの選択

spec.upgradeChannel は、オペレーターが比較対象とするアップストリームのリリース群を選択します。このフィールドは ClickHouseClusterKeeperCluster の両方にあります。
許可される値 (CRD によりパターン ^(lts|stable|\d+\.\d+)?$ で検証) : 本番環境では、通常、チャネルを明示的な <major>.<minor> (例: 25.8) に固定することが推奨されます。これにより、クラスターを意図したメジャー release 系列に固定でき、いずれかのレプリカが何らかの理由で別のメジャーへずれてしまった場合に、オペレーターが WrongReleaseChannel 警告を表示できるようになります。これは特に、イメージが人が読めるタグではなくダイジェスト (@sha256:...) で参照されている場合に重要です。デフォルトの空値は、メジャーバージョンのジャンプが問題にならない開発用クラスターであれば問題ありません。

ステータス条件

プローブとアップグレードチェックの結果は、次の 2 つの条件に反映されます。 次のように確認します:

バージョンプローブ Job のオーバーライド

これは ClickHouseCluster にのみ適用されます。KeeperCluster では version-probe Job は実行されなくなりました。バージョンは実行中の Keeper レプリカから直接読み取られるため、spec.versionProbeTemplate は非推奨であり、KeeperCluster では効果がありません。 この probe は通常の Kubernetes Job として実装されています。クラスターで、特定の Tolerations、node selector、security context を必須とする Admission ポリシーが設定されている場合や、完了後の probe Job の保持期間を制限したい場合は、spec.versionProbeTemplate でテンプレートをオーバーライドします:
コンテナー名 version-probe はオペレーターのデフォルトです。containers: 配下の項目は名前でこれに一致するため、オペレーターはユーザー指定のフィールドをデフォルトに対してディープマージします。

オペレーター全体に適用される制御

オペレーターマネージャーの 2 つのフラグで、アップグレードチェックのループ全体を制御します。 エアギャップ環境、または clickhouse.com への egress が許可されていない場合は、--disable-version-update-checks=true を設定してください。

ClickHouse の設定

default ユーザーのパスワード

spec.settings.defaultUserPassword は、組み込みの default ユーザーのパスワードを設定します。値は、CR に直接記述するのではなく、 作成した Secret (推奨) または ConfigMap のキーから指定してください。
secret または configMap のいずれか一方のみを指定し、どちらの場合も name (オブジェクト) と key (パスワードを保持するエントリ) の両方を指定してください。

パスワードの種類

passwordType は、値をどのように解釈するかを ClickHouse に指定します。デフォルトは password (平文) で、代わりに password_sha256_hexpassword_double_sha1_hex などのハッシュ形式も使用できます。平文が 保存されないよう、ハッシュ化された種類を使用することを推奨します。完全な一覧は、 ClickHouse のユーザー設定 を参照してください。

Secretを使った完全な例

Secretを作成し、そのキーを参照します。
passwordType: password を使用すると、ポッド内の clickhouse-client が このパスワードで設定されるため、デバッグに便利です。
パスワードをハッシュ化する場合は、平文ではなくハッシュ値を保存します。

ConfigMap を使用する

ConfigMap も同じように機能しますが、その内容は Secret のように保護されません。 機密性のない値、またはすでにハッシュ化されている値にのみ使用してください。たとえば、 password_sha256_hex ダイジェストです。
平文のパスワードを ConfigMap に入れないでください。平文の値 (passwordType: password) には、必ず Secret を使用してください。

設定でのカスタムユーザー

設定ファイルで追加ユーザーを設定します。 ユーザー用のConfigMapとSecretを作成します。
ClickHouseCluster にカスタム設定を追加します:

データベース同期

新しいレプリカのデータベース自動同期を有効にします。
有効にすると、オペレーターは Replicated テーブルとインテグレーション テーブルを新しいレプリカに同期します。

サーバーロギング

spec.settings.logger で ClickHouse server のログを設定します。すべてのフィールドは省略可能で、安全なデフォルト値が設定されているため、何も変更していないクラスターでも、コンテナーのコンソールとディスク上のローテーションされるファイルの両方に trace レベルでログが出力されます。
オペレーターは、kubectl logs が使えるよう、常にコンソールへのログ出力を有効にしています。logToFiletrue の場合は、それに加えてファイルへのログ出力も有効にします。既定値を使用するクラスターでは、次の ロガー ブロックが生成されます。
同じ spec.settings.logger ブロックは KeeperCluster にも適用されます。この場合、operator はファイルを代わりに /var/log/clickhouse-keeper/ 配下へ書き込みます。
logToFile の設定にかかわらずコンソールへのログ出力は有効なままなので、ファイルロギングを無効にしても kubectl logs は引き続き利用できます。JSON を解析する構造化ログストアにログを送る場合は、jsonLogs: true を設定してください。

カスタム設定

埋め込みの追加設定

カスタムの設定ファイルをマウントする代わりに、追加の ClickHouse 設定オプションを直接指定できます。 extraConfig を使用して、カスタムの ClickHouse 設定を追加します。

埋め込み追加ユーザー設定

extraUsersConfig を使用すると、追加の ClickHouse ユーザー設定を指定することもできます。これは、ユーザー、プロファイル、クォータ、権限をクラスター仕様内で直接定義する場合に便利です。
extraUsersConfig は k8s の ConfigMap オブジェクトに保存されます。平文のシークレットはそこに保存しないでください。

サポートされているすべての ClickHouse ユーザー設定オプションについては、ドキュメントを参照してください。

設定例

設定例全体は次のとおりです:
最終更新日 2026年6月25日