Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

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

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

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

NetworkPolicies кластера

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

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, в том числе для ссылок из других пространств имен.

Разрешение доступа для клиентов и мониторинга

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

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 кластера.

Отключение для всего кластера

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

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

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

# values.yaml
controller:
  networkPolicyManagement:
    enabled: false

Политики пода оператора

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

Что создает Helm-чарт

Если эта опция включена, чарт создает до двух политик, разрешающих только входящий трафик; обе применяются к поду 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.

Поведение с запретом по умолчанию

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

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

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

Включение политик

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

При использовании исходных манифестов kubectl раскомментируйте раздел [NETWORK POLICY], как описано в руководстве по установке kubectl. В исходные манифесты входят те же две политики.

Назначение меток клиентским пространствам имен

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

# 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 по-прежнему проходит проверку допуска (вебхук доступен).

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

Navigation