В образе ничего лишнего быть не должно, а как дебажить то?!?!?!?!
Так как мы в моем канальчике будем говориться в основном про k8s, то на дебаге внутри pod`а мы и остановимся.
Н
а помощь нам придет ephemerial containers который позволит нам подключиться к pod`у и посмотреть что там происходит.
Ephemerial-containers с нами с 1.25 версии.
Работают они следующим образом, у нас есть pod нашего приложения, в котором нет буквально ничего, кроме как самого приложения.
Даже оболочки там может и не быть, да и мы можем достаточными параноиками, что бы по-серьезному накрутить безопасность.
Ephemerial-containers позволяют нам добавить в наш pod еще один контейнер, который будет работать параллельно с нашим приложением.
И как раз в этом контейнере могут быть все необходимые утилиты для дебага.
Как это может выглядеть на примере. Все эксперименты проводятся на k8s 1.28.3, запускаем при помощи minikube.
Для начала запустим под нашего приложения:
apiVersion: v1
kind: Pod
metadata:
name: simple-app
spec:
containers:
- name: simple-app
image: mrgreyves/simple-app:0.3
env:
- name: VERSION
value: "1"
ports:
- containerPort: 8000
После того как наш pod "поднимется" мы сделаем describe и увидим следующее
(нас интересует только раздел containers):
Containers:
simple-app:
Container ID: docker://94339c2434b41ab2dc3b12e002f3d694f9aeeda60bd375851ddbc68997fecad4
Image: mrgreyves/simple-app:0.3
Image ID: docker-pullable://mrgreyves/simple-app@sha256:704a51301a1ab21b32f736c3d9db15cbfe2fe311b525a9e6e397c9195baeb33d
Port: 8000/TCP
Host Port: 0/TCP
State: Running
Started: Sun, 17 Dec 2023 14:49:31 +0300
Ready: True
Restart Count: 0
Environment:
VERSION: 1
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-c7f75 (ro)
В pod`e запущен только одни контейнер, пришло время добавить ephemerial-container для дебага.
Вполнить это мы можем следующей командой.
kubectl debug -it --attach=false simple-app --image=praqma/network-multitool --target=simple-app
Где первый simple-app это имя пода к которуму мы хотим добавить ephemerial-container, а второй simple-app это имя контейнера внутри pod`а к которому мы хотим подключиться.
praqma/network-multitool - образ со всем необходимым тулингом для дебага.
Повторно выполняем describe и видим следующее:
Containers:
simple-app:
Container ID: docker://94339c2434b41ab2dc3b12e002f3d694f9aeeda60bd375851ddbc68997fecad4
Image: mrgreyves/simple-app:0.3
Image ID: docker-pullable://mrgreyves/simple-app@sha256:704a51301a1ab21b32f736c3d9db15cbfe2fe311b525a9e6e397c9195baeb33d
Port: 8000/TCP
Host Port: 0/TCP
State: Running
Started: Sun, 17 Dec 2023 14:49:31 +0300
Ready: True
Restart Count: 0
Environment:
VERSION: 1
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-c7f75 (ro)
Ephemeral Containers:
debugger-v658k:
Container ID: docker://6813011cff1f7dd68758d9476a4c7237ba00b3e6c8e6e8e3094dfce6485ae936
Image: praqma/network-multitool
Image ID: docker-pullable://praqma/network-multitool@sha256:97b15098bb72df10f7c4e177b9c0e2435ec459f16e79ab7ae2ed3f1eb0e79d19
Port: <none>
Host Port: <none>
State: Running
Started: Sun, 17 Dec 2023 14:52:52 +0300
Ready: False
Restart Count: 0
Environment: <none>
Mounts: <none>
Теперь у нас два контейнера =)
Ну а подключиться ко второму контейнеру мы можем вот так:
k exec -it simple-app -c debugger-v658k -- bash
Вжух и мы внутри нашего debug контейнера, внутри которого есть все нужные нам инструменты.
Порой полезная вещь, рекомендую к использованию ^_^