Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ネットワークポリシー

operator は、どちらもデフォルトで無効になっている 2 つのレベルで Kubernetes の NetworkPolicy リソースを管理します。

  • クラスターポリシーClickHouseCluster および KeeperCluster リソースの内部トラフィックを対象とするクラスターごとのポリシーで、各カスタムリソースの spec.networkPolicy で有効化します。
  • operator ポッドポリシー — メトリクスおよび webhook エンドポイントへのイングレスを controller manager ポッド自体に対して制限する、チャート に含まれるポリシーです。

クラスターのNetworkPolicy

クラスターごとにマネージドポリシーを有効にします。

apiVersion: clickhouse.com/v1alpha1
kind: ClickHouseCluster
spec:
  networkPolicy:
    policy: Enabled
---
apiVersion: clickhouse.com/v1alpha1
kind: KeeperCluster
spec:
  networkPolicy:
    policy: Enabled

管理対象のポリシーは、クラスター内部のトラフィックのみを対象とします。ポッドを選択すると、 イングレスはデフォルト拒否となり、operator はクラスターの動作に必要な通信のみを許可します。

クラスター 許可される送信元 許可されるポート
ClickHouse クラスター自身のポッド 9009 (interserver) 、9001 (management)
ClickHouse Operator ポッド (ラベル clickhouse.com/role: operator、任意のネームスペース) 90019002 (management)
Keeper クラスター自身のポッド 9234 (Raft)
Keeper Operator ポッドおよびこの Keeper を参照するすべての ClickHouseCluster 21812281 (client) 、9123 (HTTP control)

Keeper は keeperClusterRef に基づいて ClickHouse クラスターを許可します。参照を 追加または削除すると、他のネームスペースからの参照も含めて、Keeper のポリシーが 自動的に更新されます。

クライアントと監視の許可

クライアント接続とメトリクスのスクレイプは対象に含まれません。managed ポリシー を有効にすると、許可するまでクライアントポート (9000/8123、または TLS バリアント) やメトリクスポートに到達できなくなります。NetworkPolicy は加算的に適用されるため、 managed ポリシー と併せて独自の ポリシー でアクセスを許可します。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-clients
  namespace: <cluster-namespace>
spec:
  podSelector:
    matchLabels:
      app: <name>-clickhouse
  policyTypes: [Ingress]
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: my-app
    ports:
    - protocol: TCP
      port: 9000

同じことが Prometheus によるスクレイプ (ClickHouse ではポート 9363、 Keeper では 9090) にも当てはまります。監視用ネームスペースを明示的に許可してください。

networkPolicy.policy: Disabled (デフォルト) を設定すると、管理対象の ポリシーは削除されます。ユーザー定義のポリシーは、クラスターの app ラベルが 付与されている場合を除き、operator が変更することはありません。

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

NetworkPolicy の管理は、operator's ENABLE_NETWORK_POLICY 環境変数により、クラスター全体で無効にすることもできます。ENABLE_NETWORK_POLICY=false の場合、 operator は spec.networkPolicy.policy の設定にかかわらず、すべての ClickHouseCluster および KeeperCluster に対する NetworkPolicy のリコンサイルをスキップし、NetworkPolicy リソースを一切監視しません。そのため、operator's ServiceAccount には networkpolicies.networking.k8s.io に対する RBAC 権限は不要です。これは、これらの権限を意図的に付与していない 制限付き ServiceAccount で operator を実行する場合に有用です。

# in the operator Deployment spec
env:
- name: ENABLE_NETWORK_POLICY
  value: "false"

Helm では、同じスイッチがチャートの値として提供されています。

# values.yaml
controller:
  networkPolicyManagement:
    enabled: false

Operator ポッドポリシー

チャート には、controller manager ポッド、つまり operator プロセス自体に到達できるトラフィックを制限するための任意のポリシーも含まれています。これらは、operator が他のクライアント向けに公開している 2 つのポート、メトリクスエンドポイントと admission webhook を対象とします。

Helm チャートで作成されるもの

有効にすると、このチャートは最大 2 つのイングレス専用ポリシーを作成します。いずれも controller manager ポッドを対象とします。

ポリシー 許可される送信元 許可されるポート
allow-metrics-traffic metrics: enabled ラベルが付いたネームスペース metrics.port (デフォルトは 8080/TCP)
allow-webhook-traffic webhook: enabled ラベルが付いたネームスペース webhook.port (デフォルトは 9443/TCP)

どちらのポリシーも policyTypes: [Ingress] のみを指定します。これらは operator からの外向きトラフィックを制限せず、 ClickHouse server や Keeper のポッドにも影響しません。

デフォルト拒否の動作

イングレス NetworkPolicy でポッドを選択すると、そのポッドはイングレスに対する デフォルト拒否に切り替わります。いずれかのポリシーが適用されると、明示的に許可されていない controller manager ポッドへの受信トラフィックはすべて破棄されます。有効化後、 operator に到達できるイングレスは次のみです。

  • metrics: enabled というラベルが付いたネームスペースからのメトリクスのスクレイプ
  • webhook: enabled というラベルが付いたネームスペースからの admission webhook 呼び出し

それ以外のそのポッド宛て通信はすべて拒否されます。これは意図したハードニングですが、 ラベルの付いていない scraper や webhook 呼び出し元は、ポリシーが有効になった時点で 動作しなくなることを意味します。

ポリシーを有効にする

Helm では、values でゲートを有効にします。

# values.yaml
networkPolicy:
  enabled: true
helm upgrade --install clickhouse-operator \
  oci://ghcr.io/clickhouse/clickhouse-operator-helm \
  -n clickhouse-operator-system --create-namespace \
  -f values.yaml

allow-webhook-traffic では、webhook.enabled: true ( 既定値) も追加で必要になるため、webhook を無効にすると、そのポリシーも削除されます。

raw の kubectl manifest を使用する場合は、 kubectl install guide で説明されているとおり、[NETWORK POLICY] セクションのコメントを外してください。 raw の manifest にも、同じ 2 つのポリシーが含まれています。

クライアントのネームスペースへのラベル付け

どちらのポリシーも namespaceSelector によって送信元のネームスペースを照合するため、operator に到達する必要があるすべてのネームスペースには、対応するラベルが付いている必要があります。ラベルの付いていないネームスペースからの スクレイプ や webhook 呼び出しは破棄されます。

# Allow a Prometheus namespace to scrape the metrics endpoint
kubectl label namespace <prometheus-namespace> metrics=enabled

# Allow webhook callers from a given namespace
kubectl label namespace <caller-namespace> webhook=enabled

これを 監視 → メトリクス エンドポイントの保護 で説明しているメトリクス RBAC と組み合わせてください。 到達可否は NetworkPolicy が制御し、認可はクラスター ロール バインディングが制御します。 保護されたスクレイプを成功させるには、この両方が必要です。

確認

NS=clickhouse-operator-system

# The policies exist
kubectl -n $NS get networkpolicy

# Inspect the selectors and allowed sources
kubectl -n $NS describe networkpolicy

有効化後、次の点を確認してください:

  • Prometheus が引き続きメトリクス エンドポイントをスクレイプできること (そのネームスペースに metrics: enabled ラベルが付与され、metrics-reader クラスター ロールにバインドされていること) 。
  • ClickHouseCluster の作成または更新が引き続き admission を通過すること (webhook に到達できること) 。

スクレイプしてもデータが返らない場合や、CR の適用がハングする場合は、対象ネームスペースにラベルが付いていないこと、または 上記の API サーバー到達性に関する注意事項が原因である可能性が最も高いです。

Navigation