Поиск по сайту:

Как отлаживать ошибки Kubernetes «ImagePullBackOff»


Кластеры Kubernetes могут столкнуться с рядом проблем при попытке получить ваши образы контейнеров. При возникновении ошибки ваши модули переходят в состояние ImagePullBackOff. Вот как можно отладить это распространенное, но загадочное сообщение, чтобы вы могли получать свои услуги онлайн.

Как работает подбор изображений

Kubernetes необходимо получить образ, когда вы создаете новое развертывание или обновляете существующее с другой ссылкой на тег. Ответственность за получение изображений лежит на процессе Kubelet на каждом рабочем узле. Каждое изображение, на которое ссылается манифест пода, должно быть доступно для всех узлов в кластере, чтобы любой из них мог выполнить запрос планирования контейнера.

Загрузка может завершиться неудачно, если путь к изображению неверен, вы неправильно аутентифицированы или сеть выходит из строя. Когда это происходит, Kubernetes «отступает» и планирует еще одну попытку загрузки. Задержка перед следующим извлечением увеличивается экспоненциально каждый раз, когда попытка терпит неудачу, вплоть до предела в пять минут.

Если ваш под показывает состояние ImagePullBackOff, в Kubernetes было несколько неудачных попыток извлечения изображений, и теперь он ожидает повторной попытки. Контейнер не сможет запуститься, пока образ не будет доступен.

Вы можете оставить Pod в этом состоянии, если знаете, что проблема связана с состоянием сети или другой временной ошибкой. Kubernetes в конечном итоге выполнит еще одну попытку и успешно получит образ. Если это не так, вот как начать отладку, чтобы вы могли запустить свой модуль.

Проверьте основы

Прежде всего, стоит проверить самые основы. Ваш манифест ресурса ссылается на допустимое изображение, которое действительно существует? Проверьте путь реестра и тег изображения на наличие простых опечаток.

Вы можете проверить внутреннее состояние Kubernetes с помощью команды describe pod в Kubectl. Это дает вам больше информации, чем get pod и инструментальная панель Kubernetes.

kubectl describe pod my-pod --namespace my-namespace

Изменения в жизненном цикле пода отображаются под заголовком «События». Первое событие будет Запланировано; за ним должно следовать событие Pulling для первой попытки извлечения. После этого вы увидите событие Failed или BackOff, если получение не удалось. Они будут повторяться позже в списке, если Kubernetes все еще находится в цикле отсрочки и повторной попытки.

Чтение Message, связанного с этими событиями, часто указывает на основную причину проблемы. Сообщение manifest for image:tag not found означает, что изображение допустимо, но вы указали недопустимый тег. Если вы видите, что не существует или нет доступа по запросу, проверьте правильность путей реестра и образа. Когда вы уверены, что они правы, проблема будет связана с неправильной аутентификацией.

Управление входами в реестр

Вы должны войти в систему, прежде чем загружать личные изображения. В Kubernetes это двухэтапный механизм: создайте секрет, содержащий учетные данные, а затем укажите ссылку на этот секрет в определениях ваших подов.

Поле Pod называется imagePullSecrets. Он должен указать секрет Kubernetes, который предоставляет токен входа в реестр. Этот секрет должен хранить значение JSON, совместимое с Docker.

apiVersion: v1
kind: Secret
type: kubernetes.io/dockerconfigjson
metadata:
  name: image-pull-secret
data:
  .dockerconfigjson: {{ "{"auths": {"registry.example.com": {"username": "demo-user", "password": "my-password"}}}" | b64enc }}

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: registry.example.com/my-image:latest
  imagePullSecrets:
    - name: image-pull-secret

В этом манифесте показано, как создать секрет для входа в registry.example.com в качестве демо-пользователя с паролем мой-пароль. Pod ссылается на секрет по его имени. Процессы Kubelet на узлах вашего кластера будут включать фрагмент Docker config.json, когда они извлекают образы из реестра.

Фрагмент должен быть закодирован в Base64, чтобы быть действительным значением секрета Kubernetes. Вы можете использовать предварительно закодированное значение или передавать обычный текст через b64enc YAML, как показано в манифесте выше.

Тип учетных данных, которые вы используете, будет зависеть от вашего реестра. Во многих случаях пароль на самом деле будет токеном личного доступа или ключом API. Для Docker Hub требуется токен доступа, сгенерированный в настройках вашей учетной записи, если в вашей учетной записи включена двухфакторная аутентификация.

Ограничения скорости реестра

Если вы проверили URL-адрес своего реестра, имя тега изображения и учетные данные для входа, вы можете увидеть ImagePullBackOff из-за ограничений скорости реестра. Docker Hub теперь ограничивает вас 100 извлечениями контейнеров каждые шесть часов. Это число увеличивается до 200 запросов за шесть часов, если вы предоставляете свои учетные данные для входа. Это ограничение может быть быстро достигнуто в активном кластере со многими часто развертываемыми подами.

Ошибка извлечения из-за ограничения скорости будет проявляться так же, как проблема аутентификации. Вам нужно будет подождать, пока не истечет достаточно времени для истечения срока действия ограничения. После этого Kubernetes должен успешно загрузить образ, запустив поды.

Для долгосрочного смягчения последствий рассмотрите возможность запуска собственного реестра в кластере или прокси-сервера для кэширования изображений. Это может значительно снизить частоту обращения к серверам Docker, помогая вам оставаться в пределах ограничений скорости.

Краткое содержание

Поды Kubernetes переходят в состояние ImagePullBackOff, когда узлу не удается получить изображение. Kubelet будет периодически повторять попытки извлечения, поэтому временные ошибки не требуют ручного вмешательства для устранения.

Если вы уверены, что ImagePullBackOff — это не просто временная вспышка, начните с проверки правильности пути к изображению модуля. Если это подтвердится, подозревайте неправильные учетные данные для входа или исчерпанное ограничение скорости. Использование kubectl описать покажет последовательность событий, которые привели к сбою.

В качестве последнего варианта вы можете попробовать самостоятельно загрузить образ с другого компьютера, чтобы убедиться, что удаленный сервер реестра действительно работает. Если вы можете получить образ, но ваш кластер не может, у вас могут быть более общие сетевые проблемы, препятствующие доступу ваших узлов к реестру.




Все права защищены. © Linux-Console.net • 2019-2024