#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. Вам удалось заставить его работать?