Введение
В предыдущей лабораторной работе мы сосредоточились на логах и событиях. Это первичные сигналы, но иногда возникает необходимость заглянуть внутрь работающего контейнера или временно получить доступ к сервису прямо из терминала. Kubernetes предоставляет для этого два распространенных инструмента: kubectl exec и kubectl port-forward.
В этой лабораторной работе вы развернете небольшое веб-приложение, используете kubectl exec для проверки файлов и процессов внутри пода, а также примените kubectl port-forward для создания временного локального соединения с сервисом. Рабочий процесс намеренно упрощен, чтобы вы могли сосредоточиться на методах отладки, а не на сложности самого приложения.
Подготовка пространства имен для отладки
На этом этапе вы подготовите чистое пространство имен (namespace) для практики работы с exec и перенаправлением портов.
Начните работу в директории /home/labex/project. В ней вы будете хранить манифест приложения.
mkdir -p /home/labex/project
cd /home/labex/project
Убедитесь, что API-сервер Kubernetes доступен. Если виртуальная машина только что запустилась и узел еще не готов, подождите несколько секунд и повторите команду.
kubectl get nodes --request-timeout=5s
Ожидаемый вывод:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Дождитесь, пока под сетевого плагина кластера перейдет в состояние Ready. Перенаправление портов использует соединение с API-сервером, но для работы приложения также необходимы исправные под и сервис.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Ожидаемый вывод:
pod/calico-node-... condition met
Создайте пространство имен ckad-prep-debug и установите его в качестве текущего:
kubectl create namespace ckad-prep-debug
kubectl config set-context --current --namespace=ckad-prep-debug
Проверьте текущее пространство имен:
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
Ожидаемый вывод:
ckad-prep-debug
Развертывание небольшого веб-приложения
На этом этапе вы развернете простое приложение для инспекции и доступа.
Под создает файл index.html и запускает BusyBox httpd на порту 8080. Сервис с именем debug-web открывает доступ к подам внутри кластера на порту 80. Сервис включен в пример, так как kubectl port-forward может работать как с подами, так и с сервисами.
Создайте файл debug-web.yaml:
cat > debug-web.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: debug-web
spec:
replicas: 2
selector:
matchLabels:
app: debug-web
template:
metadata:
labels:
app: debug-web
spec:
terminationGracePeriodSeconds: 0
containers:
- name: web
image: busybox:1.36
command:
- /bin/sh
- -c
- |
mkdir -p /www
echo "debug-web-ready" > /www/index.html
httpd -f -p 8080 -h /www
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 1
periodSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
name: debug-web
spec:
selector:
app: debug-web
ports:
- port: 80
targetPort: 8080
EOF
Примените манифест и дождитесь развертывания:
kubectl apply -f debug-web.yaml
kubectl rollout status deployment/debug-web --timeout=120s
Ожидаемый вывод:
deployment.apps/debug-web created
service/debug-web created
deployment "debug-web" successfully rolled out
Проверьте поды и сервис:
kubectl get pods -l app=debug-web
kubectl get service debug-web
Ожидаемый вывод включает два запущенных пода и сервис типа ClusterIP:
debug-web-... 1/1 Running
debug-web ClusterIP
Инспекция работающего контейнера с помощью exec
На этом этапе вы используете kubectl exec для выполнения команд внутри пода приложения.
kubectl exec полезен, когда под запущен, но вам нужно проверить, что «видит» контейнер. Это не замена логам, и его не следует использовать для внесения скрытых ручных исправлений во время штатной работы приложения. В процессе отладки он помогает подтвердить наличие файлов, состояние процессов, переменные окружения и поведение локальной сети изнутри контейнера.
Сохраните имя одного из подов в переменную оболочки:
POD_NAME="$(kubectl get pods -l app=debug-web -o jsonpath='{.items[0].metadata.name}')"
echo "$POD_NAME"
Ожидаемый вывод — имя пода:
debug-web-...
Выполните hostname внутри контейнера. Вывод должен совпадать с именем пода, так как Kubernetes устанавливает имя хоста контейнера на основе имени пода.
kubectl exec "$POD_NAME" -- hostname
Ожидаемый вывод:
debug-web-...
Выведите список запущенных процессов внутри контейнера:
kubectl exec "$POD_NAME" -- ps
Ожидаемый вывод включает процесс httpd:
PID USER TIME COMMAND
... root ... httpd -f -p 8080 -h /www
Прочитайте файл, который отдает веб-сервер:
kubectl exec "$POD_NAME" -- cat /www/index.html
Ожидаемый вывод:
debug-web-ready
Наконец, протестируйте веб-сервер изнутри того же контейнера:
kubectl exec "$POD_NAME" -- wget -qO- http://127.0.0.1:8080
Ожидаемый вывод:
debug-web-ready
Тестирование сервиса с помощью перенаправления портов
На этом этапе вы используете kubectl port-forward для доступа к сервису из вашего терминала.
Перенаправление портов создает временный туннель от локального порта к поду или сервису в кластере. Это полезно для быстрой отладки, так как не требует изменения типа сервиса, создания Ingress или открытия внешнего доступа. Команда kubectl port-forward работает в фоновом режиме, пока вы ее не остановите, поэтому в этой лабораторной работе мы запустим ее в фоне, протестируем, а затем завершим.
Запустите перенаправление с локального порта 18080 на порт сервиса 80. Вывод будет записан в файл /tmp/debug-web-port-forward.log, чтобы терминал оставался доступным для работы.
kubectl port-forward service/debug-web 18080:80 > /tmp/debug-web-port-forward.log 2>&1 &
PF_PID=$!
sleep 3
cat /tmp/debug-web-port-forward.log
Ожидаемый вывод:
Forwarding from 127.0.0.1:18080 -> 8080
Отправьте запрос через локальный перенаправленный порт:
wget -qO- http://127.0.0.1:18080
Ожидаемый вывод:
debug-web-ready
Остановите фоновый процесс перенаправления портов. Эта очистка важна, иначе локальный порт останется занятым.
kill "$PF_PID"
wait "$PF_PID" 2>/dev/null || true
Убедитесь, что в логе перенаправления портов зафиксировано успешное соединение:
cat /tmp/debug-web-port-forward.log
Ожидаемый вывод:
Handling connection for 18080
Резюме
Вы освоили два практических инструмента отладки. Вы использовали kubectl exec для проверки имени хоста, процессов, файлов и HTTP-ответов на localhost внутри работающего контейнера. Вы также использовали kubectl port-forward для создания временного локального соединения с сервисом ClusterIP, протестировали его из терминала и корректно завершили работу фонового процесса.


