Как мониторить статус и логи заданий Kubernetes

KubernetesBeginner
Практиковаться сейчас

Введение

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.