Введение
Kubernetes – это мощная платформа оркестровки контейнеров, которая помогает управлять контейнеризованными приложениями на нескольких хостах. Одной из важных функций Kubernetes является система управления заданиями (job), которая позволяет запускать пакетные (batch-oriented) рабочие нагрузки до завершения. В этом руководстве вы узнаете, как отслеживать статус заданий Kubernetes и анализировать их логи, что является важным навыком для обеспечения бесперебойной работы ваших контейнеризованных приложений.
К концу этого руководства вы сможете создавать задания Kubernetes, проверять их статус и изучать их логи для эффективного устранения неполадок.
Настройка вашей среды Kubernetes
Прежде чем мы сможем отслеживать задания Kubernetes, нам необходимо настроить рабочую среду Kubernetes. Мы будем использовать Minikube, инструмент, который создает одноузловой кластер Kubernetes на вашей локальной машине.
Установка Minikube
Minikube уже установлен на вашей виртуальной машине. Давайте проверим установку, проверив версию:
minikube version
Вы должны увидеть вывод, похожий на этот:
minikube version: v1.29.0
commit: ddac20b4b34a9c8c857fc602203b6ba2679794d3
Запуск Minikube
Теперь давайте запустим Minikube, чтобы создать локальный кластер Kubernetes:
minikube start --driver=docker
Эта команда займет несколько минут. Вы увидите серию сообщений по мере того, как Minikube загружает необходимые компоненты и запускает кластер.
После завершения вы должны увидеть сообщение, подобное этому:
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Проверка установки Kubernetes
Давайте проверим, что наш кластер Kubernetes работает правильно, проверив статус узла:
kubectl get nodes
Вы должны увидеть вывод, похожий на этот:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.3
Также проверьте, что основные компоненты Kubernetes запущены:
kubectl get pods -n kube-system
Вы должны увидеть несколько запущенных подов (pods), включая такие компоненты, как kube-apiserver, kube-controller-manager и другие.
Теперь, когда у нас есть работающий кластер Kubernetes, мы готовы создавать и отслеживать задания.
Создание вашего первого задания Kubernetes
На этом шаге мы создадим простое задание Kubernetes, которое запустит контейнер, выполнит задачу, а затем завершится. Это даст нам что-то для мониторинга на следующих шагах.
Понимание заданий Kubernetes
Задание Kubernetes (Kubernetes Job) — это контроллер, который создает один или несколько подов (pods) и обеспечивает их успешное завершение. Задания полезны для пакетных процессов, одноразовых задач или любых задач, которые должны выполняться до завершения, а не бесконечно.
Создание файла конфигурации задания
Давайте создадим простой файл конфигурации задания. Откройте терминал и создайте новый файл с именем hello-job.yaml в каталоге вашего проекта:
cd ~/project
nano hello-job.yaml
Скопируйте и вставьте следующее содержимое YAML в файл:
apiVersion: batch/v1
kind: Job
metadata:
name: hello-job
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
command: ["sh", "-c", 'echo "Hello, Kubernetes!" && sleep 5']
restartPolicy: Never
backoffLimit: 4
Эта конфигурация определяет задание с именем hello-job, которое:
- Использует образ контейнера
busybox:1.28 - Запускает команду, которая выводит "Hello, Kubernetes!" и затем спит 5 секунд
- Имеет политику перезапуска
Never, что означает, что оно не перезапустится после завершения - Имеет
backoffLimitравный 4, что означает, что оно повторит попытку до 4 раз, если произойдет сбой
Сохраните файл, нажав Ctrl+O, затем Enter, и выйдите из nano с помощью Ctrl+X.
Создание задания
Теперь давайте создадим задание в нашем кластере Kubernetes:
kubectl apply -f hello-job.yaml
Вы должны увидеть вывод:
job.batch/hello-job created
Поздравляем! Вы только что создали свое первое задание Kubernetes. На следующем шаге мы узнаем, как отслеживать его статус.
Мониторинг статуса заданий Kubernetes
Теперь, когда у нас есть запущенное задание в нашем кластере Kubernetes, давайте узнаем, как отслеживать его статус. Мониторинг статуса заданий имеет решающее значение для понимания того, успешно ли завершаются ваши задания или возникают ошибки.
Проверка статуса задания с помощью kubectl
Основным инструментом для мониторинга ресурсов Kubernetes является kubectl. Давайте используем его для проверки статуса нашего задания:
kubectl get jobs
Вы должны увидеть вывод, похожий на этот:
NAME COMPLETIONS DURATION AGE
hello-job 1/1 10s 30s
Этот вывод показывает:
NAME: Имя заданияCOMPLETIONS: Количество завершенных подов (pods) / требуемое количество завершенийDURATION: Сколько времени потребовалось для выполнения заданияAGE: Сколько времени прошло с момента создания задания
Если ваше задание показывает 0/1 в разделе COMPLETIONS, оно может все еще выполняться или завершилось с ошибкой. Подождите несколько секунд и снова запустите команду.
Получение подробной информации о задании
Чтобы получить более подробную информацию о задании, используйте команду describe:
kubectl describe job hello-job
Эта команда предоставляет обширную информацию о задании, включая:
- Метки и аннотации
- Детали селектора
- Параллелизм и требования к завершению
- Статусы подов
- События, связанные с заданием
Найдите раздел Events внизу, который показывает важные события, такие как создание и завершение подов.
Понимание статуса задания
Задание может иметь несколько статусов:
Active: Задание все еще выполняетсяCompleted: Задание успешно завершеноFailed: Задание завершилось с ошибкой после достижения своего предела отката (backoff limit)
Давайте проверим, завершился ли под нашего задания:
kubectl get pods
Вы должны увидеть что-то вроде:
NAME READY STATUS RESTARTS AGE
hello-job-abcd1 0/1 Completed 0 1m
Столбец STATUS показывает Completed, что указывает на успешное выполнение нашего задания.
Создание задания, которое занимает больше времени
Давайте создадим еще одно задание, которое займет больше времени для завершения, чтобы мы могли наблюдать его в состоянии Active:
cd ~/project
nano long-job.yaml
Скопируйте и вставьте следующее содержимое YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: long-job
spec:
template:
spec:
containers:
- name: long
image: busybox:1.28
command:
[
"sh",
"-c",
'echo "Starting long job..." && sleep 30 && echo "Long job completed!"'
]
restartPolicy: Never
backoffLimit: 4
Сохраните файл и выйдите из nano. Затем создайте задание:
kubectl apply -f long-job.yaml
Теперь давайте сразу проверим его статус:
kubectl get jobs
Вы должны увидеть, что long-job показывает 0/1 завершений, потому что оно все еще выполняется. Если вы будете проверять каждые несколько секунд, вы в конечном итоге увидите, как оно изменится на 1/1 примерно через 30 секунд.
Это демонстрирует, как вы можете отслеживать ход выполнения ваших заданий в реальном времени с помощью kubectl.
Анализ журналов заданий Kubernetes
Возможность просматривать и анализировать журналы ваших заданий Kubernetes имеет важное значение для отладки и понимания поведения заданий. На этом шаге мы рассмотрим, как получить доступ к журналам и анализировать их из созданных нами заданий.
Получение имен подов для наших заданий
Прежде чем мы сможем просмотреть журналы, нам нужно знать имена подов, созданных нашими заданиями. Каждое задание создает один или несколько подов с именами, которые включают имя задания и случайный суффикс.
Давайте перечислим все поды, связанные с нашими заданиями:
kubectl get pods --show-labels
Это покажет вам все поды вместе с их метками. Ищите поды с метками, такими как job-name=hello-job или job-name=long-job.
Альтернативно, вы можете отфильтровать поды по имени задания:
kubectl get pods -l job-name=hello-job
Это покажет только поды, которые принадлежат заданию hello-job.
Просмотр журналов заданий
Теперь, когда мы знаем имена наших подов, мы можем просмотреть журналы для наших заданий. Используйте следующую команду, заменив <pod-name> фактическим именем вашего пода:
kubectl logs <pod-name>
Например, если ваш под называется hello-job-abcd1, вы должны запустить:
kubectl logs hello-job-abcd1
Вы должны увидеть вывод:
Hello, Kubernetes!
Это сообщение, которое наше задание было запрограммировано выводить.
Давайте также проверим журналы нашего более длительного задания. Сначала найдите имя пода:
kubectl get pods -l job-name=long-job
Затем просмотрите его журналы:
kubectl logs <long-job-pod-name>
Вы должны увидеть:
Starting long job...
Long job completed!
Просмотр журналов завершенных заданий
Одним из преимуществ заданий Kubernetes является то, что вы можете просматривать журналы даже после завершения задания. Это очень полезно для отладки и аудита.
Давайте создадим задание, которое завершится с ошибкой, чтобы мы могли увидеть, как его отладить:
cd ~/project
nano failed-job.yaml
Скопируйте и вставьте следующее содержимое YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: failed-job
spec:
template:
spec:
containers:
- name: failed
image: busybox:1.28
command: ["sh", "-c", 'echo "Attempting task..." && exit 1']
restartPolicy: Never
backoffLimit: 2
Это задание всегда будет завершаться с кодом состояния 1, что указывает на сбой. Сохраните файл и выйдите из nano, затем создайте задание:
kubectl apply -f failed-job.yaml
Подождите несколько мгновений, пока задание попытается и несколько раз завершится с ошибкой (до предела отката). Затем проверьте его статус:
kubectl get jobs failed-job
Вы должны увидеть, что оно показывает 0/1 завершений и достигло крайнего срока завершения.
Теперь давайте рассмотрим, что пошло не так, проверив журналы неудачных подов:
kubectl get pods -l job-name=failed-job
Вы увидите несколько подов, все в состоянии Error. Выберите один и просмотрите его журналы:
kubectl logs <failed-pod-name>
Вы должны увидеть:
Attempting task...
Журналы пода показывают, что задача началась, но затем завершилась с кодом ошибки. Эта информация имеет решающее значение для отладки сбоев заданий.
Отслеживание журналов в реальном времени
Если вы хотите отслеживать журналы выполняющегося задания в реальном времени, вы можете использовать флаг -f:
kubectl logs -f <pod-name>
Это особенно полезно для более длительных заданий, где вы хотите видеть вывод по мере его появления.
Давайте создадим еще одно долго выполняющееся задание, чтобы продемонстрировать:
cd ~/project
nano counter-job.yaml
Скопируйте и вставьте следующее содержимое YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: counter-job
spec:
template:
spec:
containers:
- name: counter
image: busybox:1.28
command:
[
"sh",
"-c",
'for i in $(seq 1 5); do echo "Count: $i"; sleep 5; done'
]
restartPolicy: Never
Сохраните файл и выйдите из nano, затем создайте задание:
kubectl apply -f counter-job.yaml
Теперь давайте отслеживать его журналы. Сначала найдите имя пода:
kubectl get pods -l job-name=counter-job
Затем отслеживайте его журналы:
kubectl logs -f <counter-job-pod-name>
Вы увидите, как счетчик увеличивается каждые 5 секунд:
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Нажмите Ctrl+C, чтобы остановить отслеживание журналов.
Понимая, как получить доступ к журналам и анализировать их, вы можете эффективно устранять неполадки и отлаживать свои задания Kubernetes.
Расширенные методы мониторинга заданий
Теперь, когда вы знаете основы мониторинга заданий Kubernetes, давайте рассмотрим некоторые более продвинутые методы, которые могут помочь вам более эффективно отслеживать задания, особенно в производственных средах.
Использование меток для организации заданий
Метки (labels) — это пары ключ-значение, которые можно прикрепить к ресурсам Kubernetes. Они полезны для организации и выбора подмножеств ресурсов. Давайте создадим задание с пользовательскими метками:
cd ~/project
nano labeled-job.yaml
Скопируйте и вставьте следующее содержимое YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: labeled-job
labels:
department: engineering
app: demo
environment: training
spec:
template:
spec:
containers:
- name: labeled
image: busybox:1.28
command: ["sh", "-c", 'echo "This is a labeled job" && sleep 10']
restartPolicy: Never
Сохраните файл и выйдите из nano, затем создайте задание:
kubectl apply -f labeled-job.yaml
Теперь вы можете фильтровать задания по их меткам:
kubectl get jobs -l department=engineering
Это покажет только задания с меткой department=engineering.
Вы можете использовать несколько меток для более конкретной фильтрации:
kubectl get jobs -l department=engineering,environment=training
Мониторинг событий заданий
Kubernetes генерирует события для различных изменений состояния в ваших заданиях. Эти события могут предоставить ценную информацию о жизненном цикле ваших заданий.
Давайте посмотрим события, связанные с нашими заданиями:
kubectl get events --sort-by=.metadata.creationTimestamp
Эта команда показывает все события в вашем пространстве имен, отсортированные по времени. Вы можете отфильтровать события, связанные с конкретным заданием:
kubectl get events --field-selector involvedObject.name=labeled-job
Эти события могут помочь вам понять, когда и почему задания были созданы, запущены или столкнулись с проблемами.
Использование JSONPath для пользовательского вывода
Kubernetes позволяет использовать JSONPath для извлечения определенных полей из вывода команд kubectl. Это полезно для фокусировки на конкретных аспектах ваших заданий:
kubectl get job labeled-job -o jsonpath='{.status.succeeded}'
Эта команда выведет количество успешно завершенных подов для labeled-job.
Чтобы получить время создания задания:
kubectl get job labeled-job -o jsonpath='{.metadata.creationTimestamp}'
Создание CronJob для запланированного выполнения
Для задач, которые необходимо запускать по расписанию, Kubernetes предоставляет CronJobs. Давайте создадим простой CronJob:
cd ~/project
nano simple-cronjob.yaml
Скопируйте и вставьте следующее содержимое YAML:
apiVersion: batch/v1
kind: CronJob
metadata:
name: simple-cronjob
spec:
schedule: "*/1 * * * *" ## Run every minute
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
command: ["sh", "-c", 'date; echo "Hello from CronJob"']
restartPolicy: Never
Сохраните файл и выйдите из nano, затем создайте CronJob:
kubectl apply -f simple-cronjob.yaml
Убедитесь, что CronJob был создан:
kubectl get cronjobs
Вы должны увидеть вывод, похожий на:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
simple-cronjob */1 * * * * False 0 <none> 10s
Подождите минуту или две, затем проверьте задания, созданные CronJob:
kubectl get jobs
Вы должны увидеть задания с именами, такими как simple-cronjob-<timestamp>.
Чтобы просмотреть журналы последнего выполнения CronJob, сначала найдите под:
kubectl get pods --sort-by=.metadata.creationTimestamp
Затем просмотрите его журналы:
kubectl logs <latest-cronjob-pod>
CronJobs мощны для планирования повторяющихся задач в вашем кластере Kubernetes, и к ним также можно применять те же методы мониторинга, которые мы изучили.
Очистка
Прежде чем мы закончим, давайте очистим созданные нами ресурсы:
kubectl delete job hello-job long-job failed-job counter-job labeled-job
kubectl delete cronjob simple-cronjob
Это удалит все задания и CronJob из вашего кластера.
Резюме
В этом руководстве вы узнали, как эффективно мониторить задания Kubernetes и анализировать их журналы. Теперь вы знаете, как:
- Настроить среду Kubernetes, используя Minikube
- Создавать задания Kubernetes с различными конфигурациями
- Отслеживать статус заданий, используя
kubectl getиkubectl describe - Получать доступ и анализировать журналы заданий, используя
kubectl logs - Использовать расширенные методы, такие как метки (labels), события (events) и JSONPath, для более эффективного мониторинга
- Создавать запланированные задания, используя CronJobs
Эти навыки необходимы для управления контейнеризованными приложениями в среде Kubernetes, позволяя вам обеспечивать надежность и производительность ваших пакетных процессов. Понимая, как отслеживать ход выполнения заданий и устранять неполадки с помощью журналов, вы можете поддерживать эффективные и безошибочные рабочие нагрузки Kubernetes.
Продолжая свой путь в Kubernetes, рассмотрите возможность изучения более продвинутых тем, таких как управление ресурсами, параллелизм заданий и интеграция с внешними решениями мониторинга, такими как Prometheus и Grafana.


