Ответ
NetworkPolicy — это ресурс Kubernetes, который определяет правила сетевого взаимодействия между Pod'ами (и с внешним миром) на уровне L3/L4. По умолчанию в большинстве сетевых плагинов все Pod'ы могут общаться друг с другом. NetworkPolicy позволяет реализовать принцип минимальных привилегий (zero-trust) внутри кластера, изолируя компоненты приложения.
Ключевые концепции:
- PodSelector: Выбирает Pod'ы, к которым применяется политика (по labels).
- Правила: Определяют разрешенный входящий (
ingress) и исходящий (egress) трафик. - Селекторы правил: Указывают источник трафика (для
ingress) или назначение (дляegress) с помощьюpodSelector,namespaceSelectorилиipBlock.
Практический пример: изоляция бэкенда от фронтенда.
Допустим, у нас есть фронтенд (app: frontend) и бэкенд (app: backend). Политика разрешает бэкенду принимать трафик только от фронтенда и от Pod'ов в namespace monitoring (для сбора метрик), а также разрешает исходящие запросы к внешней БД.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-policy
namespace: prod
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
- namespaceSelector:
matchLabels:
name: monitoring
ports:
- protocol: TCP
port: 8080
egress:
- to:
- ipBlock:
cidr: 10.10.20.0/24 # CIDR внешней базы данных
ports:
- protocol: TCP
port: 5432
Важное замечание: NetworkPolicy — это декларативная конструкция. Ее реализацию обеспечивает сетевой плагин CNI, который должен поддерживать эту функциональность (например, Calico, Cilium, Weave Net). Без такого плагина создание NetworkPolicy не будет иметь эффекта.