#docker #kubernetes #google-cloud-platform #docker-for-mac
#docker #kubernetes #google-облачная платформа #docker-for-mac
Вопрос:
Я новичок в kubernetes и GCP. Я пытаюсь развернуть локально. У меня есть изображение, которое находится в частном репозитории в реестре Google.
Мне удалось выполнить развертывание в кластере GCP, но локально я получаю ErrImagePull
, когда пытаюсь применить развертывание.
Я попробовал выполнить следующие шаги
-
Создал a
Service Account
с рольюViewer
и загрузил файл json -
Я закодировал файл с помощью следующей команды
openssl base64 -in file.json -out encodedfile.json
-
Я удалил возвращаемые символы в закодированном файле (чтобы иметь закодированное содержимое в одной строке)
-
Я создал секрет с помощью yaml, чтобы иметь доступ к реестру docker, и вставил содержимое закодированного файла в
.dockerconfigjson
apiVersion: v1 вид: Секретные метаданные: имя: gcr-json-key пространство имен: данные разработки: .dockerconfigjson: xxxxx тип: kubernetes.io/dockerconfigjson
-
При развертывании я добавил
imagePullSecrets:
- имя: gcr-json-key
Я получаю ту же ошибку, он не может извлечь из частного реестра Google на мой локальный компьютер
ОБНОВЛЕНИЕ 1
Я закодировал файл json с помощью этой команды
base64 -i myorg-8b8eea93246a.json -o encoded-myorg-8b8eea93246a.json
Затем я проверил, что этот закодированный файл работает
cat encoded-myorg-8b8eea93246a.json | docker login -u _json_key_base64 --password-stdin
https://us-docker.pkg.dev
И это сработало
Login Succeeded
Это файл yaml, который я использую для создания секретного
apiVersion: v1
kind: Secret
metadata:
name: gcr-json-key
namespace: development
data:
.dockerconfigjson: <XXXX content of encoded myorg-8b8eea93246a.json file XXXX>
type: kubernetes.io/dockerconfigjson
И при развертывании у меня есть
...
spec:
...
imagePullSecrets:
- name: gcr-json-key
...
Развертывание создано, но изображение не извлекается. В kubectl get all
я вижу статус ImagePullBackOff
Когда я делаю описание для модуля
Failed to pull image "gcr.io/xxx/yyy": rpc error: code = Unknown desc = Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials.
Комментарии:
1. 1. Что вы имеете в виду
I was able to deploy in a GCP cluster, but locally I am getting ErrImagePull when I try to apply the deployment.
? У вас есть кластер gce / gke, и здесь все работает нормально, но если вы попытаетесь загрузить изображение со своего локального компьютера, вы не сможете этого сделать? 2. Ваше развертывание развернуто в том же пространстве имен, что и ваш secret? Секретные объекты API находятся в пространстве имен, и на них могут ссылаться только модули в том же пространстве имен.2. @Jakub спасибо за ответ. Как вы и писали, в моем кластере в gcp / gke работает. Там я использую учетную запись службы для извлечения изображения из реестра. Я применил ServiceAccount и секрет в моем локальном контексте ПК / пространстве имен, но я получаю ту же ошибку. Спасибо за комментарий, это помогло мне уточнить, что у секретов также есть пространство имен.
Ответ №1:
Вы на правильном пути. Вам необходимо создать секрет для входа в реестр. Это работает для меня:
kubectl create secret docker-registry <secret_name> --docker-server=<your.registry.domain.name> --docker-username=<user> --docker-password=<password> --docker-email=<your_email>
И затем я использую этот секрет для развертывания:
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
creationTimestamp: null
labels:
io.kompose.service: server
spec:
imagePullSecrets:
- name: <secret_name>
Комментарии:
1. спасибо за ваш ответ. Я создал секрет и проверил, что он работает, но по какой-то причине кажется, что развертывание не имеет значений. Я обновлю вопрос. Спасибо!
2. Это сработало, когда я создал секрет без yaml, с помощью командной строки, и я не использовал кодирование base64. Я сразу передал файл json. Спасибо!