Kubernetes imagePullSecrets не работает; получение " изображение не найдено"

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

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

Я создал секрет, содержащий . Я подтвердил, что он работает, запустив скрипт posted здесь:

 > 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

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

> cat ~/.dockercfg
{"https://index.docker.io/v1/":{"auth":"REDACTED BASE64 STRING HERE","email":"eng@csats.com"}}

Я пробовал запуск кодирования Base64 в Debian вместо 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"}

какие идеи?

4 ответов


Docker генерирует на ~/.docker/ Это выглядит так:

{
    "auths": {
        "index.docker.io/v1/": {
            "auth": "ZmFrZXBhc3N3b3JkMTIK",
            "email": "email@company.com"
        }
    }
}

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

{"https://index.docker.io/v1/": {"auth": "XXXXXXXXXXXXXX", "email": "email@company.com"}}

Примечание 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 имеет тенденцию генерировать многострочную строку)


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

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

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

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

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

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


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

{ 
   "https://index.docker.io/v1/": { 
     "auth": "ZmFrZXBhc3N3b3JkMTIK", 
     "email": "jdoe@example.com" 
   } 
}

в то время как созданный докер в моей машине выглядит так:

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "ZmFrZXBhc3N3b3JkMTIK",
            "email": "email@company.com"
        }
    }
}

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

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

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


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

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

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

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

но секрет, порожденный 1.9.х kubectl это формат:

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

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