Запланированный перезапуск модуля Kubernetes без простоя

У меня работает 6 реплик модуля, который я хотел бы перезапускать \ воссоздавать каждые 5 минут.

Это должно быть непрерывное обновление, чтобы все не было прекращено сразу и не было простоев. Как мне этого добиться?

Я пробовал использовать cron job, но, похоже, не работает:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: scheduled-pods-recreate
spec:
  schedule: "*/5 * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: ja-engine
            image: app-image
            imagePullPolicy: IfNotPresent
          restartPolicy: OnFailure

Хотя задание было успешно создано и запланировано согласно описанию ниже, похоже, что оно никогда не запускалось:

Name:                       scheduled-pods-recreate
Namespace:                  jk-test
Labels:                     <none>
Annotations:                <none>
Schedule:                   */5 * * * *
Concurrency Policy:         Forbid
Suspend:                    False
Starting Deadline Seconds:  <unset>
Selector:                   <unset>
Parallelism:                <unset>
Completions:                <unset>
Pod Template:
  Labels:  <none>
  Containers:
   ja-engine:
    Image:           image_url
    Port:            <none>
    Host Port:       <none>
    Environment:     <none>
    Mounts:          <none>
  Volumes:           <none>
Last Schedule Time:  Tue, 19 Feb 2019 10:10:00 +0100
Active Jobs:         scheduled-pods-recreate-1550567400
Events:
  Type    Reason            Age   From                Message
  ----    ------            ----  ----                -------
  Normal  SuccessfulCreate  23m   cronjob-controller  Created job scheduled-pods-recreate-1550567400

Итак, во-первых, как мне убедиться, что он запущен, и модули будут воссозданы?

Также как я могу избежать простоев?

Обновленная версия cronjob:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - kubectl patch deployment runners -p '{"spec":{"template":{"spec":{"containers":[{"name":"jp-runner","env":[{"name":"START_TIME","value":"'$(date +%s)'"}]}]}}}}' -n jp-test
          restartPolicy: OnFailure

Модули не запускаются с сообщением Back-off restarting failed container и error, как указано ниже:

State:          Terminated
      Reason:       Error
      Exit Code:    127

person Chillax    schedule 19.02.2019    source источник


Ответы (2)


Начиная с Kubernetes 1.15, вы используете следующую команду для выполнения последовательного перезапуска.

kubectl rollout restart deployment <deployment name>
person Alexander Jeyaraj    schedule 16.06.2020

На данный момент в Kubernetes нет функции последовательного перезапуска, но вы можете использовать следующую команду в качестве обходного пути для перезапуска всех модулей в конкретном развертывании:
(замените имя развертывания и имя модуля на настоящие)

kubectl patch deployment mydeployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"my-pod-name","env":[{"name":"START_TIME","value":"'$(date +%s)'"}]}]}}}}'

Чтобы запланировать его, вы можете создать задачу cron на главном узле для периодического запуска этой команды.
Пользователь, которому принадлежит задача, должен иметь правильную kubectl конфигурацию (~/.kube/config) с разрешениями на изменение упомянутого объекта развертывания.

Конфигурацию администратора кластера по умолчанию можно скопировать из /etc/kubernetes/admin.conf:
(обычно создается kubeadm init):

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Два типа стратегии обновления развертывания. можно указать: Повторное создание (.spec.strategy.type==Recreate.) и Постоянное обновление (.spec.strategy.type==RollingUpdate).

Только используя стратегию непрерывного обновления, вы можете избежать простоев обслуживания. Вы можете указать maxUnavailable и _ 10_ параметры в YAML развертывания для управления процессом последовательного обновления.

person VASャ    schedule 19.02.2019
comment
Я бы предпочел, чтобы это было как часть самой диаграммы руля, а также как файл yaml CronJob - person Chillax; 19.02.2019
comment
Это работает, поэтому, если у меня установлена ​​стратегия RollingUpdate и выполняется развертывание исправления, выполняется ли скользящее обновление? - person Chillax; 19.02.2019
comment
Да, при изменении спецификации контейнера при развертывании начинается перезапуск модулей. - person VASャ; 19.02.2019
comment
Вы также можете запустить команду kubectl patch из CronJob, вам просто нужно получить доступ к api-серверу кластера из CronJob Pod с помощью kubectl или curl внутри. Для kubectl нужна правильная конфигурация, для curl нужен токен аутентификации. Вы можете найти хороший пример в ответе на этот вопрос: stackoverflow.com/questions/42642170/ - person VASャ; 19.02.2019
comment
Итак, я решил использовать развертывание патча, но не могу заставить его работать как cronjob - обновил и свой вопрос - я что-то упускаю? - person Chillax; 27.02.2019
comment
Я сомневаюсь, что у вас есть двоичный файл kubectl внутри образа busybox по умолчанию. Но я почти уверен, что внутри ты найдешь локоны. Если вы хотите попробовать kubectl, вы можете использовать bitnami / kubectl или lachlanevenson / k8s-kubectl. - person VASャ; 27.02.2019