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、任意のネームスペース) |
9001、9002 (management) |
| Keeper | クラスター自身のポッド | 9234 (Raft) |
| Keeper | Operator ポッドおよびこの Keeper を参照するすべての ClickHouseCluster |
2181、2281 (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: falseOperator ポッドポリシー
チャート には、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: truehelm upgrade --install clickhouse-operator \
oci://ghcr.io/clickhouse/clickhouse-operator-helm \
-n clickhouse-operator-system --create-namespace \
-f values.yamlallow-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 サーバー到達性に関する注意事項が原因である可能性が最も高いです。
- operator の監視 — メトリクス エンドポイント、その RBAC、スクレイプの保護について説明します。
- kubectl を使用したインストール — ネットワークポリシーのセクションをどこでアンコメントするかを説明します。
- Helm を使用したインストール — operator に関連する chart の values。