Материалы к экзамену · Урок 5

Сети

Четыре компонента, каждый со своей задачей: кто носит пакеты внутри, кто делит сети между тенантами, кто выдаёт внешние адреса и кто пускает HTTP.

Сетевая часть выглядит сложной, пока не разложить её по задачам. Компонентов четыре, и у каждого своя работа — экзамен спрашивает именно распределение ролей, а не настройки.

Ingress / Gatewayпускает HTTP снаружи внутрь, отдельно у каждого тенантаMetalLBвыдаёт внешние адреса на своём железе, без облачного балансировщикаKube-OVNотдельные сети тенантов, VPC, выдача адресовCiliumносит пакеты между подами, применяет сетевые политики
Снизу вверх: от пакетов между подами до входа снаружи.

Cilium — основа

Отвечает за то, чтобы поды видели друг друга, и за сетевые политики. Работает на eBPF — технологии, которая позволяет исполнять программы прямо в ядре Linux, не переключаясь в пространство пользователя на каждый пакет.

Практическое следствие: сетевые правила применяются в ядре, без длинных цепочек iptables, и не деградируют по мере роста их числа.

Именно Cilium исполняет ту изоляцию между тенантами, о которой шла речь во втором уроке.

Есть и третья роль, которую легко пропустить: Cilium заменяет собой kube-proxy (kube-proxy replacement). Обычно сервисы Kubernetes обслуживает kube-proxy через iptables, а здесь поиск нужного адресата идёт по хеш-таблице и стоит одинаково при любом числе сервисов. На платформе с сотнями тенантов это заметно.

Разделение труда между ним и Kube-OVN стоит запомнить, потому что оба называются «сетью»: Cilium — основной CNI, он даёт сеть подам и применяет политики для всех. Kube-OVN работает поверх и отвечает за наложенную сеть, выдачу адресов и VPC тенантов.

Kube-OVN — сети тенантов

Kube-OVN строит поверх физической сети узлов наложенную сеть (overlay) и добавляет к ней два свойства, которые экзамен спрашивает чаще прочего.

Централизованная выдача адресов (centralized IPAM): адреса раздаются из одного места, а не отдельно на каждом узле, и весь кластер по умолчанию живёт в одном общем диапазоне подов.

Стабильные адреса подов (stable pod IPs): под сохраняет свой адрес, когда переезжает на другой узел. Контейнеру это удобство, а виртуальной машине — необходимость: гостевые системы, лицензии и правила межсетевых экранов обычно привязаны к адресу, и смена адреса при каждой миграции сломала бы их.

Ещё Kube-OVN даёт VPC — приватные сети со своим адресным пространством. И VPC, и виртуальный маршрутизатор (virtual-router) — позиции каталога: тенант заказывает их так же, как базу данных.

Ближайшая аналогия из привычного мира — VPC у облачных провайдеров или сети NSX.

MetalLB — внешние адреса

В публичном облаке сервис типа LoadBalancer получает адрес от провайдера. На своём железе провайдера нет, и без MetalLB такой сервис вечно висит в ожидании.

MetalLB держит пул адресов и раздаёт их сервисам, а затем объявляет их в сеть — либо по ARP, либо через BGP, если сеть построена на маршрутизации. Начиная с версии 1.5 за сторону BGP отвечает FRR-K8s (FRR-K8s) — именно он объявляет маршруты физическим роутерам.

Именно он нужен, чтобы виртуалка или приложение получили адрес, доступный снаружи кластера.

Ingress — вход для HTTP

Для веб-приложений выдавать каждому свой адрес расточительно. Ingress принимает запросы на общий адрес и раскладывает их по именам и путям.

Особенность платформы: точка входа (ingress) своя у каждого тенанта. Это не общий контроллер на весь кластер — тенант с включённым ingress получает собственный ingress-nginx, со своими правилами, своим внешним адресом от MetalLB и своими сертификатами. Тенант без него пользуется родительским, как и с остальными сервисами.

TenantGateway — путь Gateway API

Kubernetes постепенно уходит со старого Ingress на Gateway API — более выразительный стандарт маршрутизации трафика. В платформе он появился в версии 1.5 в виде объекта TenantGateway.

Пакеты через него носит Cilium: nginx в этом пути нет вовсе. И это не замена ingress-nginx, а альтернатива — в 1.5 живут оба варианта.

Сертификаты TenantGateway умеет выпускать в двух режимах проверки. HTTP-01 — центр сертификации забирает токен по обычному HTTP, значит домен должен быть виден из интернета. DNS-01 — проверка через DNS-запись; только этот режим годится для wildcard-сертификатов вида *.apps.example.com и для точек входа, не выставленных наружу.

Имена и сертификаты

Три помощника, которых обычно не замечают, пока они работают.

CoreDNS разрешает имена внутри кластера — поэтому в настройках приложений пишут postgres-db-rw, а не адрес: имя переживает переезд базы на другой узел, а адрес нет.

ExternalDNS смотрит за опубликованными сервисами и точками входа и сам заводит для них записи у вашего DNS-провайдера. Приложение опубликовали — имя начало разрешаться, заявку в сетевой отдел писать не нужно.

cert-manager выпускает сертификаты и продлевает их сам, без напоминаний.

Всё это работает ровно до первого сбоя. О том, как о сбое узнать и что стоит подготовить заранее, — следующий урок.

Что спросят на экзамене

  • Что Cilium носит пакеты между подами и работает на eBPF.
  • Что Cilium заменяет собой kube-proxy.
  • Что Kube-OVN даёт отдельные сети тенантов и VPC.
  • Что у Kube-OVN централизованная выдача адресов и один общий диапазон подов на кластер.
  • Что под сохраняет адрес при переезде на другой узел — и почему это критично для ВМ.
  • Что VPC и виртуальный маршрутизатор (virtual-router) — позиции каталога.
  • Что MetalLB выдаёт внешние адреса на своём железе, объявляя их по ARP или BGP.
  • Что с версии 1.5 за BGP в MetalLB отвечает FRR-K8s.
  • Что точка входа для HTTP — ingress-nginx — заводится у каждого тенанта отдельно.
  • Что TenantGateway появился в 1.5, это Gateway API, и пакеты для него носит Cilium.
  • Два режима выпуска сертификатов: HTTP-01 и DNS-01; wildcard — только DNS-01.
  • Что записи в DNS для опубликованных приложений заводит ExternalDNS.
  • Что имена внутри кластера разрешает CoreDNS, а сертификаты выпускает cert-manager.
  • Почему в настройках приложений пишут имена сервисов, а не адреса.