Бесшовная миграция критичного сервиса из 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 без межкомандной координации, если заменить жесткий одномоментный переключатель на управляемое временное перекрытие конфигураций.