Gke imagepullbackoff на gcr.io

Я попытался настроить свой собственный контейнер на GKE с помощью gcr.io и все время получал ошибку ImagePullBackOff.

Думая, что я делаю что-то не так, я вернулся к руководству здесь https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app, выполнил все шаги и получил ту же ошибку. Это похоже на проблему с учетными данными, но я выполняю все шаги руководства, и мне все равно не повезло.

Как мне отладить эту ошибку, если журналы не помогают.

шаги 1–4 учебной работы.

kubectl run hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1 --port 8080

не работает с ImagePullBackOff Я думал, что GKE и gcr.io автоматически обрабатывают учетные данные. Что я делаю неправильно? Как мне отладить это?

kubectl describe pods hello-web-6444d588b7-tqgdm

Name:           hello-web-6444d588b7-tqgdm
Namespace:      default
Node:           gke-aia-default-pool-9ad6a2ee-j5g7/10.152.0.2
Start Time:     Sat, 27 Oct 2018 06:51:38 +1000
Labels:         pod-template-hash=2000814463
                run=hello-web
Annotations:    kubernetes.io/limit-ranger=LimitRanger plugin set: cpu request for container hello-web
Status:         Pending
IP:             10.12.2.5
Controlled By:  ReplicaSet/hello-web-6444d588b7
Containers:
hello-web:
    Container ID:   
    Image:          gcr.io/<project-id>/hello-app:v1
    Image ID:       
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Waiting
    Reason:       ImagePullBackOff
    Ready:          False
    Restart Count:  0
    Requests:
    cpu:        100m
    Environment:  <none>
    Mounts:
    /var/run/secrets/kubernetes.io/serviceaccount from default-token-qgv8h (ro)
Conditions:
Type           Status
Initialized    True 
Ready          False 
PodScheduled   True 
Volumes:
default-token-qgv8h:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-qgv8h
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type     Reason                 Age                  From                                         Message
----     ------                 ----                 ----                                         -------
Normal   Scheduled              45m                  default-scheduler                            Successfully assigned hello-web-6444d588b7-tqgdm to gke-aia-default-pool-9ad6a2ee-j5g7
Normal   SuccessfulMountVolume  45m                  kubelet, gke-aia-default-pool-9ad6a2ee-j5g7  MountVolume.SetUp succeeded for volume "default-token-qgv8h"
Normal   Pulling                44m (x4 over 45m)    kubelet, gke-aia-default-pool-9ad6a2ee-j5g7  pulling image "gcr.io/<project-id>/hello-app:v1"
Warning  Failed                 44m (x4 over 45m)    kubelet, gke-aia-default-pool-9ad6a2ee-j5g7  Failed to pull image "gcr.io/<project-id>/hello-app:v1": rpc error: code = Unknown desc = Error response from daemon: repository gcr.io/<project-id>/hello-app not found: does not exist or no pull access
Warning  Failed                 44m (x4 over 45m)    kubelet, gke-aia-default-pool-9ad6a2ee-j5g7  Error: ErrImagePull
Normal   BackOff                5m (x168 over 45m)   kubelet, gke-aia-default-pool-9ad6a2ee-j5g7  Back-off pulling image "gcr.io/<project-id>/hello-app:v1"
Warning  Failed                 48s (x189 over 45m)  kubelet, gke-aia-default-pool-9ad6a2ee-j5g7  Error: ImagePullBackOff

разрешения кластера:

User info Disabled
Compute Engine Read/Write
Storage Read Only
Task queue Disabled
BigQuery Disabled
Cloud SQL Disabled
Cloud Datastore Disabled
Stackdriver Logging API Write Only
Stackdriver Monitoring API Full
Cloud Platform Disabled
Bigtable Data Disabled
Bigtable Admin Disabled
Cloud Pub/Sub Disabled
Service Control Enabled
Service Management Read Only
Stackdriver Trace Write Only
Cloud Source Repositories Disabled
Cloud Debugger Disabled

Вышеупомянутая проблема была решена в терминале командной строки. Я также попробовал тот же пример в браузере. Итак, я перешел на страницу кластера Kubernetes, выбрал изображение hello-app из раскрывающегося списка (gcr.io) и нажал кнопку развертывания. Он сгенерировал yaml и попытался развернуть. Результатом была такая же неудача. Может это проблема региона? Я в зонах / австралия-юго-восток1-б.

Colin McCririck 26.10.2018 06:51

Это не регион. Я удалил свой кластер и заново создал новый кластер с помощью интерфейса браузера и выбрал us-central1-a. Затем развернул образец hello-app и обнаружил тот же сбой при извлечении изображения.

Colin McCririck 26.10.2018 07:04

Можете ли вы описать модуль и предоставить полное сообщение об ошибке ImagePullBackOff?

Patrick W 26.10.2018 15:32

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

Patrick W 26.10.2018 15:33

@ patrick-w Я отредактировал сообщение с описанием модуля и областями кластера (области не менял)

Colin McCririck 27.10.2018 00:48
7
5
7 188
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Прочитав некоторые документы, я вручную добавил доступ, следуя этим инструкциям: https://cloud.google.com/container-registry/docs/access-control

и это теперь позволяет развернуть образец кода. Похоже, автоматический доступ от gke к gcr не работал.

Учетная запись службы kubectl должна иметь необходимые разрешения для выполнения развертывания и доступа к GCR (администратор хранилища). Шаг 1 . создать сервисный аккаунт на GCP и назначить роль с разрешениями Kubernetes и GCR. Шаг 2 . сохранить сгенерированный файл Json учетной записи службы Шаг 3 . Выполните аутентификацию с помощью G-Cloud с тем же файлом Json. Шаг 4. Выполните развертывание

При создании кластера GKE убедитесь, что для ваших узлов есть область действия Хранение RO или https://www.googleapis.com/auth/devstorage.read_only.

Я споткнулся об этом при создании кластера GKE через Terraform и получил:

node_config {
    oauth_scopes = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
    ]

...

вместо того

node_config {
    oauth_scopes = [
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring",
      "https://www.googleapis.com/auth/devstorage.read_only"
    ]

...

Спасибо, что проблема решена для меня, ее было сложно отследить.

patrick-fitzgerald 23.10.2020 07:20

Другие вопросы по теме