Перейти к содержанию

Бесшовная миграция критичного сервиса из namespace default в Kubernetes

7.0/10

Контекст

Критически важный сервис аутентификации auth-svc годами находился в пространстве имен default, и от его кластерного DNS-имени зависели десятки внешних и внутренних микросервисов. Перенос приложения в отдельный namespace стал необходим для применения изолированных политик, однако простой сервиса был недопустим, а одномоментно обновить конфигурации всех клиентов мешали разные циклы релизов команд и OPA-политика, запрещавшая дублирование Ingress-правил.

Суть

Для решения проблемы автор применил подход с незаметным перенаправлением трафика без изменения кода клиентов: сервис развернули в новом namespace authentication, а старый Service в default преобразовали в тип ExternalName, указывающий на auth-svc.authentication.svc.cluster.local по аналогии с CNAME-записью. Убедившись по метрикам, что внутренний трафик успешно перенаправляется, автор масштабировал старые поды до нуля, сохранив возможность мгновенного отката. Для внешнего Ingress конфликт с OPA-политикой разрешили временной аннотацией пространства имен, разрешившей дублирование правил на период параллельной работы двух Ingress, после чего старую конфигурацию удалили.

Вывод

Использование сервисов ExternalName позволяет бесшовно переносить любые DNS-зависимые компоненты Kubernetes без межкомандной координации, если заменить жесткий одномоментный переключатель на управляемое временное перекрытие конфигураций.