Как вызвать преднамеренный перезапуск одного модуля kubernetes

#kubernetes #kubectl

Вопрос:

Я тестирую предыдущую команду журнала, и для этого мне нужен модуль для перезапуска.

Я могу получить свои капсулы, используя такую команду, как

 kubectl get pods -n $ns -l $label
 

Что показывает, что мои модули до сих пор не перезапускались. Я хочу проверить команду:

 kubectl logs $podname -n $ns --previous=true
 

Эта команда завершается неудачно, потому что мой модуль не перезапустился, что делает --previous=true переключение бессмысленным.

Я знаю об этой команде для перезапуска модулей при изменении конфигурации:

 kubectl rollout restart deployment myapp -n $ns
 

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

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

 kubectl exec $podname -n $ns -- shutdown
kubectl exec $podname -n $ns -- shutdown now
kubectl exec $podname -n $ns -- halt
kubectl exec $podname -n $ns -- poweroff
 

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

ИЗМЕНИТЬ: Подключение к модулю хорошо описано.

 kubectl -n $ns exec --stdin --tty $podname -- /bin/bash
 

В списке процессов отображается только несколько запущенных процессов:

 ls -1 /proc | grep -Eo "^[0-9]{1,5}$"
 

процесс 1, похоже, является тем, кто управляет модулем.
kill 1 ничего не делает, даже не убивает proc с помощью pid 1

В данный момент я все еще занимаюсь этим вопросом.

Комментарии:

1. А как насчет самоубийства контейнера?. Я думаю, что вы можете сделать это, 1. войдя в сам контейнер 2. из базового рабочего узла 3. эфемерный контейнер. Я не уверен, что эфемерные контейнеры будут иметь видимость/разрешение для этого.

2. @null как бы я это сделал? Есть ли у вас под рукой команда kubectl?

3. вы можете войти в запущенный контейнер, используя kubectl exec-it <ИМЯ МОДУЛЯ>-c <ИМЯ МОДУЛЯ><ИМЯ КОНТЕЙНЕРА>- it bash. например: ‘kubectl exec-it статический-web-c web — /bin/sh-c «убить -9 1″‘. Для получения более подробной информации, пожалуйста, обратитесь к документации kubernetes.io/docs/tasks/debug-application-cluster/…

4. @null только что попробовал — никакого эффекта, команда не найдена

5. Попробуйте убить основной процесс модуля, который должен быть одним из директив entrypoint или cmd в файле Dockerfile или манифесте модуля.

Ответ №1:

Существуют различные способы достижения вашей цели. Ниже я опишу наиболее полезные варианты.

Криктл

Самый правильный и эффективный способ — перезапустить модуль на уровне выполнения контейнера.

Я протестировал это на облачной платформе Google — GKE и minikube с docker драйвером.

Вам нужно ssh войти в рабочий узел, на котором запущен модуль. Затем обнаружите, что это POD ID :

 $ crictl ps
CONTAINER           IMAGE               CREATED             STATE           NAME                ATTEMPT             POD ID
9863a993e0396       87a94228f133e       3 minutes ago       Running         nginx-3             2                   6d17dad8111bc
 

или

 $ crictl pods -s ready
POD ID              CREATED             STATE          NAME                    NAMESPACE       ATTEMPT         RUNTIME
6d17dad8111bc       About an hour ago   Ready          nginx-3                 default         2               (default)
 

Тогда прекрати это:

 $ crictl stopp 6d17dad8111bc
Stopped sandbox 6d17dad8111bc
 

Через некоторое время kubelet снова запустится этот модуль (с другим идентификатором модуля в CRI, однако кластер kubernetes рассматривает этот модуль как один и тот же):

 $ crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                        ATTEMPT             POD ID
f5f0442841899       87a94228f133e       41 minutes ago      Running             nginx-3                     3                   b628e1499da41
 

Вот как это выглядит в кластере:

 $ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
nginx-3                           1/1     Running   3          48m
 

Получение журналов с --previous=true флагом также подтвердило, что это тот же модуль для kubernetes.

Процесс уничтожения 1

Он работает с большинством изображений, однако не всегда.

Например, я тестировал на простом модуле с nginx изображением:

 $ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx            1/1     Running   0          27h

$ kubectl exec -it nginx -- /bin/bash
root@nginx:/# kill 1
root@nginx:/# command terminated with exit code 137

$ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx            1/1     Running   1          27h
 

Полезная ссылка:

Комментарии:

1. Привет @Johannes. Вам удалось заставить его работать?