Как ограничить сетевое взаимодействие между подами в разных неймспейсах Kubernetes?

Ответ

Для изоляции трафика между неймспейсами в 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

Важные принципы:

  1. NetworkPolicies являются additive. Если под не selected ни одной политикой, весь трафик к нему и от него разрешён. Как только к поду применяется хоть одна политика, он становится изолированным, и весь не разрешённый явно трафик блокируется.
  2. Политики работают с подами, а не с сервисами. Правила ingress/egress используют селекторы подов (podSelector) и неймспейсов (namespaceSelector), а не имена Service.
  3. Для полной изоляции часто требуется комбинация политик на ingress и egress.