kubectl exec не работает — в образе нет shell; как получить оболочку для отладки?
Нужна оболочка внутри работающего пода для отладки, но kubectl exec падает: образ приложения distroless и не несёт shell. Получите отладочную оболочку в поде, не пересобирая образ.
$ kubectl exec -it api-5f6 -- sh
OCI runtime exec failed: exec failed: unable to start container process:
exec: "sh": executable file not found in $PATH: unknown
Диагностируйте и исправьте.
Образ distroless, поэтому sh для exec нет. Подключите эфемерный отладочный контейнер, делящий namespace цели: kubectl debug -it api-5f6 --image=busybox --target=api. --target делит process-namespace — видны процессы приложения. Без пересборки.
- ✗Считать, что distroless-под нельзя отладить без пересборки
- ✗Забывать
--target, из-за чего не видно процессов приложения - ✗Путать
kubectl debugс обычнымexecв тот же контейнер
- →Чем distroless-образ без shell полезен для безопасности в проде?
- →Что меняет
--targetпо сравнению с его отсутствием вkubectl debug?
Решение
1. Почему exec падает
exec: "sh": executable file not found in $PATH
Образ distroless/minimal — в нём нет sh/bash, поэтому kubectl exec ... -- sh не может запустить оболочку. Это норма для безопасных прод-образов, а не поломка.
2. Эфемерный отладочный контейнер
$ kubectl debug -it api-5f6 --image=busybox --target=api
/ # ps -ef # видны процессы контейнера api
/ # wget -qO- localhost:8080/health
kubectl debug добавляет эфемерный контейнер в уже работающий под. --target=api делит process-namespace с контейнером приложения, поэтому видны его процессы, сеть и (через /proc/<pid>/root) файлы. Образ приложения не меняется и не пересобирается.
3. Уборка
Эфемерный контейнер живёт только на время сессии — по выходу он удаляется, под не рестартует.