Ответ
Для изоляции трафика между неймспейсами в Kubernetes используются NetworkPolicies. Они действуют на уровне CNI (Container Network Interface), поэтому ваш кластер должен использовать поддерживающий их плагин сети, такой как Calico, Cilium или Weave Net.
Базовая политика: Запретить весь межнеймспейсовый трафик
Следующая политика, применённая в неймспейсе app, разрешит общение только между подами внутри этого же неймспейса, блокируя весь входящий (ingress) трафик из других неймспейсов.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-from-other-namespaces
namespace: app # Политика применяется ко всем подам в этом неймспейсе
spec:
podSelector: {} # Выбирает все поды в неймспейсе 'app'
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {} # Разрешает трафик ТОЛЬКО от подов, также находящихся в неймспейсе 'app'
Политика: Разрешить трафик только из определённого неймспейса
Чтобы разрешить доступ к подам в неймспейсе app только из неймспейса monitoring, используется namespaceSelector.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-monitoring-namespace
namespace: app
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: monitoring # Разрешает трафик из неймспейса с меткой 'name=monitoring'
Неймспейсу monitoring нужно добавить соответствующую метку:
kubectl label namespace monitoring name=monitoring
Важные принципы:
- NetworkPolicies являются additive. Если под не selected ни одной политикой, весь трафик к нему и от него разрешён. Как только к поду применяется хоть одна политика, он становится изолированным, и весь не разрешённый явно трафик блокируется.
- Политики работают с подами, а не с сервисами. Правила
ingress/egressиспользуют селекторы подов (podSelector) и неймспейсов (namespaceSelector), а не имена Service. - Для полной изоляции часто требуется комбинация политик на
ingressиegress.