Не удается вытащить образ из удаленного реестра Gitlab в Kubernetes - PullRequest
1 голос
/ 26 февраля 2020

Я безуспешно пытался создать развертывание образа docker в кластере Kubernetes, мой файл deploy.yaml выглядит так:

apiVersion: v1
kind: Pod
metadata:
  name: application-deployment
  labels:
    app: application
spec:
  serviceAccountName: gitlab
  automountServiceAccountToken: false
  containers:
  - name: application
    image: example.org:port1/foo/bar:latest
    ports:
      - containerPort: port2
  volumes:
    - name: foo
      secret:
        secretName: regcred

Но не удается получить образ.

Не удалось получить изображение "example.org:port1/foo/bar:latest": rp c error: code = Unknown des c = Ответ об ошибке от демона: Получить https://example.org : port1 / v2 / foo / bar / manifest / latest : отказано: доступ запрещен

Секрет, используемый в deployment.yaml, был создан следующим образом:

kubectl create secret docker-registry regcred --docker-server=${CI_REGISTRY} --docker-username=${CI_REGISTRY_USER} --docker-password=${CI_REGISTRY_PASSWORD} --docker-email=${GITLAB_USER_EMAIL}

Попытка # 1: добавление imagePullSecrets

...
imagePullSecrets:
  - name: regcred

приводит к:

Не удалось получить изображение "example.org:port1/foo/bar:latest ": rp c error: code = Unknown des c = Ошибка ответа от демона: Get https://example.org: port1 / v2 / foo / bar / manifest / latest : неавторизовано: HTTP Basi c: Доступ запрещен

Решение:

Я создал токен развертывания в Настройки> Репозиторий> Развертывание токенов> (создан с областью read_registry )

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

kubectl create secret docker-registry regcred --docker-server=${CI_REGISTRY} --docker-username=${CI_DEPLOY_USER} --docker-password=${CI_DEPLOY_PASSWORD}

У меня есть проблемная строка c из учебников и документации Gitlab, где они ' мы описали токены развертывания, но в дальнейшем использовали проблемную строку c в примерах.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вам необходимо добавить imagePullSecret в свое развертывание, чтобы ваш модуль был:

apiVersion: v1
kind: Pod
metadata:
  name: application-deployment
  labels:
    app: application
spec:
  serviceAccountName: gitlab
  automountServiceAccountToken: false
  containers:
  - name: application
    image: example.org:port1/foo/bar:latest
    ports:
      - containerPort: port2
  imagePullSecrets:
  - name: regcred

Убедитесь, что секрет и модуль работают в одном и том же пространстве имен.

Я заметил, что вы пытаясь запустить команду на конвейере на gitlab-ci, после запуска команды create secret проверьте, что ваш секрет верен (с заменой переменных).

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

0 голосов
/ 26 февраля 2020

Я воспроизвел вашу проблему, и проблема связана с паролем, который вы использовали при создании секрета репозитория. При создании секрета для репозитория gitlab вы должны использовать личный токен, созданный в gitlab, вместо пароля.

Вы можете создать токен, перейдя к Settings -> Access Tokens. Затем вы должны выбрать имя для вашего токена, срок действия и область действия токена.

Затем создайте секрет, как ранее, запустив

kubectl create secret docker-registry regcred --docker-server=$docker_server --docker-username=$docker_username --docker-password=$personal_token

. При создании модуля необходимо включить

  imagePullSecrets:
  - name: regcred
...