Что такое сетевые политики (Network Policies) в Kubernetes и для чего они нужны?

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

Ответ

Network Policies в Kubernetes — это ресурсы, которые определяют правила входящего (ingress) и исходящего (egress) сетевого трафика для групп подов. Их основная цель — реализация микросервисной сетевой безопасности по принципу "запрещено всё, что не разрешено явно" (zero-trust network model) внутри кластера.

Ключевые моменты:

  • Не являются сетевым плагином. Это декларативная спецификация правил. Для их реализации требуется CNI-плагин, поддерживающий Network Policies (например, Calico, Cilium, Weave Net). Без такого плагина политики создаются, но не применяются.
  • Работают на уровне L3/L4. Можно задавать правила на основе IP-адресов (CIDR), портов (TCP/UDP/SCTP) и селекторов подов/неймспейсов. Для фильтрации на уровне L7 (HTTP, gRPC) нужны дополнительные инструменты, например, сервисная сеть (Istio, Linkerd) или расширенные политики Cilium.
  • Изолируют по умолчанию. Если для пода не задана ни одна Network Policy, он принимает и отправляет любой трафик (поведение по умолчанию зависит от плагина). Как только пода назначается политика, все не разрешенные ею соединения блокируются.

Пример сценария и политики: Допустим, у нас есть frontend (метка app: frontend) и backend (метка app: backend) с базой данных (метка app: db).

  1. Политика для backend: Разрешает входящий трафик только от frontend на порт 8080 и исходящий трафик только к db на порт 5432.
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: backend-allow-frontend
    spec:
    podSelector:
    matchLabels:
      app: backend
    policyTypes:
    - Ingress
    - Egress
    ingress:
    - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080
    egress:
    - to:
    - podSelector:
        matchLabels:
          app: db
    ports:
    - protocol: TCP
      port: 5432
  2. Политика для db: Разрешает входящий трафик только от backend на порт 5432 и запрещает любой другой входящий/исходящий трафик (явный deny-all не требуется, так как политика уже ограничивает доступ).

В своей работе я использовал Calico для реализации таких политик. Это критически важно для compliance (например, PCI DSS) и для минимизации ущерба в случае компрометации одного из компонентов приложения.