Руководство по поиску и устранению неисправностей K8s

Примечание. Полная ментальная карта доступна по адресу: K8s Troubleshooting Mind Map.

Что такое ошибка ImagePullBackOff?

В K8s, если вы столкнетесь с ошибкой ImagePullBackOff, это означает, что ваш модуль не может получить указанный образ из реестра контейнеров. Например:

$ kubectl get pods
NAME                       READY   STATUS             RESTARTS   AGE
nginx                      0/1     ImagePullBackOff   0          5m

Вы можете использовать команду kubectl describe pod <pod_name>, чтобы увидеть больше информации об ошибке.

Events:
  Type     Reason       Age               From               Message
  ----     ------       ----              ----               -------
  Normal   Scheduled    5m                default-scheduler  Successfully assigned default/my-pod to node1
  Warning  Failed       5m                kubelet, node1     Error: ImagePullBackOff
  Normal   Pulling      4m (x2 over 5m)   kubelet, node1     pulling image "myregistry/myimage:v1"
  Warning  Failed       4m (x2 over 5m)   kubelet, node1     Failed to pull image "myregistry/myimage:v1": rpc error: code = Unknown desc = Error response from daemon: Get https://myregistry/v2/myimage/manifests/v1: unauthorized: authentication required

Действия по устранению неполадок

Проверьте имя изображения и тег

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

Проверить репозиторий изображений

Иногда, если вы используете частный реестр образов, возможно, что служба реестра не запущена и не работает. Проверьте, запущен ли ваш реестр образов и не заблокирован ли он какими-либо правилами брандмауэра.

Проверить наличие изображения

Проверьте, доступен ли образ в реестре контейнеров.

Проверить состояние сети

Убедитесь, что у кластера K8s есть доступ к реестру контейнеров и что нет проблем с сетью, блокирующих подключение.

Проверить секретные учетные данные

Убедитесь, что учетная запись службы или секрет, используемые модулем, имеют правильные учетные данные для извлечения образа.

Вы можете проверить imagePullSecret (тип секретного объекта, который используется для аутентификации в реестре контейнеров). Обычно он содержит имя пользователя и пароль или токен API, который можно использовать для извлечения образов из реестра.

Вы можете найти его имя в определении Pod.

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

Затем вы можете использовать команду kubectl get secret regcred --output=yaml для просмотра содержимого этого секрета:

apiVersion: v1
kind: Secret
metadata:
  ...
  name: regcred
  ...
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson

Значение поля .dockerconfigjson — это представление ваших учетных данных Docker в формате base64.

Проверить журналы модуля

Дополнительные сведения об ошибке см. в журналах модуля. Команда:

$ kubectl logs <pod-name>

Эта команда по умолчанию отображает журналы для первого контейнера в поде. Если у пода несколько контейнеров и вы хотите просмотреть журналы для определенного контейнера, вы можете указать имя контейнера с флагом -c или --container:

$ kubectl logs my-pod -c my-container

Вы можете использовать команду kubectl describe pod <pod-name>, которая предоставит подробную информацию о поде, включая список контейнеров и их текущий статус.

Проверьте версию K8s

Убедитесь, что версия компонентов K8s (особенно среда выполнения контейнера) работает с образом. Интересное чтение доступно здесь: https://github.com/kubernetes/minikube/issues/14789

Проверьте лимиты ресурсов

Убедитесь, что у пода достаточно ресурсов для запуска контейнера. Вы можете использовать kubectl describe po <pod_name> для проверки ограничений ресурсов ЦП и памяти.