Запланированный перезапуск стручка 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
Пакеты не запускаются с сообщением "Откат-перезапуск, сбой контейнера и ошибка", как показано ниже:
State: Terminated
Reason: Error
Exit Code: 127
1 ответ
Начиная с Kubernetes 1.15, вы используете следующую команду для выполнения последовательного перезапуска.
kubectl rollout restart deployment <deployment name>
В настоящий момент в 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.
) и Rolling update (.spec.strategy.type==RollingUpdate
).
Только с помощью стратегии Rolling Update вы можете избежать простоев сервиса. Вы можете указать maxUnavailable
а также maxSurge
параметры в развертывании YAML для управления процессом непрерывного обновления.