Как накатить обновления кубернетес в промежутках
У нас есть случай, когда нам нужно убедиться, что модули в k8s имеют самую последнюю версию. Каков наилучший способ сделать это?
Первая идея состояла в том, чтобы убить стручок через некоторое время, зная, что появятся новые, извлекая последние изображения. Вот что мы нашли до сих пор. Все еще не знаю, как это сделать.
Другая идея имеет rolling-update
выполняется с интервалами, как каждые 5 часов. Есть ли способ сделать это?
4 ответа
Как упомянуто @svenwltr используя activeDeadlineSeconds
это простой вариант, но есть риск потерять все капсулы одновременно. Чтобы уменьшить этот риск, я бы использовал deployment
управлять модулями и их развертыванием, а также настраивать небольшой второй контейнер вместе с реальным приложением. Маленький помощник может быть настроен так ( следуя официальным документам):
apiVersion: v1
kind: Pod
metadata:
name: app-liveness
spec:
containers:
- name: liveness
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep $(( RANDOM % (3600) + 1800 )); rm -rf /tmp/healthy; sleep 600
image: gcr.io/google_containers/busybox
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
- name: yourapplication
imagePullPolicy: Always
image: nginx:alpine
При такой конфигурации каждый модуль будет случайным образом выходить из строя в течение настроенного периода времени (здесь от 30 до 90 минут), и это будет запускать новый модуль. imagePullPolicy: Always
Затем убедитесь, что изображение обновляется в течение этого цикла.
Это, конечно, предполагает, что версии вашего приложения всегда доступны под одним именем / тегом.
Чтобы использовать вашу связанную функцию, вам просто нужно указать activeDeadlineSeconds
в ваших стручках.
Не проверенный пример:
apiVersion: v1
kind: Pod
metadata:
name: "nginx"
spec:
activeDeadlineSeconds: 3600
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: Always
Недостатком этого является то, что вы не можете контролировать, когда наступает крайний срок. Это означает, что может случиться так, что все ваши модули будут убиты в одно и то же время и весь сервис отключится (это зависит от ваших приложений).
Другой альтернативой является использование deployment
и пусть контроллер справится с выкатыванием. Чтобы быть более конкретным: если вы обновите image
поле в deployment
yaml, он автоматически обновляет каждый модуль. ИМО это самый чистый путь, но у него есть некоторые требования:
- Вы не можете использовать
latest
тег. Предполагается, что контейнер нуждается в обновлении только при изменении тега изображения. - Если происходит обновление, вы должны каким-то образом обновить тег изображения вручную. Это может сделать пользовательский контроллер, который проверяет наличие новых тегов и соответственно обновляет развертывание. Или это может быть вызвано системой непрерывной доставки.
Я пытался использовать решение Пагида, но, к сожалению, мои наблюдения и последующие исследования показывают, что его утверждение о том, что отказавший контейнер перезапустит весь модуль, неверно. Оказывается, будет перезапущен только сбойный контейнер, что, очевидно, не очень помогает, когда нужно перезапускать другие контейнеры в модуле через случайные интервалы.
Хорошей новостью является то, что у меня есть решение, которое, кажется, работает, основанное на его ответе. По сути, вместо записи в / tmp / healthy вы пишете на общий том, который смонтировал каждый из контейнеров в модуле. Вам также нужно добавить датчик живучести в каждую из этих коробочек. Вот пример, основанный на том, который я использую:
volumes:
- name: healthcheck
emptyDir:
medium: Memory
containers:
- image: alpine:latest
volumeMounts:
- mountPath: /healthcheck
name: healthcheck
name: alpine
livenessProbe:
exec:
command:
- cat
- /healthcheck/healthy
initialDelaySeconds: 5
periodSeconds: 5
- name: liveness
args:
- /bin/sh
- -c
- touch /healthcheck/healthy; sleep $(( RANDOM % (3600) + 1800 )); rm -rf /healthcheck/healthy; sleep 600
image: gcr.io/google_containers/busybox
volumeMounts:
- mountPath: /healthcheck
name: healthcheck
livenessProbe:
exec:
command:
- cat
- /healthcheck/healthy
initialDelaySeconds: 5
periodSeconds: 5