Один узел для кластера GKE не может получить изображение из dockerhub

Это очень взволнованная вещь.

Я создал частный кластер GKE с пулом из 3 узлов. Тогда у меня есть набор реплик с 3 стручками. некоторые из этих модулей будут назначены одному узлу.

Таким образом, один из этих контейнеров всегда ImagePullBackOffЯ проверяю ошибку

Failed to pull image "bitnami/mongodb:3.6": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

И стручки, запланированные для оставшихся двух узлов, работают хорошо.

Я SSH к этому узлу, запустить docker pull и все хорошо. Я не могу найти другой способ устранения этой ошибки.

Я попытался drain или же delete этот узел и позволить кластеру воссоздать узел. но это все еще не работает.

Помоги мне, пожалуйста.

Обновление: из документации GCP он не сможет получить изображения из концентратора докеров.

НО самое странное, что ТОЛЬКО ОДИН узел не может тянуть изображения.

2 ответа

Я помню, что видел это раньше и находил ответ раньше.

https://cloud.google.com/container-registry/docs/pulling-cached-images
Об этом немного говорится, но я объясню, чтобы было легко понять.

Если я разверну частный кластер GKE и создам 3 развертывания:

  • 1-й использует изображение: nginx:latest
  • 2-й использует изображение: nginx:stable
  • Третий использует изображение: docker.io/busybox:1.36.0-glibc.

nginx:latest (общий тег) почти всегда работает
nginx:stable (популярный тег) иногда работает
Суперспецифичный тег (редко используемый тег) почти всегда дает сбой при использовании ImagePullBackOff

Так почему же это так?
1. ImagePullBackOff происходит, когда у модулей/узлов нет шлюза NAT/нет доступа к Интернету

^ – этим вы можете доказать отсутствие Интернета, обратите внимание.curl google.comэто плохой тест для GKE, потому что он по-прежнему доступен через внутреннюю сеть Google / вы получите ответ, потому что сеть Google может получить доступ к google.com без необходимости проходить через Интернет, поэтому я рекомендую тестировать с URL-адресом, отличным от Google, например yahoo.com
(сеть Google также иногда делает некоторые нелогичные/нестандартные вещи, например, маршрутизирует общедоступные IP-адреса по их внутренней сети, поэтому иногда вы можете получить доступ к общедоступным IP-адресам без доступа в Интернет. Обычно это службы Google с общедоступными IP-адресами, которые иногда доступен без доступа в Интернет.)

2. Итак, следующий вопрос, но подождите... как дела? nginx:latestи nginx:stableможете ли вытащить изображение, существующее в Интернете/в Docker Hub, когда нет доступа в Интернет? По сути, почему это работает для некоторых изображений, а не для других?
Ответ сводится к популярности пары «изображение:тег». Достаточно ли он популярен, чтобы его можно было кэшировать в Mirror.gcr.io?

В исходной ссылке, которой я поделился вверху, упоминается «Реестр контейнеров кэширует часто используемые общедоступные образы Docker Hub на Mirror.gcr.io», поэтому, по сути, если вы ссылаетесь на общий тег популярного образа, иногда вам может повезти, чтобы вытащить его. даже без Интернета, потому что кеш доступен через частное IP-пространство / без доступа в Интернет.

Когда модуль, работающий в частном кластере GKE, выдает вам ImagePullBackOff, и вы спрашиваете: что происходит? Я знаю, что этот образ существует!docker pull docker.io/busybox:1.36.0-glibcотлично загружается с моей локальной машины, в их кеше не существует редко используемого тега, который отражает общие теги популярных изображений.

Лучший способ исправить это — либо извлечь все изображения из pkg.dev (реестр артефактов GCP, к которому GKE должен иметь доступ без доступа к Интернету), либо настроить шлюз NAT/убедиться, что частный кластер имеет доступ к Интернету. И вы можете использоватьkubectl exec -it working-nginx-latest-pod -- curl yahoo.comв качестве цикла обратной связи, чтобы проверить, есть ли у кластера доступ к Интернету, когда вы возитесь с настройками VPC для добавления NAT GW.

https://cloud.google.com/kubernetes-engine/docs/best-practices/networking#use-cloudnat
упоминает: По умолчанию (GKE) «частные кластеры не имеют доступа к Интернету. Чтобы поды могли получить доступ к Internet, включите Cloud NAT для каждого региона. Как минимум включите Cloud NAT для основного и дополнительного диапазонов в подсети GKE».

В Kubernetes 1.11 была обнаружена связанная ошибка

Убедитесь, что это не ваш случай

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