#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
. Это говорит о том, что вы неправильно создали секрет:
- Создайте учетную запись службы и сгенерируйте ключ
- Создайте секрет точно так, как показано:
kubectl create secret docker-registry gcr-json-key...
(вdefault
пространстве имен, если--namespace=...
не отличается) - Обновите спецификацию 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, которые я могу протестировать