Короткий ответ
Единого безопасного рецепта нет: миграция CNI обычно требует поэтапного вывода узлов из кластера, их переконфигурации с новым CNI и возврата (либо полного параллельного кластера с переносом workload), тогда как миграция service mesh чаще допускает более плавное сосуществование двух mesh на время перехода — в обоих случаях ключевой риск в недооценке связности между компонентами, которая может обнаружиться только в проде, и решение требует тщательного поэтапного плана с возможностью отката на каждом шаге.
Как это работает подробнее
большинство CNI-плагинов конфигурируют сетевой стек на уровне узла при его инициализации, поэтому смена CNI на уже работающем узле без его пересоздания обычно не поддерживается штатно — типичный безопасный путь представляет собой постепенный вывод узлов партиями (cordon/drain), их переконфигурацию или замену новыми узлами с новым CNI, и контролируемый перенос workload, похожий на процесс апгрейда кластера, но потенциально более рискованный из-за различий в реализации NetworkPolicy, MTU, или производительности между CNI. Миграция service mesh (например, с Linkerd на Istio) обычно идёт через постепенное добавление sidecar нового mesh рядом со старым для части namespace, проверку метрик и поведения, и последующее отключение старого mesh — но при этом нужно явно управлять тем, как трафик между подами с разными mesh (или без mesh) будет себя вести в переходный период, особенно если используется mTLS.
- Компромисс. миграция "на месте" дешевле по инфраструктуре, но несёт более высокий риск для существующего кластера и требует простоя или деградации на время замены узлов; миграция через параллельный новый кластер безопаснее с точки зрения изоляции риска, но требует дополнительных ресурсов на существование двух кластеров одновременно и решения задачи постепенного переноса трафика между ними — выбор должен явно обсуждаться с учётом критичности сервисов в кластере, доступного бюджета на временное дублирование инфраструктуры и зрелости команды в управлении подобными миграциями.
Пример кода
kubectl cordon node-old-1
kubectl drain node-old-1 --ignore-daemonsets --delete-emptydir-data
kubectl label node node-new-1 cni-version=cilium-v2Что использовать на практике
- Практика. перед любой такой миграцией нужен прогон полного плана на отдельном, максимально похожем на прод тестовом кластере, включая сценарии отказа на середине миграции (что произойдёт, если процесс прервётся после перевода половины узлов/namespace); также критично заранее явно задокументировать и протестировать план отката для каждого промежуточного шага, а не только для миграции целиком. Для организаций с низкой толерантностью к риску часто предпочтительнее поднять полностью новый кластер с целевым CNI/mesh и постепенно переносить workload через внешний балансировщик трафика между старым и новым кластером, чем мигрировать "на месте".
Подводные камни
- Риски. частая ошибка — предполагать, что CNI можно сменить без пересоздания узлов, или недооценивать поведение mTLS и связности между подами с разными service mesh в переходный период; также кандидаты часто не планируют откат для каждого промежуточного шага, считая план отмены нужным только для миграции целиком.