+1 098новых вакансий за сутки92 474вакансии открыты сейчасНовое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний
NetworkPolicy задаёт L3/L4 allow-list правила для входящего и исходящего трафика Pod. Без политик весь трафик разрешён; как только Pod выбран хотя бы одной политикой — разрешён только явно перечисленный трафик. Реальную фильтрацию реализует CNI-плагин.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {} # выбирает ВСЕ Pod в namespace
policyTypes:
- Ingress
- Egress
# нет правил ingress и egress — значит всё блокируется
# кроме egress DNS (добавим отдельной политикой)
NetworkPolicy — это Kubernetes-объект, описывающий правила L3/L4 фильтрации трафика для Pod. По умолчанию модель сети Kubernetes полностью открытая: любой Pod может общаться с любым другим Pod в кластере независимо от namespace. NetworkPolicy позволяет перейти к модели allow-list для выбранных Pod.
Важная оговорка: NetworkPolicy — это декларативный API. Реальную фильтрацию реализует CNI-плагин. Если CNI не поддерживает NetworkPolicy (например, Flannel без дополнений), объект сохранится в etcd, но никакой фильтрации не произойдёт. NetworkPolicy поддерживают: Calico, Cilium, Weave Net, Canal, Azure CNI.
NetworkPolicy применяется к Pod через podSelector. Если Pod не выбран ни одной политикой — весь трафик разрешён (как было до политик). Как только хотя бы одна NetworkPolicy выбрала Pod через podSelector:
ingress блоках всех подходящих политик. Остальной входящий трафик отброшен.egress блоков. Всё остальное блокируется.apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns-egress
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-api
namespace: production
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
ports:
- protocol: TCP
port: 9090
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
except:
- 10.100.0.0/16 # исключить диапазон другого tenant
ports:
- protocol: TCP
port: 5432
Без каких-либо NetworkPolicy в namespace трафик полностью открыт. Pod базы данных доступен с любого Pod в кластере. Pod одного микросервиса может открыть соединение к Redis другого микросервиса. Компрометация одного Pod даёт lateral movement по всему кластеру.
dial tcp: lookup postgres on 10.96.0.10:53: read udp: i/o timeout.app=frontend существует в нескольких namespace, правило разрешит трафик из всех них, а не только из нужного.