Как накатить обновления кубернетес в промежутках

У нас есть случай, когда нам нужно убедиться, что модули в 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
Другие вопросы по тегам