kubectl получить стручки показывает ErrImagePull - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь создать модуль, используя мой локальный образ докера следующим образом.

1. Сначала я запускаю эту команду в терминале

eval $(minikube docker-env)

2. Я создал образ докера следующим образом

sudo docker image build -t my-first-image:3.0.0 .

3. Я создал pod.yml, как показано ниже, и я запускаю эту команду

kubectl -f create pod.yml.

4. Затем я попытался запустить эту команду

kubectl get pods

но это показывает следующую ошибку


NAME                             READY   STATUS             RESTARTS   AGE
multiplication-b47499db9-phpb7   0/1     ImagePullBackOff   0          23h
my-first-pod                     0/1     ErrImagePull       0          7s

5.i получить журналы стручков

kubectl describe pod my-first-pod 

Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  99s                default-scheduler  Successfully assigned default/my-first-pod to minikube
  Warning  Failed     41s (x3 over 94s)  kubelet, minikube  Failed to pull image "my-first-image:3.0.0": rpc error: code = Unknown desc = Error response from daemon: pull access denied for my-first-image, repository does not exist or may require 'docker login'
  Warning  Failed     41s (x3 over 94s)  kubelet, minikube  Error: ErrImagePull
  Normal   BackOff    12s (x4 over 93s)  kubelet, minikube  Back-off pulling image "my-first-image:3.0.0"
  Warning  Failed     12s (x4 over 93s)  kubelet, minikube  Error: ImagePullBackOff
  Normal   Pulling    0s (x4 over 98s)   kubelet, minikube  pulling image "my-first-image:3.0.0"

Dockerfile

    FROM node:carbon
    WORKDIR /app
    COPY . .
    CMD [ "node", "index.js" ]

pods.yml

    kind: Pod
    apiVersion: v1
    metadata:
     name: my-first-pod
    spec:
     containers:
     - name: my-first-container
       image: my-first-image:3.0.0

index.js

    var http = require('http');
    var server = http.createServer(function(request, response) {
     response.statusCode = 200;
     response.setHeader('Content-Type', 'text/plain');
     response.end('Welcome to the Golden Guide to Kubernetes
    Application Development!');
    });
    server.listen(3000, function() {
     console.log('Server running on port 3000');
    });

Ответы [ 5 ]

2 голосов
/ 03 апреля 2019

Причина

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

Путь 1

Итак, после создания вашего my-first-image:3.0.0 образа вы должны опубликовать его на DockerHub. Для этого создайте учетную запись на DockerHub и войдите с терминала, используя login command

sudo docker login

После успешного входа в систему заново создайте свой образ докера, указав имя пользователя DockerHub в теге, и отправьте его в DockerHub ( подробнее )

sudo docker image build -t YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0 .
sudo docker push YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0

Обновите ваше изображение в pod.yml как YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0 и создайте свои стручки, как и раньше.

Путь 2

Вы можете настроить поиск необходимого образа докера с вашего локального компьютера вместо загрузки с DockerHub. Для этого вы должны добавить imagePullPolicy: Never в ваш файл pod.yml под определенным описанием контейнера. Ниже приведен пример файла pod.yml, в котором показано, как определить политику извлечения изображений

.
kind: Pod
apiVersion: v1
metadata:
 name: my-first-pod
spec:
 containers:
 - name: my-first-container
   image: YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0
   imagePullPolicy: Never
1 голос
/ 28 марта 2019

отсутствует имя хранилища.

создать учетную запись в dockerHub. затем создайте и вставьте образ в репозиторий в Dockerhub

sudo docker image build -t niranga/my-first-image:3.0.0 .
sudo docker login
sudo docker push niranga/my-first-image:3.0.0

обновить имя изображения в файле pod.yaml как niranga / my-first-image: 3.0.0

должно работать

1 голос
/ 28 марта 2019

Вы собрали образ, но вам нужно отправить его в хранилище Docker.

В случае, если вы создаете образ докера на узле kubernetes, он может сработать, но лучше перенести его в репозиторий, так что докер будет извлекать из центрального репо, так как количество узлов увеличивается, вы не можете контролировать, где будет вызываться модуль pod и изображение будет недоступно.

docker push -t my-first-image:3.0.0 

Если у вас есть закрытое хранилище докеров, перейдите в закрытое хранилище и используйте полное имя образа.

0 голосов
/ 28 марта 2019

Когда вы создаете образ для локального реестра Minikube, вы можете установить imagePullPolicy: Never, чтобы он не пытался извлечь образ из удаленного реестра. Спецификация модуля будет выглядеть примерно так:

kind: Pod
apiVersion: v1
metadata:
 name: my-first-pod
spec:
 containers:
 - name: my-first-container
   image: my-first-image:3.0.0
   imagePullPolicy: Never
0 голосов
/ 28 марта 2019

Поскольку вы используете изображение, не загружая его. Вам придется установить для imagePullPolicy значение Никогда, в противном случае Kubernetes попытается загрузить изображение.

Запуск мини-куба

запуск мини-куба

Установка encker * для докера

eval $ (мини-док-станция для мини-куба)

Создание образа

docker build -t my-first-image: 3.0.0.

Запустить в мини-кубе

kubectl запустить my-first-container --image = my-first-image: 3.0.0 --image-pull-policy = Никогда

Убедитесь, что он работает

kubectl get pods

Ваша спецификация pod должна быть такой, как показано ниже

pods.yml

kind: Pod
apiVersion: v1
metadata:
 name: my-first-pod
spec:
 containers:
 - name: my-first-container
   image: my-first-image:3.0.0
   imagePullPolicy: Never
...