Оператор управляет ресурсами 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: 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 (это
значение по умолчанию), поэтому при отключении вебхука его политика тоже удаляется.
При использовании исходных манифестов 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-сервера.
- Мониторинг оператора — конечная точка метрик, её RBAC и защита сбора метрик.
- Установка с помощью kubectl — где нужно раскомментировать раздел сетевой политики.
- Установка с помощью Helm — значения values chart'а, относящиеся к оператору.