В этом лабораторном занятии (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-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:
Вы также можете использовать вывод в формате 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:
Убедитесь, что вы вышли из интерактивной оболочки, чтобы вернуться к приглашению оболочки.
Выполните конкретные команды без входа в интерактивную оболочку:
## Проверьте версию 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
Теперь используйте команду 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'
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.