Docker-for-desktop kubernetes извлекает изображение из частного репозитория

#docker #kubernetes #google-cloud-platform #docker-for-mac

#docker #kubernetes #google-облачная платформа #docker-for-mac

Вопрос:

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

Мне удалось выполнить развертывание в кластере GCP, но локально я получаю ErrImagePull , когда пытаюсь применить развертывание.

Я попробовал выполнить следующие шаги

  1. Создал a Service Account с ролью Viewer и загрузил файл json

  2. Я закодировал файл с помощью следующей команды openssl base64 -in file.json -out encodedfile.json

  3. Я удалил возвращаемые символы в закодированном файле (чтобы иметь закодированное содержимое в одной строке)

  4. Я создал секрет с помощью yaml, чтобы иметь доступ к реестру docker, и вставил содержимое закодированного файла в .dockerconfigjson

    apiVersion: v1 вид: Секретные метаданные: имя: gcr-json-key пространство имен: данные разработки: .dockerconfigjson: xxxxx тип: kubernetes.io/dockerconfigjson

  5. При развертывании я добавил

    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. Спасибо!