> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Сетевые политики

> Как оператор ограничивает входящий трафик к поду controller manager с помощью Kubernetes NetworkPolicies для конечных точек метрик и вебхука допуска, как их включить и каким пространствам имен клиентов нужно назначить метки.

Оператор включает необязательные ресурсы Kubernetes `NetworkPolicy`, которые
ограничивают трафик, способный достигать **пода controller manager** — то есть самого
процесса оператора, а не подов ClickHouse server или Keeper. По умолчанию они отключены,
поэтому их включают только тогда, когда требуется изолировать входящий трафик оператора.

Эти политики охватывают два порта, которые оператор открывает для других клиентов: конечную точку метрик
и вебхук допуска.

<Note>
  `NetworkPolicy` применяется только если CNI-плагин кластера поддерживает эту функцию
  (например, Calico или Cilium). В CNI без поддержки `NetworkPolicy` эти
  ресурсы создаются, но фактически не действуют — Kubernetes не возвращает
  ошибку. Прежде чем полагаться на эти политики, убедитесь, что ваш CNI применяет их.
</Note>

<div id="what-the-helm-chart-creates">
  ## Что создает Helm-чарт
</div>

Если эта опция включена, чарт создает до двух политик, разрешающих только входящий трафик; обе применяются к поду controller manager:

| Политика                | Разрешенный источник                          | Разрешенный порт                         |
| ----------------------- | --------------------------------------------- | ---------------------------------------- |
| `allow-metrics-traffic` | Пространства имен с меткой `metrics: enabled` | `metrics.port` (по умолчанию `8080`/TCP) |
| `allow-webhook-traffic` | Пространства имен с меткой `webhook: enabled` | `webhook.port` (по умолчанию `9443`/TCP) |

В обеих политиках указано только `policyTypes: [Ingress]`. Они не ограничивают исходящий трафик оператора и не затрагивают поды ClickHouse server или Keeper.

<div id="default-deny">
  ## Поведение с запретом по умолчанию
</div>

Если для пода выбрана входящая `NetworkPolicy`, этот под переходит в режим **запрета
входящего трафика по умолчанию**: как только начинает действовать хотя бы одна
политика, любой входящий трафик к поду controller-manager, который не разрешён
явно, отбрасывается. После включения до оператора доходят только:

* сбор метрик из пространства имен с меткой `metrics: enabled`, и
* вызов вебхука допуска из пространства имен с меткой `webhook: enabled`.

Весь остальной трафик к поду блокируется. Это и есть ожидаемое усиление
защиты, но это означает, что немаркированный сборщик метрик или источник
вызова вебхука перестанут работать сразу после того, как политики вступят в силу.

<div id="enabling">
  ## Включение политик
</div>

При использовании Helm установите этот флаг в values:

```yaml theme={null}
# values.yaml
networkPolicy:
  enabled: true
```

```bash theme={null}
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` (это
значение по умолчанию), поэтому при отключении вебхука его политика тоже удаляется.

При использовании исходных манифестов `kubectl` раскомментируйте раздел `[NETWORK POLICY]`,
как описано в [руководстве по установке kubectl](/docs/ru/products/kubernetes-operator/install/kubectl).
В исходные манифесты входят те же две политики.

<div id="labeling-namespaces">
  ## Назначение меток клиентским пространствам имен
</div>

Поскольку обе политики сопоставляют источник с помощью `namespaceSelector`, каждое пространство имен,
которому нужен доступ к оператору, должно иметь соответствующую метку. Запрос
на сбор метрик или вызов вебхука из пространства имен без такой метки отбрасывается.

```bash theme={null}
# 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 для метрик, описанным в
[Мониторинг → Защита конечной точки метрик](/docs/ru/products/kubernetes-operator/guides/monitoring#securing-the-metrics-endpoint):
`NetworkPolicy` управляет сетевой доступностью, а привязка `РольКластера` —
авторизацией. Для успешного защищенного сбора метрик необходимо настроить оба механизма.

<Warning>
  Запросы вебхука допуска поступают от API-сервера Kubernetes, а не от обычного
  пода. Подпадает ли этот трафик под действие `NetworkPolicy` и от какого
  источника он исходит, зависит от топологии control plane и CNI —
  в частности, managed control plane может обращаться к вебхуку с адреса, который
  не может быть сопоставлен ни с одним `namespaceSelector`. Если трафик API-сервера не
  охватывается пространством имен с `webhook: enabled`, включение `allow-webhook-traffic` может заблокировать
  допуск и привести к тайм-аутам запросов на создание и обновление `ClickHouseCluster`/`KeeperCluster`.
  После включения проверьте работу допуска на непродакшн-кластере и при необходимости добавьте
  явное разрешающее правило для API-сервера.
</Warning>

<div id="verifying">
  ## Проверка
</div>

```bash theme={null}
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` по-прежнему проходит проверку допуска (вебхук
  доступен).

Если при сборе метрик данные не возвращаются или применение CR зависает, наиболее вероятная причина —
пространство имен источника без метки или описанное выше ограничение доступности API-сервера.

<div id="related-guides">
  ## Связанные руководства
</div>

* [Мониторинг оператора](/docs/ru/products/kubernetes-operator/guides/monitoring) — конечная точка метрик, её RBAC и защита сбора метрик.
* [Установка с помощью kubectl](/docs/ru/products/kubernetes-operator/install/kubectl) — где нужно раскомментировать раздел сетевой политики.
* [Установка с помощью Helm](/docs/ru/products/kubernetes-operator/install/helm) — значения values chart'а, относящиеся к оператору.
