2015-09-10 9 views
8

У меня есть готовый кластер Kubernetes, работающий на AWS, установленный с помощью сценария kube-up. Я хотел бы запустить некоторые контейнеры, которые находятся в частном репозитории Docker Hub. Но я продолжаю получать «не найден» ошибка:Kubernetes imagePullSecrets не работает; получение «изображения не найдено»

> kubectl get pod 
NAME      READY  STATUS          RESTARTS AGE 
maestro-kubetest-d37hr 0/1  Error: image csats/maestro:latest not found 0   22m 

Я создал секрет, содержащий .dockercfg файл. Я подтвердил, что это работает, запустив скрипт отправил here:

> kubectl get secrets docker-hub-csatsinternal -o yaml | grep dockercfg: | cut -f 2 -d : | base64 -D > ~/.dockercfg 
> docker pull csats/maestro 
latest: Pulling from csats/maestro 

Я подтвердил, что я не использую the new format of .dockercfg script, мой выглядит следующим образом:

> cat ~/.dockercfg 
{"https://index.docker.io/v1/":{"auth":"REDACTED BASE64 STRING HERE","email":"[email protected]"}} 

Я попытался running the Base64 encode on Debian instead of OS X, нет удачи там. (Она производит ту же строку, как и следовало ожидать.)

Вот YAML для моей репликации контроллера:

--- 
kind: "ReplicationController" 
apiVersion: "v1" 
metadata: 
    name: "maestro-kubetest" 
spec: 
    replicas: 1 
    selector: 
    app: "maestro" 
    ecosystem: "kubetest" 
    version: "1" 
    template: 
    metadata: 
     labels: 
     app: "maestro" 
     ecosystem: "kubetest" 
     version: "1" 
    spec: 
     imagePullSecrets: 
     - name: "docker-hub-csatsinternal" 
     containers: 
     - name: "maestro" 
      image: "csats/maestro" 
      imagePullPolicy: "Always" 

     restartPolicy: "Always" 
     dnsPolicy: "ClusterFirst" 

kubectl version:

Client Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"} 
Server Version: version.Info{Major:"1", Minor:"0", GitVersion:"v1.0.3", GitCommit:"61c6ac5f350253a4dc002aee97b7db7ff01ee4ca", GitTreeState:"clean"} 

Любые идеи?

+1

В вашем примере вы тянете два разных изображения - вы пытались потянуть маэстро? – Clayton

+0

Хороший улов - повторите команду с правильным изображением. Тот же результат. – iameli

+0

У меня такая же проблема. Вы нашли решение? – leonfs

ответ

11

Docker генерирует config.json файл в ~/.docker/ Это выглядит следующим образом:

{ 
    "auths": { 
     "index.docker.io/v1/": { 
      "auth": "ZmFrZXBhc3N3b3JkMTIK", 
      "email": "[email protected]" 
     } 
    } 
} 

, что вы на самом деле хотите это:

{"https://index.docker.io/v1/": {"auth": "XXXXXXXXXXXXXX", "email": "[email protected]"}} 

примечание 3 вещи:

  • 1) есть нет auths упаковка
  • 2) есть https:// перед URL
  • 3) Это одна линия

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

apiVersion: v1 
kind: Secret 
metadata: 
    name: registry 
data: 
    .dockercfg: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX== 
type: kubernetes.io/dockercfg 

Примечание: снова строка .dockercfg равна одной строке (base64 имеет тенденцию генерировать многострочный string)

+1

Ты меня добрался до решения - оказывается, моя проблема заключалась в том, что мой секрет был «type: Opaque» вместо 'type: kubernetes.io/dockercfg'. Приветствия. – iameli

3

У меня была та же проблема. То, что я заметил, что в примере (https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod) .dockercfg имеет следующий формат:

{ 
    "https://index.docker.io/v1/": { 
    "auth": "ZmFrZXBhc3N3b3JkMTIK", 
    "email": "[email protected]" 
    } 
} 

В то время как один порожденный грузчиком в моей машине выглядит примерно так:

{ 
    "auths": { 
     "https://index.docker.io/v1/": { 
      "auth": "ZmFrZXBhc3N3b3JkMTIK", 
      "email": "[email protected]" 
     } 
    } 
} 

Проверив в Исходный код, я обнаружил, что на самом деле есть тест для этого случая использования (https://github.com/kubernetes/kubernetes/blob/6def707f9c8c6ead44d82ac8293f0115f0e47262/pkg/kubelet/dockertools/docker_test.go#L280)

Я подтверждаю, что если вы просто возьмете и закодируете «auths», как в примере, это сработает для вас.

Возможно, документация должна быть обновлена. Я подниму билет на github.

+0

Хм - не решил мою проблему. Я считаю, что я попробовал оба формата изначально. – iameli

6

Другая возможная причина, по которой вы можете увидеть «изображение не найденное», - это то, что пространство имен вашего тайна не совпадает с пространством имен контейнера.

Например, если ваш YAML развертывания выглядит

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: mydeployment 
    namespace: kube-system 

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

apiVersion: v1 
kind: Secret 
metadata: 
    name: mysecret 
    namespace: kube-system 
data: 
    .dockerconfigjson: **** 
type: kubernetes.io/dockerconfigjson 

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

+0

У меня точно такая же проблема. Единственное различие заключается в том, что я действительно ХОЧУ тайну находиться в пространстве имен по умолчанию, поскольку я не хочу создавать ее для всех пространств имен. Есть ли способ ссылаться на секрет пространства имен по умолчанию, пока вход создается внутри пространства имен? – Randy

3

Другая причина, по которой вы можете увидеть эту ошибку, связана с использованием версии kubectl, отличной от версии кластера (например, с использованием kubectl 1.9.x против кластера 1.8.x).

Формат секретности, созданный kubectl create secret docker-registry команда изменилась между версиями.

1.8.x кластер ожидает секрет с форматом:

{ 
    "https://registry.gitlab.com":{ 
     "username":"...", 
     "password":"...", 
     "email":"...", 
     "auth":"..." 
    } 
} 

Но секрет, порожденной 1.9.x kubectl имеет следующий формат:

{ 
    "auths":{ 
     "https://registry.gitlab.com":{ 
     "username":"...", 
     "password":"...", 
     "email":"...", 
     "auth":"..." 
     } 
    } 
} 

Так, дважды проверьте значение данных .dockercfg вашего тайна и убедитесь, что он соответствует формату, ожидаемому вашей версией кластера kubernetes.

+0

Большое спасибо, это действительно решило мою проблему. Я возился с миникубом на окнах, а пока шоколадно устанавливал kubectl-cli версии 1.9 по умолчанию minikube для windows все равно 1,8. Всегда запускайте версию kubectl и дважды проверяйте соответствие версий. – schrom

+0

Это должен быть принятый ответ. Ответ MrE на правильном пути, но он не упоминает ** почему ** формат отличается. Большое спасибо eschnou, вы, наконец, решили проблему, которая заставила меня постукивать головой о стену в течение 2 дней. – PeterH

 Смежные вопросы

  • Нет связанных вопросов^_^