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

Мультиарендная инфраструктура без сетевой изоляции — это бомба замедленного действия. Один неправильно настроенный сервис в арендаторе 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 — это подключаемый по желанию инструмент для выделенных подсетей поверх неё.
Документация
Присоединяйтесь к сообществу
- Cozystack на GitHub
- Telegram группа
- Slack группа (получите приглашение на https://slack.kubernetes.io)
- Календарь встреч сообщества