Введение
В этом лабораторном занятии (lab) вы будете исследовать и отлаживать приложения Kubernetes. Вы запустите локальный кластер Kubernetes с помощью Minikube, развернете пример приложения и изучите различные методы отладки, такие как проверка конфигурации приложения, просмотр журналов, выполнение команд внутри подов (pods) и анализ событий кластера. Эти навыки являются обязательными для разработки и устранения неполадок в приложениях на основе Kubernetes.
Запуск Kubernetes кластера
В этом шаге вы узнаете, как запустить и проверить локальный Kubernetes кластер с помощью Minikube. Это важный первый шаг для разработки и тестирования Kubernetes приложений на вашей локальной машине.
Сначала запустите Minikube кластер:
minikube start
Пример вывода:
😄 minikube v1.29.0 on Ubuntu 22.04
✨ Automatically selected the docker driver
📌 Using Docker driver with root permissions
🔥 Creating kubernetes in kubernetes cluster
🔄 Restarting existing kubernetes cluster
🐳 Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
🚀 Launching Kubernetes ...
🌟 Enabling addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace
Теперь проверьте статус кластера, используя несколько команд:
minikube status
kubectl get nodes
Пример вывода:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.1
Эти команды подтверждают, что:
- Minikube успешно запущен
- Локальный Kubernetes кластер был создан
- Кластер готов к использованию
- У вас есть одноузловой кластер с возможностями control plane (плоскости управления)
Давайте проверим контекст кластера, чтобы убедиться, что вы подключены к правильному кластеру:
kubectl config current-context
Пример вывода:
minikube
Это подтверждает, что kubectl настроен для использования Minikube кластера.

Развертывание примера приложения
В этом шаге вы узнаете, как создать и развернуть простое Kubernetes-приложение, используя YAML-манифесты. Мы создадим как Pod (под), так и Deployment (развертывание), чтобы продемонстрировать различные способы развертывания приложений.
Сначала создайте каталог для ваших Kubernetes-манифестов:
mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests
Создайте простой манифест Pod (под) NGINX:
nano nginx-pod.yaml
Добавьте следующее содержимое:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Нажмите Ctrl+X, затем Y и Enter, чтобы сохранить и выйти.
Теперь создайте манифест Deployment (развертывания):
nano nginx-deployment.yaml
Добавьте следующее содержимое:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Примените манифесты для создания ресурсов:
kubectl apply -f nginx-pod.yaml
kubectl apply -f nginx-deployment.yaml
Пример вывода:
pod/nginx-pod created
deployment.apps/nginx-deployment created
Проверьте созданные ресурсы:
kubectl get pods
kubectl get deployments
Пример вывода:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 1m
nginx-deployment-xxx-yyy 1/1 Running 0 1m
nginx-deployment-xxx-zzz 1/1 Running 0 1m
nginx-deployment-xxx-www 1/1 Running 0 1m
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1m
Подождите, пока Deployment (развертывание) создаст реплики. В столбце READY должно отображаться 3/3, когда все реплики будут готовы.
Ключевые различия между Pod (под) и Deployment (развертывание):
- Pod (под): Единичный экземпляр приложения
- Deployment (развертывание): Управляет несколькими репликами и обеспечивает самовосстановление

Проверка конфигурации приложения
На этом шаге вы узнаете, как проверять и получать детали конфигурации развертываний (Deployments) и подов (Pods) Kubernetes с помощью различных команд kubectl. Понимание того, как проверять конфигурации ресурсов, является важным для устранения неполадок и понимания настройки вашего приложения.
Сначала давайте получим конфигурацию пода (Pod), который мы создали на предыдущем шаге, в формате YAML:
kubectl get pod nginx-pod -o yaml
Пример вывода (частичный):
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
labels:
app: nginx
spec:
containers:
- image: nginx:latest
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
Теперь давайте проверим конфигурацию развертывания (Deployment):
kubectl get deployment nginx-deployment -o yaml
Пример вывода (частичный):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Используйте команду kubectl describe, чтобы получить более подробную информацию о ресурсах:
kubectl describe pod nginx-pod
kubectl describe deployment nginx-deployment
Пример вывода для команды describe pod (частичный):
Name: nginx-pod
Namespace: default
Priority: 0
Node: minikube/172.17.0.2
Start Time: [timestamp]
Labels: app=nginx
Annotations: <none>
Status: Running
IP: 172.17.0.5
Containers:
nginx:
Container ID: docker://[container-id]
Image: nginx:latest
Image ID: docker-pullable://nginx@[image-digest]
Port: 80/TCP
Host Port: 0/TCP
State: Running
Ready: True
Restart Count: 0
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Вы также можете использовать вывод в формате JSON для более удобного машинного чтения:
kubectl get pod nginx-pod -o json
Основные аспекты, на которые стоит обратить внимание при проверке конфигураций:
- Метаданные ресурса (имя, метки, пространство имен)
- Контейнерный образ и порты
- Количество реплик (для развертываний)
- Статус и условия ресурса
Просмотр журналов приложения
На этом шаге вы узнаете, как просматривать и проверять журналы для подов (Pods) Kubernetes с помощью команды kubectl logs. Просмотр журналов является важным для понимания поведения приложения, отладки проблем и мониторинга производительности приложения.
Сначала выведите список доступных подов, чтобы убедиться, что вы работаете с правильными ресурсами:
kubectl get pods
Пример вывода:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 20m
nginx-deployment-xxx-yyy 1/1 Running 0 20m
nginx-deployment-xxx-zzz 1/1 Running 0 20m
nginx-deployment-xxx-www 1/1 Running 0 20m
Просмотрите журналы для конкретного пода:
## Просмотр журналов для пода nginx-pod
kubectl logs nginx-pod
Пример вывода:
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
...
2023/xx/xx [notice] xxxx#x: signal process started
Просмотрите журналы для подов развертывания (Deployment):
## Просмотр журналов для конкретного пода в развертывании
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')
kubectl logs $POD_NAME
Исследуйте дополнительные параметры просмотра журналов:
## Просмотр последних 50 строк журналов
kubectl logs nginx-pod --tail=50
## Следить за журналами в режиме реального времени
kubectl logs -f nginx-pod
Пример просмотра журналов в режиме реального времени:
[будет отображаться вывод журналов в режиме реального времени]
Выйдите из режима просмотра журналов в реальном времени, нажав Ctrl + C.
Для подов с несколькими контейнерами укажите имя контейнера:
## Если в поде есть несколько контейнеров
kubectl logs nginx-pod -c nginx
Основные методы просмотра журналов:
- Просмотр всей истории журналов
- Ограничение количества строк журналов
- Следить за журналами в режиме реального времени
- Указание контейнера в поде с несколькими контейнерами
Отладка с использованием kubectl exec
На этом шаге вы узнаете, как использовать команду kubectl exec для выполнения команд внутри пода (Pod) Kubernetes, что является важным для отладки и исследования контейнерных сред.
Сначала проверьте доступные поды:
kubectl get pods
Пример вывода:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 30m
nginx-deployment-xxx-yyy 1/1 Running 0 30m
nginx-deployment-xxx-zzz 1/1 Running 0 30m
nginx-deployment-xxx-www 1/1 Running 0 30m
Запустите интерактивную оболочку в поде nginx-pod:
kubectl exec -it nginx-pod -- /bin/bash
Пример взаимодействия внутри пода:
## Проверьте конфигурацию nginx
cat /etc/nginx/nginx.conf
## Проверьте установленные пакеты
apt update && apt list --installed
## Выйдите из оболочки пода
exit
Убедитесь, что вы вышли из интерактивной оболочки, чтобы вернуться к приглашению оболочки.
Выполните конкретные команды без входа в интерактивную оболочку:
## Проверьте версию nginx
kubectl exec nginx-pod -- nginx -v
## Выведите список файлов в корневой директории веб-сервера
kubectl exec nginx-pod -- ls /usr/share/nginx/html
Для подов развертывания (Deployment) выберите конкретный под:
## Получите имя пода из развертывания
POD_NAME=$(kubectl get pods -l app=nginx | grep nginx-deployment | head -n 1 | awk '{print $1}')
## Выполните команды в поде развертывания
kubectl exec -it $POD_NAME -- /bin/bash
Основные методы использования kubectl exec:
- Запуск интерактивных оболочек
- Выполнение конкретных команд
- Исследование внутреннего состояния подов
- Отладка конфигураций контейнеров
Использование kubectl describe для устранения неполадок
На этом шаге вы узнаете, как использовать команду kubectl describe для диагностики и устранения неполадок с ресурсами Kubernetes, которая предоставляет подробную информацию о статусах подов (Pods), развертываний (Deployments) и компонентов кластера.
Сначала создадим проблемное развертывание для демонстрации отладки:
cd ~/project/k8s-manifests
nano problematic-deployment.yaml
Добавьте следующее содержимое:
apiVersion: apps/v1
kind: Deployment
metadata:
name: debug-deployment
spec:
replicas: 2
selector:
matchLabels:
app: debug
template:
metadata:
labels:
app: debug
spec:
containers:
- name: debug-container
image: non-existent-image:latest
ports:
- containerPort: 80
Примените развертывание:
kubectl apply -f problematic-deployment.yaml
Теперь используйте команду kubectl describe для исследования развертывания:
kubectl describe deployment debug-deployment
Пример вывода:
Name: debug-deployment
Namespace: default
CreationTimestamp: [timestamp]
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=debug
Replicas: 2 desired | 0 available | 2 total | 2 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing False ProgressDeadlineExceeded
OldReplicaSets: <none>
NewReplicaSet: debug-deployment-xxx (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreate 1m deployment-controller Failed to create pod
Normal ScalingReplicaSet 1m deployment-controller Scaled up replica set
Опишите поды, чтобы получить более подробную информацию:
kubectl describe pods -l app=debug
Пример вывода:
Name: debug-deployment-xxx-yyy
Namespace: default
Priority: 0
Node: minikube/172.17.0.2
Start Time: [timestamp]
Labels: app=debug
Annotations: <none>
Status: Pending
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreatePodSandBox 1m kubelet Failed to create pod sandbox
Warning Failed 1m kubelet Failed to pull image
Опишите ресурсы узла:
kubectl describe nodes minikube
Основные методы устранения неполадок:
- Определение статуса развертывания и подов
- Просмотр подробных сообщений об ошибках
- Понимание причин, по которым ресурсы не запускаются
- Проверка состояния узла и кластера
Изучение событий кластера (kubectl get events) для поиска подсказок и временных рамок
На этом шаге вы узнаете, как использовать команду kubectl get events для исследования событий на уровне всего кластера, понимания системных активностей и диагностики проблем в вашей среде Kubernetes.
Сначала просмотрите все события кластера:
kubectl get events
Пример вывода:
LAST SEEN TYPE REASON OBJECT MESSAGE
10m Warning FailedCreate deployment/debug-deployment Failed to create pod
5m Normal Scheduled pod/nginx-pod Successfully assigned default/nginx-pod to minikube
3m Normal Pulled pod/nginx-deployment-xxx-yyy Container image "nginx:latest" already present on machine
Отфильтруйте события по пространству имен:
kubectl get events -n default
Используйте более детальные параметры просмотра событий:
## Следить за событиями в режиме реального времени
kubectl get events -w
## Получить события, отсортированные по времени создания
kubectl get events --sort-by='.metadata.creationTimestamp'
Создайте сценарий, генерирующий пользовательские события:
cd ~/project/k8s-manifests
nano event-test-deployment.yaml
Добавьте следующее содержимое:
apiVersion: apps/v1
kind: Deployment
metadata:
name: event-test
spec:
replicas: 3
selector:
matchLabels:
app: event-test
template:
metadata:
labels:
app: event-test
spec:
containers:
- name: nginx
image: nginx:latest
resources:
limits:
cpu: "100m"
memory: "50Mi"
Примените развертывание и изучите события:
kubectl apply -f event-test-deployment.yaml
kubectl get events
Расширенное фильтрование событий:
## Фильтрация по типу события
kubectl get events --field-selector type=Warning
## Фильтрация по конкретному ресурсу
kubectl get events --field-selector involvedObject.kind=Deployment
Основные методы анализа событий:
- Просмотр событий на уровне всего кластера
- Фильтрация событий по пространству имен
- Следить за событиями в режиме реального времени
- Определение предупреждающих и ошибочных событий
Резюме
В этом лабораторном занятии вы узнали, как запустить и проверить локальный кластер Kubernetes с использованием Minikube, что является важным первым шагом для разработки и тестирования приложений Kubernetes на вашем локальном компьютере. Вы также научились создавать и развертывать простое приложение Kubernetes с использованием манифестов YAML, включая как под (Pod), так и развертывание (Deployment). Кроме того, вы изучили различные команды для проверки конфигурации, просмотра журналов, отладки и устранения неполадок в приложении, что дало вам более глубокое понимание того, как управлять и мониторить приложения Kubernetes.


