spec.settings.tls のフィールドごとのリファレンスについては、
Configuration → TLS/SSL 設定
および API リファレンス を参照してください。
前提条件
- オペレーターによって管理されている稼働中の ClickHouse クラスター (Introductionを参照) 。
- クラスターに cert-manager がインストールされていること。
- クラスターのネームスペースに
kubectlでアクセスできること。
Secret を利用します。cert-manager はその Secret の生成とローテーションに推奨される方法ですが、想定された形式で Secret を書き込めるツールであればどれでも利用できます。
オペレーターが想定する証明書の形式
spec.settings.tls.serverCertSecret で指定することで有効になります。
これは cert-manager が
Certificate リソースに書き込む形式と完全に同じなので、変換は不要です。オペレーターはこの鍵ペアを各ポッドの
/etc/clickhouse-server/tls/ にマウントし、ClickHouse の openSSL 設定に組み込みます。
tls.enabled: true の場合、serverCertSecret は 必須 です。validating
webhook は、これが設定されていない状態で TLS を有効にしたクラスターを拒否し、enabled: true
でない限り required: true も拒否します。ステップ 1 — cert-manager で CA を Bootstrap する
ca.crt を使用できます。
ステップ 2 — サーバー証明書を発行する
dnsNames には、クライアントが
ポッドのアドレス指定に使用する名前を含める必要があります。オペレーターは
<cluster-name>-clickhouse-headless という名前の単一の ヘッドレス Service を作成し、
各レプリカ ポッドには
<cluster-name>-clickhouse-<shard>-<index>-0.<cluster-name>-clickhouse-headless.<namespace>.svc.cluster.local
でアクセスできます。
ヘッドレス Service ドメインに対するワイルドカードを使用すると、すべてのレプリカをカバーできます。
オペレーターは、クラスター全体で利用できる (ロードバランシングされた) Service を作成しません。接続先として単一の安定したエンドポイントが必要な場合は、クラスターのポッドを選択する独自の
クラスタIP Service を作成し、その DNS 名を上記の dnsNames に追加してください。tls.crt、tls.key、ca.crt を含む clickhouse-cert Secret を作成し、有効期限が切れる前に更新します。存在することを確認してください。
ステップ 3 — クラスターで TLS を有効にする
オペレーターの動作
tls.enabled: true の場合、オペレーターは次の処理を行います。
- すべてのポッドと ヘッドレス Service でセキュアなポートを公開します:
9440(native TLS) および8443(HTTPS) 。これらは既存のポートに追加されます。 - Secret を
/etc/clickhouse-server/tls/にマウントし、verificationMode: relaxed、disableProtocols: sslv2,sslv3、preferServerCiphers: trueを含む ClickHouse のopenSSLブロックを生成します。これらはデフォルト値です。上書きするには、TLS 設定のカスタマイズを参照してください。
required: true も設定すると、オペレーターは追加で次の処理を行います。
- 非セキュアなポート
9000(native) と8123(HTTP) を削除します。TLS 版のみが残るため、平文クライアントは接続できなくなります。 - ポッドの liveness probe を セキュアな native ポート
9440に切り替えるため、 平文リスナーがなくてもヘルスチェックは引き続き機能します。
TLS ポート
8443 と 9440 は、TLS が無効な場合でも webhook により無条件で
予約されます。
そのため、後から tls.enabled を切り替えても、
spec.additionalPorts のエントリと競合することはありません。詳しくは
Configuration → additionalPortsを参照してください。ステップ 4 — TLS 経由で接続する
required: true の場合、クライアントはセキュアなポートを使用し、CA を信頼する必要があります。ヘッドレスService (または作成している場合は独自のクラスタIP
Service) 経由で、特定のレプリカのポッドを指定してください。
ネイティブプロトコル (clickhouse-client, ポート 9440):
8443) :
ca.crt を直接取得します:
Keeper トラフィックの暗号化
KeeperCluster 側でも個別に有効にしてください — Keeper
サービス用の証明書を発行し (Keeper サービスの dnsNames を使って手順 1~2 を実施) 、それを参照してください:
2281 で公開します。Keeper で TLS を有効にすると、ClickHouse
クラスターは自動的に TLS 経由で Keeper に接続します。ClickHouseCluster 側で追加の設定を行う必要は
ありません。ClickHouse は、システムのトラストストアに加えて、設定した
caBundle を使用して Keeper の証明書を検証します。
カスタム CA バンドル
caBundle を指定します。
openSSL クライアントのトラストストア
(caConfig) に追加します。システムのトラストストアも引き続き有効であり、プライベート CA はパブリック
ルートに加えて信頼されるため、パブリックエンドポイントへの接続もそのまま機能します。自己署名の
セットアップでは、cert-manager が書き込んだ同じ Secret の ca.crt キーを caBundle で参照してください
(cluster_with_ssl の例のとおり)。
TLS 設定のカスタマイズ
openSSL ブロックはデフォルト設定であり、上限ではありません。これは
メインのサーバー設定に書き込まれます。spec.settings.extraConfig 配下の内容はすべて
config.d/99-extra-config.yaml にレンダリングされ、ClickHouse はそれを最後にマージするため、
生成された値を上書きします。
デフォルトを強化するには — たとえば、厳格なピア検証を必須にし、最小
プロトコルを TLS 1.2 に引き上げるには — 変更したい openSSL.server のキーを設定します:
openSSL サーバー設定
を、extraConfig がどのようにマージされるかについては
設定 → 埋め込みの追加設定
を参照してください。
確認とトラブルシューティング
関連項目
- 設定 → TLS/SSL 設定 — フィールドのリファレンス
- 設定 →
additionalPorts— 予約済みポート - API リファレンス → ClusterTLSSpec
openSSLサーバー設定 —extraConfigで上書き可能な TLS オプション