Последовательные обновления развертывания Kubernetes

У меня есть приложение, которое я развертываю на Kubernetes.

Это приложение имеет 4 реплики, и я делаю последовательное обновление при каждом развертывании.

Это приложение имеет плавное завершение работы, которое может занять десятки минут (необходимо дождаться завершения запущенных задач).

Моя проблема в том, что во время обновлений у меня избыточная емкость, поскольку все модули более старой версии застревают в статусе «Завершено», пока создаются все новые модули.

Во время обновлений я использую 8 контейнеров, и этого я стараюсь избегать.

Я попытался установить maxSurge в 0, но этот параметр не принимает во внимание модули «Завершение», поэтому нагрузка на мои серверы во время развертывания слишком высока.

Я пытаюсь добиться того, чтобы новые модули были созданы только после успешного завершения работы с модулями старой версии, поэтому я всегда не превышаю количество установленных мною реплик.

Интересно, есть ли способ добиться такого поведения.


person Shachar Ashkenazi    schedule 11.05.2020    source источник
comment
С помощью maxSurge вы говорите кубернетам, сколько стручков вы позволяете жить примерно желаемому количеству. Вы пробовали установить maxUnavailable на 1? Это количество модулей, которые могут быть недоступны в процессе обновления.   -  person acid_fuji    schedule 12.05.2020
comment
Это никуда не годится, поскольку каждое развертывание займет несколько часов, так как модули будут заменяться один за другим.   -  person Shachar Ashkenazi    schedule 17.05.2020


Ответы (2)


В итоге я создал StatefulSet с podManagementPolicy: Parallel и с updateStrategy на OnDelete.

Я также установил terminationGracePeriodSeconds на максимальное время, необходимое для завершения работы модуля.

В рамках процесса развертывания я применяю новый StatefulSet с новым образом, а затем удаляю все работающие модули.

Таким образом, все модули переходят в состояние Terminating, и всякий раз, когда модуль завершает свою задачу и завершает работу, новый модуль с новым изображением заменяет его.

Таким образом, я могу поддерживать статическое количество реплик в течение всего процесса развертывания.

person Shachar Ashkenazi    schedule 17.05.2020

Позвольте предложить следующую стратегию:

  1. Развертывания реализуют концепцию готовых модулей для непрерывных обновлений. Зонды готовности позволяют развертыванию постепенно обновлять модули, в то же время давая вам возможность определять, когда можно будет продолжить последовательное обновление.

  2. Готовый модуль считается успешно обновленным при развертывании и больше не учитывается при подсчете всплесков для развертывания. Пакет будет считаться готовым, если его проверка готовности прошла успешно и spec.minReadySeconds прошло с момента создания модуля. Значение по умолчанию для этих параметров приведет к тому, что модуль будет готов, как только его контейнеры будут запущены.

Итак, что вы можете сделать, это реализовать (если вы еще этого не сделали) проверка готовности для ваших модулей в дополнение к настройке spec.minReadySeconds на значение, которое будет иметь смысл (в худшем случае) с учетом времени, которое потребуется для прекращения работы ваших стручков.

Это гарантирует, что развертывание будет происходить постепенно и в соответствии с вашими требованиями.

В дополнение к этому не забудьте указать крайний срок для развертывания. По умолчанию после внедрения не удается добиться прогресса в течение 10 минут, оно считается неудачным. Время, по истечении которого развертывание считается неудачным, можно настроить с помощью свойства progressDeadlineSeconds в спецификации развертывания.

person omricoco    schedule 12.05.2020
comment
установка minReadySeconds на час приведет к тому, что мое развертывание будет слишком медленным, поскольку для подготовки всех модулей может потребоваться несколько часов. - person Shachar Ashkenazi; 17.05.2020
comment
Я не уверен, что вы имеете в виду, что мое развертывание будет слишком медленным. Процедура развертывания будет медленной, и у вас не будет простоев. Обратите внимание, что это именно то, что вы просили в своем вопросе: модули будут созданы только после успешного завершения работы с модулями старой версии. просьба уточнить. - person omricoco; 17.05.2020
comment
У меня также было еще одно требование - не превышать количество реплик в любое время. - person Shachar Ashkenazi; 17.05.2020