Представьте: Redis без пароля, Postgres без TLS, а любой под в кластере может до них достучаться. После взлома веб-приложения атакующий сканирует внутреннюю сеть и находит открытый порт 6379. Без Kubernetes Network Policies это финал. Стандартный кластер — флэт-сеть: любой Pod видит любой другой по IP. Но мы настраиваем политики изоляции так, чтобы трафик ходил только по согласованным маршрутам. Опыт нашей команды — 5+ лет в DevOps и 40+ проектов по внедрению K8s в продакшн. Снижаем поверхность атаки в среднем на 80%. Средняя экономия после внедрения — $2.7k–3.9k в год.
Почему default deny — единственный безопасный подход?
Правильная стратегия — запретить всё, затем явно разрешать необходимое. Базовая политика для namespace:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- EgressПосле применения кластер становится «глухим» — ни входящих, ни исходящих соединений, кроме DNS. DNS обязательно разрешаем отдельно (политика с Egress на порты 53 UDP/TCP в namespace kube-system), иначе поды не смогут резолвить имена сервисов. В 95% проектов эта политика — основа безопасности.
Разрешение трафика между подами: пример api-service
Типовой сценарий: сервис api принимает трафик только от Ingress Controller и обращается к postgres и redis. Создаём две политики — на входящий и исходящий трафик.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-service-ingress
namespace: production
spec:
podSelector:
matchLabels:
app: api-service
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-nginx
podSelector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
ports:
- port: 8080
protocol: TCP
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-service-egress
namespace: production
spec:
podSelector:
matchLabels:
app: api-service
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: postgres
ports:
- port: 5432
- to:
- podSelector:
matchLabels:
app: redis
ports:
- port: 6379 Полный пример политики для микросервиса
Для production-кластера с 5 микросервисами требуется около 10 политик. Каждая включает Ingress и Egress правила. Ниже шаблон для типового сервиса с БД и кешем:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: service-a
namespace: production
spec:
podSelector:
matchLabels:
app: service-a
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-nginx
ports:
- port: 3000
egress:
- to:
- podSelector:
matchLabels:
app: postgres
ports:
- port: 5432
- to:
- podSelector:
matchLabels:
app: redis
ports:
- port: 6379
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
Важный момент: в современных версиях Kubernetes namespaceSelector и podSelector в одном блоке from трактуются как AND. В более старых версиях — как OR. Проверьте версию вашего кластера, например, kubectl version --short.
Межнеймспейсное взаимодействие: allow-prometheus-scrape
Например, мониторинговый namespace должен собирать метрики с подов в production. Создаём разрешающую политику в namespace production:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-prometheus-scrape
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
podSelector:
matchLabels:
app.kubernetes.io/name: prometheus
ports:
- port: 9090
protocol: TCP Проблема healthcheck и её решение
kubelet выполняет health-проверки с IP узла (node IP) к поду. Если политики блокируют входящий трафик от любых источников, kubelet не сможет выполнить probe. Решение — разрешить трафик от CIDR узлов кластера:
ingress: - from: - ipBlock: cidr: 10.0.0.0/16 # CIDR нод кластера ports: - port: 8080 Это предотвращает 95% проблем с healthcheck после внедрения политик.
Как отлаживать Network Policies?
Сложность в отсутствии логов блокировок в самом Kubernetes. Используйте специализированные инструменты:
- Calico:
calicoctl get policy -n productionпоказывает распарсенные правила;calicoctl node diagsсобирает состояние dataplane. - Cilium:
cilium monitor --type dropотображает отброшенные пакеты;hubble observe --namespace production --verdict DROPPEDдаёт статистику через Hubble UI. Cilium — один из самых производительных CNI с eBPF.
Без утилит: запустите pod с образом nicolaka/netshoot и проверяйте nc -zv postgres 5432.
Сравнение CNI-плагинов для Network Policies
| Плагин | Поддержка | Производительность | Наблюдаемость |
|---|---|---|---|
| Flannel | Нет (без доп.) | Высокая | Низкая |
| Calico | Полная | Средняя-высокая | Средняя (Felix) |
| Cilium | Полная | Высокая (eBPF) | Высокая (Hubble) |
| Weave Net | Полная | Средняя | Средняя |
Cilium в 2-3 раза быстрее Calico при фильтрации на уровне L7 благодаря eBPF. Для большинства продакшн-сценариев Calico достаточен, но если нужна глубокая наблюдаемость и высокая производительность — выбирайте Cilium. Flannel без дополнений не поддерживает политики, поэтому не рассматривайте его для изоляции.
Пошаговая настройка Network Policy
- Аудит текущей сетевой топологии и модели безопасности — определите namespace и сервисы.
- Проектирование политик на основе потоков: Ingress от Ingress-контроллера, Egress к базам данных.
- Разработка манифестов с покрытием всех критичных потоков (не забывайте DNS!).
- Тестирование на staging-окружении — проверьте healthcheck, dns, и работу приложений.
- Документирование каждой политики и схемы изоляции для команды эксплуатации.
Типичные проблемы и ошибки Network Policies
| Проблема | Причина | Решение |
|---|---|---|
| Healthcheck не проходит | Блокировка трафика от узлов | Добавить ipBlock для CIDR нод |
| DNS не резолвится | Нет Egress-правила для DNS | Разрешить порты 53 UDP/TCP в kube-system |
| Трафик между подами не идёт | Неправильный podSelector | Проверить метки подов и правила |
| Репликация StatefulSet сломана | Блокировка трафика между репликами | Разрешить Egress от подов с тем же селектором |
Чаще всего (в 95% случаев) блокируется healthcheck — всегда добавляйте ipBlock для узлов. Также забывают про Egress к DNS и репликацию между репликами StatefulSet. Используйте kubectl describe networkpolicy для проверки.
Что входит в работу
- Аудит текущей сетевой топологии и модели угроз.
- Проектирование политик изоляции под ваш стёк (Calico/Cilium).
- Написание и применение манифестов (default deny + разрешающие правила).
- Тестирование всех критичных потоков (healthcheck, DNS, мониторинг).
- Документация схемы изоляции и runbook для операционной команды.
- Обучение инженеров работе с политиками (2-часовой workshop).
Стоимость типового проекта по настройке Network Policies — от $700–1.5k в зависимости от сложности и количества сервисов.
Сроки выполнения
- Простой кластер (3-5 сервисов в одном namespace) — 1-2 дня.
- Сложная топология с межнеймспейсным взаимодействием — до 3 дней.
- Полный аудит и внедрение в продакшн (включая документацию) — от 4 дней.
Обратитесь к нашим инженерам для аудита вашего кластера — рассчитаем сроки и объём работ под ваш проект. Закажите внедрение Network Policies под ключ: обеспечим безопасность без простоев.
Источник: Kubernetes Documentation







