Короткий ответ
По умолчанию StatefulSet обновляет поды строго в порядке убывания номера (от самого большого индекса к нулевому), по одному, дожидаясь готовности предыдущего, прежде чем перейти к следующему; параметр partition в стратегии RollingUpdate позволяет обновить только поды с индексом больше или равным указанному значению, оставляя остальные на старой версии — это используют для канареечного обновления stateful-приложений.
Как это работает подробнее
в отличие от Deployment, где порядок замены подов не гарантирован и может идти параллельно (в пределах maxSurge/maxUnavailable), StatefulSet по умолчанию работает строго последовательно и в обратном порядке индексов, что важно для приложений, где, например, под с наибольшим индексом — это нереплицированный узел, безопасный для обновления первым. Установка partition: N "замораживает" обновление для подов с индексом меньше N, позволяя вручную проконтролировать, когда продолжать раскатку дальше.
Пример кода
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2Что использовать на практике
- Практика.
partitionиспользуют для осторожного обновления кластеризованной БД — сначала обновляют только один под с самым высоким индексом (например, реплику), проверяют его работоспособность под реальным трафиком некоторое время, и только затем постепенно понижаютpartition, продолжая обновление оставшихся подов. Также существуетOrderedReady(по умолчанию, строгий порядок) иParallel(podManagementPolicy: Parallel) — последний запускает/останавливает все поды одновременно, что ускоряет операции, но отказывается от гарантий порядка, важных для некоторых систем при первом запуске кластера.
Подводные камни
- Риски. забывать вернуть
partitionобратно к 0 после тестирования канареечной версии, из-за чего обновление застревает на полпути неопределённо долго; применятьpodManagementPolicy: Parallelк системе, которая зависит от строгого порядка инициализации узлов (например, кворумным системам, где первый узел должен быть готов раньше остальных).