Что произойдет, если изменить данные напрямую в реплике StatefulSet в Kubernetes?

«Что произойдет, если изменить данные напрямую в реплике StatefulSet в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Прямое изменение данных в реплике (поде) StatefulSet (например, базы данных) нарушит идемпотентность и согласованность состояния, которой управляет Kubernetes. Это противоречит принципам работы StatefulSet.

Конкретные последствия:

  1. Рассогласование состояния: Данные в измененной реплике перестанут соответствовать данным в других репликах и в PersistentVolume, на который она опирается.
  2. Потеря изменений при пересоздании пода: Если Pod будет удален (из-за сбоя узла, kubectl delete pod, или обновления StatefulSet), контроллер StatefulSet создаст его заново с тем же именем и подключит тот же самый PersistentVolumeClaim (PVC). Однако, если изменения были сделаны только в запущенном контейнере (в памяти или во временных файлах), а не записаны в том, привязанный к PVC, они будут безвозвратно потеряны.
  3. Проблемы с репликацией данных: Для stateful-приложений (как PostgreSQL с потоковой репликацией) прямое изменение данных на реплике часто технически невозможно (реплика работает в режиме "только для чтения") и бессмысленно, так как при следующем применении WAL-лога с мастера эти изменения будут перезаписаны.

Правильный подход для обновления stateful-приложения:

  • Использовать стратегию обновления StatefulSet (updateStrategy). Например, поэтапное (RollingUpdate) или синусоидальное (OnDelete) обновление.
  • Обновлять через конфигурацию/миграции: Изменения в данных (схемы БД, конфигурационные файлы) должны вноситься через механизмы самого приложения (миграции, скрипты), запускаемые из основного образа во время процесса обновления, а не вручную в запущенном контейнере.
  • Для экстренных исправлений: Если необходимо срочно что-то исправить, следует подключиться к Pod и внести изменение, но немедленно обеспечить персистентность этого изменения (записать в том) и синхронизацию с другими репликами средствами самого приложения, понимая все риски.