Сетевая изоляция между арендаторами на bare metal: политики Cilium eBPF и Kube-OVN VPC

Как Cozystack по умолчанию изолирует арендаторов на bare metal с помощью политик Cilium eBPF, а также опциональные Kube-OVN VPC для рабочих нагрузок, которым нужны выделенные подсети.

Сетевая изоляция арендаторов на Cozystack bare metal: Cilium eBPF блокирует трафик между арендаторами, а опциональные Kube-OVN VPC, каждая со своим OVN-маршрутизатором и коммутаторами, предоставляют выделенные подсети.

Мультиарендная инфраструктура без сетевой изоляции — это бомба замедленного действия. Один неправильно настроенный сервис в арендаторе A может сканировать, атаковать или случайно подключиться к базам данных арендатора B. В AWS вы получаете это по умолчанию — VPC и группы безопасности. А на bare metal? Обычно вам приходится сшивать воедино политики CNI, оверлеи и надеяться, что никто не ошибётся.

Cozystack решает это «из коробки» двумя взаимодополняющими уровнями: изоляция арендаторов, обеспечиваемая Cilium eBPF (всегда включена, без настройки), и опциональные Kube-OVN VPC для рабочих нагрузок, которым нужны собственные выделенные подсети.

Уровень 1: изоляция арендаторов с помощью Cilium eBPF (по умолчанию, всегда включена)

Именно в этом большинство людей ошибается насчёт Cozystack. Изоляция между арендаторами достигается не сетевой сегментацией. Все арендаторы используют единый Pod CIDR (10.244.0.0/16), и Kube-OVN выделяет IP-адреса централизованно из этого общего пула. Изоляция обеспечивается сетевыми политиками Cilium eBPF на уровне ядра.

Как это работает:

  • Kube-OVN — это CNI: он отвечает за сеть подов и IPAM (централизованно, без разбиения CIDR по узлам, оверлей GENEVE). Его собственный движок сетевых политик отключён (ENABLE_NP: false).
  • Cilium работает как связанный CNI (режим generic-veth) и отвечает за всё применение политик, а также за балансировку нагрузки сервисов (замена kube-proxy).
  • Cilium присваивает каждому поду идентификатор безопасности (security identity), производный от его меток, а затем применяет политики к идентификаторам, а не к IP-адресам, полностью в пространстве ядра (без обхода через пространство пользователя).

Когда вы создаёте арендатора, Cozystack автоматически применяет ресурсы CiliumNetworkPolicy и CiliumClusterwideNetworkPolicy. Они обеспечивают изоляцию на уровне пространств имён и ограничивают доступ к системным портам (etcd, kubelet, контроллеры). Трафик внутри одного арендатора разрешён; трафик между арендаторами отбрасывается. Политики сопоставляются по иерархическим меткам пространств имён tenant.cozystack.io/*, поэтому родительский арендатор может включать пространства имён своих субарендаторов:

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-internal-communication
  namespace: tenant-example
spec:
  endpointSelector: {}
  ingress:
    - fromEndpoints:
        - matchLabels:
            k8s:io.cilium.k8s.namespace.labels.tenant.cozystack.io/tenant-example: ""
  egress:
    - toEndpoints:
        - matchLabels:
            k8s:io.cilium.k8s.namespace.labels.tenant.cozystack.io/tenant-example: ""
    - toEntities:
        - kube-apiserver
        - cluster

Вам не нужно писать их вручную — они поставляются вместе с арендатором. Это граница изоляции между арендаторами.

Уровень 2: выделенные подсети с помощью Kube-OVN VPC (опционально)

Помимо изоляции арендаторов, некоторым рабочим нагрузкам нужно собственное выделенное сетевое пространство — отдельные подсети, несколько сетевых интерфейсов (NIC) на ВМ. Именно для этого предназначен VPC.

VPC предоставляет набор выделенных подсетей на базе Kube-OVN (виртуальные OVN-маршрутизаторы и коммутаторы с DHCP и IPAM). Multus обеспечивает поддержку нескольких сетевых интерфейсов, поэтому под или ВМ может иметь два или более интерфейсов. Обратите внимание на текущие границы возможностей: каждая рабочая нагрузка по-прежнему подключается к сети управления по умолчанию со шлюзом по умолчанию, через который проходит большая часть трафика, — подсети VPC являются дополнительными, выделенными сетевыми пространствами. По мере развития этой возможности запланированы дополнительные средства изоляции.

Предварительные требования: VPC требует CNI kube-ovn и multus, поэтому по умолчанию он работает только в бандле paas-full.

Создайте VPC через kubectl:

apiVersion: apps.cozystack.io/v1alpha1
kind: VirtualPrivateCloud
metadata:
  name: production
  namespace: tenant-team1
spec:
  subnets:
    app-subnet:
      cidr: 172.16.0.0/24
    db-subnet:
      cidr: 172.16.1.0/24
kubectl apply -f vpc-production.yaml

subnets — это отображение (map) с ключом по имени подсети, а не список.

ВМ или под может быть подключён к одной или нескольким из этих подсетей одновременно. Каждое подключение отображается как дополнительный сетевой интерфейс — в дополнение к интерфейсу управления по умолчанию.

Замечания по развёртыванию (из документации):

  • Имя VPC должно быть уникальным в пределах его пространства имён; имя подсети и CIDR должны быть уникальными в пределах VPC.
  • CIDR подсетей не должны пересекаться с сетью управления по умолчанию — рекомендуются подмножества 172.16.0.0/12.
  • Разные VPC могут использовать пересекающиеся CIDR подсетей.
  • В настоящее время нет отказоустойчивых проверок этих ограничений (запланированы на будущее), поэтому выбирайте диапазоны внимательно.

Общая картина

Сетевой стек Cozystack по умолчанию (вариант kubeovn-cilium на Talos) объединяет MetalLB (внешняя балансировка нагрузки), Cilium eBPF (балансировка нагрузки сервисов + сетевые политики) и Kube-OVN (сеть подов + IPAM). Изоляция арендаторов — это свойство платформы, которое вы получаете бесплатно; VPC — это подключаемый по желанию инструмент для выделенных подсетей поверх неё.

Документация

Присоединяйтесь к сообществу