ClickHouseCluster の設定
基本設定
レプリカと分片
- レプリカ: 各分片あたりの ClickHouse インスタンス数 (高可用性のため)
- 分片: 水平分割数 (スケーリングのため)
replicas: 3、shards: 2 のクラスターでは、ClickHouse ポッドが合計 6 つ作成されます。
Keeper インテグレーション
keeperClusterRef.namespace が設定されている場合、オペレーターは両方のネームスペースを監視する必要があります。WATCH_NAMESPACE が設定されている場合は、その一覧に ClickHouse と Keeper のネームスペースを含めてください。
KeeperCluster の設定
ストレージ構成
dataVolumeClaimSpec (標準的な Kubernetes の
PersistentVolumeClaimSpec) を使用して永続ストレージを設定します。オペレーターはこれをレプリカごとの PersistentVolumeClaim に変換し、
データパス /var/lib/clickhouse にマウントします:
オペレーター が既存の PVC を変更できるのは、基盤となる StorageClass がボリューム拡張に対応している場合のみです。
クラスター ドメイン
spec.clusterDomain は、オペレーター が ClickHouse server の
設定に書き込む完全修飾のポッドホスト名を生成する際に使用する、Kubernetes の DNS 接尾辞を設定します。既定値は cluster.local で、
ClickHouseCluster と KeeperCluster の両方にあります。
<pod>.<headless-service>.<namespace>.svc.<clusterDomain> の形式でアクセスします。この接尾辞は、生成される構成の
2 つの箇所で使われます。
ClickHouseClusterでは、この値がremote_servers内のレプリカのホスト名に使用されます (レプリカ間およびDistributedクエリ用) 。KeeperClusterでは、この値を基に、ClickHouse が協調に使用する Keeper ノードのホスト名が組み立てられます。
これを override するのは、クラスターの
キューブレット が cluster.local 以外の --cluster-domain
で実行されている場合だけにしてください。値が実際のクラスター ドメインと一致しないと、
ClickHouse は Keeper とレプリカのホスト名を解決できず、協調と
Distributed クエリは DNS 名前解決エラーで失敗します。参照先の
KeeperCluster と ClickHouseCluster の両方に、同じ値を設定してください。複数ディスク (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 で、ClickHouseCluster と KeeperCluster の両方にあります。
<pod>.<headless-service>.<namespace>.svc.<clusterDomain> として参照します。この接尾辞は、
生成される設定の次の 2 か所で使われます。
ClickHouseClusterでは、この値がremote_servers内のレプリカのホスト名に使用されます (レプリカ間およびDistributedクエリ用) 。KeeperClusterでは、この値を基に、ClickHouse が協調に使用する Keeper ノードのホスト名が組み立てられます。
これを上書きするのは、クラスターの
キューブレット が cluster.local 以外の
--cluster-domain で実行されている場合だけにしてください。値が実際のクラスター
ドメインと一致しないと、ClickHouse は Keeper とレプリカのホスト名を名前解決
できず、協調および Distributed クエリが DNS 名前解決エラーで失敗します。
参照先の KeeperCluster と ClickHouseCluster の両方に、同じ値を設定してください。ポッドの設定
トポロジースプレッドとアフィニティの自動設定
Kubernetesクラスターに、分散制約を満たせるだけのノードが異なるゾーンに十分にあることを確認してください。
手動設定
サポートされているすべてのポッドテンプレートオプションについては、API リファレンスを参照してください。
ポッドの停止予算
デフォルト
apply した時点で、意図しないクォーラムの喪失から保護されます。
replicas: 3 の 3 分片 ClickHouseCluster では、オペレーターは分片ごとに 1 つずつ、合計 3 つの PDB を作成し、それぞれに minAvailable: 1 を設定します。
デフォルト設定の上書き
spec.podDisruptionBudget を使用して、minAvailable または maxUnavailable のいずれか一方のみを上書きできます (必ずどちらか一方のみ) :
maxUnavailable 形式:
unhealthyPodEvictionPolicy フィールドをそのまま渡すこともできます。これは、まだ NotReady 状態のポッドのエビクションを許可する必要がある場合に便利です。
ポリシー
spec.podDisruptionBudget.policy では、オペレーターが PDB をどの程度積極的に管理するかを選択できます。
例 — 開発用クラスターで PDB 管理を完全に無効にする:
クラスター全体での無効化
ENABLE_PDB 環境変数を使用して、クラスター全体で無効にすることもできます。ENABLE_PDB=false の場合、オペレーターは すべての ClickHouseCluster と KeeperCluster について、spec.podDisruptionBudget.policy の設定にかかわらず PDB のリコンサイル手順をスキップし、PodDisruptionBudget リソースを一切監視しません。そのため、オペレーターの ServiceAccount には poddisruptionbudgets.policy/v1 に対する RBAC 権限は不要です。これは、それらの権限を意図的に含めていない制限付きの ServiceAccount でオペレーターを実行する場合に便利です。
コンテナーの設定
カスタムイメージ
コンテナーのリソース
環境変数
ボリュームマウント
同じ
mountPathに対して複数のボリュームマウントを指定できます。
Operator は、指定されたすべてのマウントを含む projected volume を作成します。サポートされているすべての コンテナー テンプレートオプションについては、API リファレンスを参照してください。
TLS/SSL の設定
セキュアなエンドポイントを設定する
SSL 証明書 Secret の形式
tls.crt- PEM エンコードされたサーバー証明書tls.key- PEM エンコードされた秘密鍵
この形式は、cert-manager によって生成された証明書と互換性があります。
TLS を介した ClickHouse-Keeper 通信
caBundle を使用して Keeper ノードの証明書を検証します。
プライベート CA (たとえば、自己署名 CA や内部 CA) を信頼するには、カスタム CA バンドルへの参照を指定します。
External Secret
spec.externalSecret を使用して、既存の Secret をオペレーター に指定します。
参照先のSecretは、ClickHouseClusterと同じネームスペース内に存在している必要があります。オペレーターが自ら作成していないSecretを削除することはありません。
必須のキー
完全な Secret は次のようになります。
ポリシー: Observe と Manage
spec.externalSecret.policy は、必須キーが不足している場合に オペレーター がどのように扱うかを制御します。
policy: Manage を指定していても、Secret はそのネームスペース内にあらかじめ存在している必要があります。オペレーター は Secret 自体を作成せず、既存の Secret に生成したキーを書き込むだけです。参照先の Secret が存在しない場合、ポリシーに関係なく ExternalSecretNotFound reason で リコンサイル処理 は停止されます。Observe を選択してください。自己完結的な Bootstrap を行いつつ、Secret オブジェクト自体の管理権は保持しておきたい (たとえばバックアップしたい) 場合は Manage を選択してください.
ステータス条件とトラブルシューティング
ClickHouseCluster.status.conditions に ExternalSecretValid 条件を出力します。リコンサイルが停止しているように見える場合は、この条件を確認してください。
Secret が無効な間、オペレーター はリコンサイルを再キューするため、不足しているキーを追加すれば、次回のリコンサイルで自動的に反映されます。ポッドを再起動する必要はありません。
必要なキーのセットは、実行中の ClickHouse のバージョンによって異なります。
named-collections-key が検証されるのは、オペレーター の version probe が ClickHouse 25.12 以降を検出した場合のみです。古いバージョンでは、このキーが Secret に含まれていなくても問題ありません。追加ポート
8123 HTTP、9000 ネイティブ、9009 interserver、9001 management、9363 Prometheus メトリクス、さらに TLS が有効な場合は TLS 用の 8443/9440 です。ClickHouse で MySQL、PostgreSQL、gRPC、または任意のカスタムポートなどの追加プロトコルを待ち受けるようにするには、spec.additionalPorts で宣言します。
containerPorts と headless Service に追加します。完全な例は、examples/custom_protocols.yaml にあります。
エンドツーエンドの例: MySQLワイヤプロトコル
9004 で ClickHouse を MySQLワイヤプロトコル経由で公開するには:
フィールドの制約
予約済みのポートと名前
additionalPorts エントリを拒否します。TLS 関連のポートは、後から spec.settings.tls.enabled を切り替えても、それまで有効だったクラスターが壊れないよう、無条件で予約されています。
次の名前も拒否されます。これらは オペレーター の内部的なプロトコル種別の識別子であり (人が読める別名ではありません) 、以下のとおりです。
拒否されたリクエストでは、次のようなエラーが生成されます。
バージョンプローブとアップグレードチャネル
- バージョン報告 —
ClickHouseClusterでは、Kubernetes のJobがコンテナーイメージを 1 回実行して実行中の ClickHouse のバージョンを検出します。KeeperClusterでは、オペレーターが実行中のレプリカからサーバーが報告するバージョンを読み取ります。検出されたバージョンは.status.versionに記録され、他の リコンサイル ステップで使用されます (たとえば、External Secretの named-collections キーは ClickHouse25.12以降でのみ必要です) 。 - アップグレードチャネル — 公開されている ClickHouse のリリースフィード (
https://clickhouse.com/data/version_date.tsv) を定期的に確認します。オペレーターは、新しいバージョンが利用可能かどうかをVersionUpgradedステータス条件で報告します。クラスターを自動的にアップグレードすることはなく、イメージタグはユーザーが管理します。
リリースチャネルの選択
spec.upgradeChannel は、オペレーターが比較対象とするアップストリームのリリース群を選択します。このフィールドは ClickHouseCluster と KeeperCluster の両方にあります。
^(lts|stable|\d+\.\d+)?$ で検証) :
本番環境では、通常、チャネルを明示的な
<major>.<minor> (例: 25.8) に固定することが推奨されます。これにより、クラスターを意図したメジャー release 系列に固定でき、いずれかのレプリカが何らかの理由で別のメジャーへずれてしまった場合に、オペレーターが WrongReleaseChannel 警告を表示できるようになります。これは特に、イメージが人が読めるタグではなくダイジェスト (@sha256:...) で参照されている場合に重要です。デフォルトの空値は、メジャーバージョンのジャンプが問題にならない開発用クラスターであれば問題ありません。
ステータス条件
次のように確認します:
バージョンプローブ 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: 配下の項目は名前でこれに一致するため、オペレーターはユーザー指定のフィールドをデフォルトに対してディープマージします。
オペレーター全体に適用される制御
エアギャップ環境、または
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_hex や password_double_sha1_hex などのハッシュ形式も使用できます。平文が
保存されないよう、ハッシュ化された種類を使用することを推奨します。完全な一覧は、
ClickHouse のユーザー設定
を参照してください。
Secretを使った完全な例
passwordType: password を使用すると、ポッド内の clickhouse-client が
このパスワードで設定されるため、デバッグに便利です。ConfigMap を使用する
password_sha256_hex ダイジェストです。
平文のパスワードを ConfigMap に入れないでください。平文の値
(
passwordType: password) には、必ず Secret を使用してください。設定でのカスタムユーザー
データベース同期
サーバーロギング
spec.settings.logger で ClickHouse server のログを設定します。すべてのフィールドは省略可能で、安全なデフォルト値が設定されているため、何も変更していないクラスターでも、コンテナーのコンソールとディスク上のローテーションされるファイルの両方に trace レベルでログが出力されます。
オペレーターは、
kubectl logs が使えるよう、常にコンソールへのログ出力を有効にしています。logToFile が true の場合は、それに加えてファイルへのログ出力も有効にします。既定値を使用するクラスターでは、次の ロガー ブロックが生成されます。
spec.settings.logger ブロックは KeeperCluster にも適用されます。この場合、operator はファイルを代わりに /var/log/clickhouse-keeper/ 配下へ書き込みます。
logToFile の設定にかかわらずコンソールへのログ出力は有効なままなので、ファイルロギングを無効にしても kubectl logs は引き続き利用できます。JSON を解析する構造化ログストアにログを送る場合は、jsonLogs: true を設定してください。カスタム設定
埋め込みの追加設定
extraConfig を使用して、カスタムの ClickHouse 設定を追加します。
役立つリンク:
埋め込み追加ユーザー設定
extraUsersConfig を使用すると、追加の ClickHouse ユーザー設定を指定することもできます。これは、ユーザー、プロファイル、クォータ、権限をクラスター仕様内で直接定義する場合に便利です。
extraUsersConfig は k8s の ConfigMap オブジェクトに保存されます。平文のシークレットはそこに保存しないでください。