Создание секрета docker-registry и проверка статуса пода

Создание секрета docker-registry

Чтобы создать секрет типа docker-registry с учётными данными для доступа к Docker Registry, выполните команду (в терминале, где у вас настроен доступ к кластеру):

где:

  • <имя секрета> — имя создаваемого секрета;
  • <URL репозитория> — URL, который вы указали в поле URL при настройке приватного репозитория;
  • <логин> — логин для доступа к репозиторию;
  • <пароль или токен> — пароль или токен доступа (например, Personal Access Token из GitLab/GitHub);
  • <email> — электронная почта, привязанная к учётной записи на хостинге репозиториев.

Подробнее см. в официальной документации Kubernetes.

Добавление секрета в манифесты подов

Есть два основных способа сообщить Kubernetes, какой секрет использовать для загрузки образов:

Добавьте блок imagePullSecrets в манифест вашего пода.

Пример манифеста deployment.yaml:

где:

  • <URL репозитория> — URL, который вы указали в поле URL при настройке приватного репозитория;
  • <имя секрета> — имя созданного секрета.

Подробнее о imagePullSecrets см. в официальной документации Kubernetes.

Это глобальный подход. Если вы добавите секрет в сервисный аккаунт (ServiceAccount), который используют ваши поды, то они смогут использовать этот секрет для доступа к приватным репозиториям. Это избавляет от необходимости прописывать imagePullSecrets в каждом манифесте.

Отредактируйте ServiceAccount, добавив в него ссылку на секрет:

где:

  • <имя сервисного аккаунта> — имя сервисного аккаунта (ServiceAccount);
  • <имя секрета> — имя секрета типа docker-registry, который вы создали ранее
  • <namespace> — имя пространства имён, в котором запускается под.

В результате новые поды, созданные в этом пространстве имён с указанным сервисным аккаунтом, будут автоматически использовать указанный секрет для загрузки образов.

Проверка статуса пода

Убедитесь, что под успешно создался и образ загрузился, проверив выводы команд и логи:

  1. Проверьте статус пода, выполнив команду:
    • STATUS = Running — под запущен и работает;

    • STATUS = ContainerCreating — под создаётся. На этом этапе Kubernetes загружает образы контейнеров и настраивает их. Если под остаётся в этом состоянии более 5 минут, возможно, возникли проблемы с загрузкой образа или нехваткой ресурсов на узле (например, недостаточно места на диске). В таком случае рекомендуется провести диагностику;

    • STATUS = ErrImagePullKubernetes не смог загрузить образ контейнера, проведите диагностику;

      • неверное имя образа или тег;

      • проблемы с доступом к приватному репозиторию (сетевые настройки, firewall);

      • неправильные учётные данные для приватного репозитория;

      • отсутствует образ в указанном репозитории;

      • превышен лимит загрузок.

    • STATUS = ImagePullBackOffKubernetes не смог загрузить образ и перешёл в режим паузы перед повторной попыткой (backoff), проведите диагностику.

      • все причины, характерные для ErrImagePull;

      • недостаточно прав у сервисного аккаунта;

      • недостаточно места на диске;

      • блокировка в репозитории IP-адреса узла, с которого отправляется запрос на загрузку образа;

      • повреждение локального кеша образов на узле.

  2. Проведите диагностику. Если под завис в статусе ContainerCreating или статус пода ErrImagePull или ImagePullBackOff, изучите описание пода. Чтобы получить описание пода, выполните команду:Обратите внимание на секцию Events — Kubernetes хронологически выводит всё, что происходило с подом. Ищите сообщения с типом Warning.

    В этом примере видно, что проблема в доступе к репозиторию — 401 Unauthorized.

    Частые ошибки в секции Events:
    • 404 Not Found — образ не найден по указанному URL. Проверьте путь к образу, тег и имя образа;
    • x509: certificate signed by unknown authority — Kubernetes не может проверить SSL-сертификат при подключении к приватному репозиторию. Возможно, сертификат самоподписанный или корневой сертификат не доверен. Установите корневой доверенный сертификат или настройте Kubernetes на игнорирование проверки сертификатов (что небезопасно);
    • no basic auth credentials — не предоставлены учётные данные для доступа к образу в приватном репозитории. Убедитесь, что:
      • секрет добавлен в манифесты подов и связан с соответствующим пространством имен (namespace);

        где:

        • <namespace> — имя пространства имён, в котором запускается под;
        • <имя секрета> — имя секрета типа docker-registry, который вы создали ранее.

        где:

        • NAME — имя секрета. Найдите секрет, который создали для приватного репозитория;

        • TYPE — тип секрета. Для учётных данных приватного репозитория должен быть тип kubernetes.io/dockerconfigjson. Если есть тип Opaque, значит, секрет создан неправильно;

        • DATA — количество ключей/записей внутри секрета. Для секрета типа kubernetes.io/dockerconfigjson всегда будет 1 (один ключ с именем .dockerconfigjson);

        • AGE — как давно был создан секрет.

        где:

        • <имя секрета> — имя секрета. Проверьте, что это секрет, который вы создали ранее;
        • <namespace> — имя пространства имён. Проверьте, что под запускается в соответствующем пространстве имён;
        • Type — проверьте, что тип секрета kubernetes.io/dockerconfigjson;
        • Data — ключ с именем .dockerconfigjson (стандартное имя для учётных данных) и размер его значения в байтах. Размер 0 указывает на ошибку создания — секрет пуст.

        Примечание

        Команда describe secret не показывает сами учётные данные (логин, пароль, URL репозитория). Они хранятся в закодированном формате base64 внутри секрета.

        Для просмотра учётных данных используйте команду get secret.



      • учётные данные в секрете верные, непросроченные и имеют права на скачивание образа;

        где:

        • <имя секрета> — имя секрета типа docker-registry, который вы создали ранее
        • <namespace> — имя пространства имён, в котором запускается под.

        В результате будет выведен JSON, где вы можете проверить правильность логина, пароля и URL репозитория.

      • секрет корректно добавлен в сервисный аккаунт (ServiceAccount), если используется метод привязки секрета к ServiceAccount;

        где:

        • <namespace> — имя пространства имён, в котором запускается под.

        В результате секрет будет указан в разделе imagePullSecrets.

        где:

        • <имя сервисного аккаунта> — имя сервисного аккаунта (ServiceAccount);
        • <namespace> — имя пространства имён, в котором запускается под;
        • <имя секрета> — имя секрета типа docker-registry, который вы создали ранее
        • <имя монтируемого секрета> — имя секрета, который можно смонтировать (подключить как файл) в поды, использующие этот сервисный аккаунт;
        • <имя токена> — имя JWT -токена. Создаётся автоматически и используется для доступа к Kubernetes API.


      • брандмауэр, группа безопасности и DNS не блокируют доступ узла к приватному репозиторию;
      • указанный образ имеется в приватном репозитории, и у него верный тег.
  3. Если под перешёл в статус Running, но вы хотите увидеть логи работы приложения внутри контейнера, используйте команду:
    Команда покажет логи приложения (например, логи Nginx или вашего кода), но не покажет логи процесса загрузки образа. Для диагностики проблем с загрузкой образа используйте команду kubectl describe pod.