Извлечение образа docker в GKE

#docker #kubernetes #google-kubernetes-engine

# #docker #kubernetes #google-kubernetes-engine

Вопрос:

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

У меня есть Google SDK, настроенный локально с помощью kubectl и моей учетной записи Google, которая является владельцем проекта и имеет все необходимые разрешения. Когда я использую

 kubectl create deployment hello-app --image=gcr.io/{project-id}/hello-app:v1
 

Я вижу, что развертывание на моей консоли GKE постоянно завершается сбоем, поскольку оно «не может извлечь изображение из репозитория.ErrImagePull не может извлечь изображение «из реестра».

Он содержит 4 рекомендации, которые я уже проверил трижды:

  • Проверьте, нет ли орфографических ошибок в именах изображений.
  • Проверьте наличие ошибок при извлечении изображений вручную (все нормально в облачной оболочке)
  • Проверьте секретные настройки извлечения изображения, поэтому, исходя из этого https://blog.container-solutions.com/using-google-container-registry-with-kubernetes , я вручную добавил ‘gcr-json-key’ из новой учетной записи службы с разрешениями на просмотр проекта, а также ‘gcr-access-token’ в учетную запись службы kubectl по умолчанию.
  • Проверьте брандмауэр для кластера, чтобы убедиться, что кластер может подключаться к «. Afaik, это не должно быть проблемой для недавно созданного кластера.

Сами модули предоставляют следующий код ошибки:

 Failed to pull image "gcr.io/{project id}/hello-app:v1": 
[rpc error: code = Unknown desc = Error response from daemon: 
Get https://gcr.io/v2/{project id}/hello-app/manifests/v1: unknown: Unable to parse json key., 
rpc error: code = Unknown desc = Error response from daemon: 
Get https://gcr.io/v2/{project id}/hello-app/manifests/v1: 
unauthorized: Not Authorized., rpc error: code = Unknown desc = Error response from daemon: 
pull access denied for gcr.io/{project id}/hello-app, 
repository does not exist or may require 'docker login': denied: 
Permission denied for "v1" from request "/v2/{project id}/hello-app/manifests/v1".]
 

Теперь мой вопрос: что я делаю не так или как я могу узнать, почему мои модули не могут извлечь мое изображение?


Спецификация учетной записи службы Kubernetes по умолчанию:

 kubectl get serviceaccount -o json
{
    "apiVersion": "v1",
    "imagePullSecrets": [
        {
            "name": "gcr-json-key"
        },
        {
            "name": "gcr-access-token"
        }
    ],
    "kind": "ServiceAccount",
    "metadata": {
        "creationTimestamp": "2020-11-25T15:49:16Z",
        "name": "default",
        "namespace": "default",
        "resourceVersion": "6835",
        "selfLink": "/api/v1/namespaces/default/serviceaccounts/default",
        "uid": "436bf59a-dc6e-49ec-aab6-0dac253e2ced"
    },
    "secrets": [
        {
            "name": "default-token-5v5fb"
        }
    ]
}
 

Ответ №1:

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

Пара вещей:

  • В сообщении об ошибке говорится Failed to pull image "gcr.io/{project id}/hello-app:v1" . Вы отредактировали сообщение об ошибке, чтобы удалить свой {project id} ? Если нет, то это одна проблема.
  • Моя следующая забота — это вторая строка: Unable to parse json key . Это говорит о том, что вы неправильно создали секрет:
  1. Создайте учетную запись службы и сгенерируйте ключ
  2. Создайте секрет точно так, как показано: kubectl create secret docker-registry gcr-json-key... default пространстве имен, если --namespace=... не отличается)
  3. Обновите спецификацию Kubernetes с помощью ImagePullSecrets

Из-за этого ImagePullSecrets требования я не знаю альтернативного kubectl run эквивалента, но вы можете попробовать получить доступ к своему изображению с помощью Docker с вашего хоста:

См.: https://cloud.google.com/container-registry/docs/advanced-authentication#json-key

А затем попробуйте docker pull gcr.io/{project id}/hello-app:v1 убедиться, что {project id} он заменен правильным идентификатором проекта GCP.

Это доказывает:

  • Учетная запись службы и ключ указаны правильно
  • Изображение контейнера является правильным

Таким образом, остается ваше создание Секрета и ваша спецификация Kubernetes для тестирования.

ОБРАТИТЕ ВНИМАНИЕ, что разрешение учетной записи службы IAM Project Viewer слишком велико для доступа к GCR, см. Разрешения

Используйте StorageObject Viewer ( roles/storage.objectViewer ), если учетной записи службы нужно только извлекать изображения.

Комментарии:

1. Спасибо за ваш подробный комментарий. — Я действительно отредактировал ошибку и изменил свой идентификатор проекта для этого сообщения. — Это вполне может быть ключ json. На втором шаге вы упоминаете о добавлении секретного ключа точно так же, как в сообщении, включает ли это путь к файлу ключа? Поскольку я использовал свой локальный путь, то kubectl create secret docker-registyr gcr-json-key --docker-name=gcr.io --docker-username=_json_key --docker-password="$(cat C:/user/{path to local key}/key.json)" --docker-email=any@valid.email есть — О спецификации Kubernetes, я прикрепил спецификации kubectl serviceaccount по умолчанию.

2. Учитывая, что ни локальный путь, ни точно показанная версия не работают, должен ли я загружать свой ключ в облачное хранилище и изменять путь в kubectl create secret ... каталог облачного хранилища?

3. Похоже, вы работаете в Windows. Команда $(cat C:/user/{path to local key} может быть неверной. cat C:/user/{path to local key Отображает ли ваш ключ? Делает echo $(cat C:/user/{path to local key} ли это то же самое? В Linux эта конструкция копирует и вставляет значение ключевого файла в переменную среды.

4. Нет, вы можете сгенерировать секрет из своей локальной файловой системы (см. Мой предыдущий комментарий). kubectl позаботится о создании секрета для вас в вашем кластере.

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