Что такое NetworkPolicy в Kubernetes?

«Что такое NetworkPolicy в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 не будет иметь эффекта.