> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

Оператор управляет ресурсами Kubernetes `NetworkPolicy` на двух уровнях; по умолчанию оба отключены:

* **Политики кластеров** — политики для каждого кластера, охватывающие внутренний трафик ресурсов
  `ClickHouseCluster` и `KeeperCluster`; включаются через
  `spec.networkPolicy` в каждом пользовательском ресурсе.
* **Политики подов оператора** — политики, поставляемые с чарт и ограничивающие входящий трафик к
  самому поду controller manager для конечных точек метрик и вебхука.

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

<div id="cluster-network-policies">
  ## NetworkPolicies кластера
</div>

Включите управляемую политику для каждого кластера:

```yaml theme={null}
apiVersion: clickhouse.com/v1alpha1
kind: ClickHouseCluster
spec:
  networkPolicy:
    policy: Enabled
---
apiVersion: clickhouse.com/v1alpha1
kind: KeeperCluster
spec:
  networkPolicy:
    policy: Enabled
```

Управляемые политики охватывают **только внутрикластерный трафик**. При выборе подов
для них применяется запрет входящего трафика по умолчанию, а оператор разрешает только то,
что необходимо кластерам для работы:

| Кластер    | Разрешенный источник                                                            | Разрешенные порты                                    |
| ---------- | ------------------------------------------------------------------------------- | ---------------------------------------------------- |
| ClickHouse | Собственные поды кластера                                                       | `9009` (межсерверный), `9001` (управление)           |
| ClickHouse | Поды оператора (метка `clickhouse.com/role: operator`, любое пространство имен) | `9001`, `9002` (управление)                          |
| Keeper     | Собственные поды кластера                                                       | `9234` (Raft)                                        |
| Keeper     | Поды оператора и все `ClickHouseCluster`, ссылающиеся на этот Keeper            | `2181`, `2281` (клиент), `9123` (управление по HTTP) |

Keeper разрешает доступ кластерам ClickHouse на основе их `keeperClusterRef` — добавление
или удаление ссылки автоматически обновляет политику Keeper, в том числе для
ссылок из других пространств имен.

<div id="allowing-clients">
  ### Разрешение доступа для клиентов и мониторинга
</div>

Клиентские подключения и сбор метрик **не** разрешены: при включённой управляемой
политике доступ к клиентским портам (`9000`/`8123` или вариантам с TLS) и порту
метрик будет закрыт, пока вы не разрешите его. NetworkPolicies дополняют
друг друга, поэтому предоставьте доступ с помощью собственной политики рядом с управляемой:

```yaml theme={null}
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 (порт `9363` в ClickHouse,
`9090` в Keeper) — явно разрешите доступ из пространства имен мониторинга.

Установка `networkPolicy.policy: Disabled` (значение по умолчанию) удаляет управляемую
политику; оператор никогда не изменяет пользовательские политики, если они не
содержат метку `app` кластера.

<div id="np-cluster-wide-disable">
  ### Отключение для всего кластера
</div>

Управление NetworkPolicy также можно отключить для всего кластера с помощью переменной
окружения оператора `ENABLE_NETWORK_POLICY`. Если задано `ENABLE_NETWORK_POLICY=false`,
оператор пропускает согласование NetworkPolicy для **всех**
ClickHouseCluster и KeeperCluster независимо от значения `spec.networkPolicy.policy`
и **вообще не отслеживает** ресурсы `NetworkPolicy`. Поэтому ServiceAccount
оператора не требуются разрешения RBAC для
`networkpolicies.networking.k8s.io`, что полезно при запуске оператора
от имени ограниченного ServiceAccount, в котором эти разрешения намеренно отсутствуют.

```yaml theme={null}
# in the operator Deployment spec
env:
- name: ENABLE_NETWORK_POLICY
  value: "false"
```

В Helm этот же параметр доступен в качестве значения чарта:

```yaml theme={null}
# values.yaml
controller:
  networkPolicyManagement:
    enabled: false
```

<div id="operator-pod-policies">
  ## Политики пода оператора
</div>

Чарт также включает необязательные политики, которые
ограничивают трафик, способный достигать **пода controller manager** — то есть самого
процесса оператора. Эти политики охватывают два порта, которые оператор открывает для других клиентов: конечную точку метрик
и вебхук допуска.

<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](/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 для метрик, описанным в
[Мониторинг → Защита конечной точки метрик](/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>

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