Не удалось получить образ "velero/velero-plugin-for-gcp:v1.1.0" при установке Velero в GKE Cluster.

Пытаюсь установить и настроить Velero для резервного копирования кубернетов. Я перешел по ссылке, чтобы настроить его в своем кластере GKE. Установка прошла нормально, но велеро не работает.

Я использую облачную оболочку Google для выполнения всех своих команд (я установил и настроил клиент Velero в своей облачной оболочке Google)

При дальнейшем осмотре развертывания velero и модулей velero я обнаружил, что он не может извлечь образ из репозитория докеров.

kubectl get pods -n velero
NAME                      READY   STATUS              RESTARTS   AGE
velero-5489b955f6-kqb7z   0/1     Init:ErrImagePull   0          20s

Ошибка из модуля velero (модуль kubectl describe pod) (вывод отредактирован для удобства чтения - ниже показана только соответствующая информация)

    Events:
  Type     Reason     Age               From                                                  Message
  ----     ------     ----              ----                                                  -------
  Normal   Scheduled  38s               default-scheduler                                     Successfully assigned velero/velero-5489b955f6-kqb7z to gke-gke-cluster1-default-pool-a354fba3-8674
  Warning  Failed     22s               kubelet, gke-gke-cluster1-default-pool-a354fba3-8674  Failed to pull image "velero/velero-plugin-for-gcp:v1.1.0": 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)
  Warning  Failed     22s               kubelet, gke-gke-cluster1-default-pool-a354fba3-8674  Error: ErrImagePull
  Normal   BackOff    21s               kubelet, gke-gke-cluster1-default-pool-a354fba3-8674  Back-off pulling image "velero/velero-plugin-for-gcp:v1.1.0"
  Warning  Failed     21s               kubelet, gke-gke-cluster1-default-pool-a354fba3-8674  Error: ImagePullBackOff
  Normal   Pulling    8s (x2 over 37s)  kubelet, gke-gke-cluster1-default-pool-a354fba3-8674  Pulling image "velero/velero-plugin-for-gcp:v1.1.0"

Команда, используемая для установки velero: (некоторые значения указаны как переменные)

velero install \
     --provider gcp \
     --plugins velero/velero-plugin-for-gcp:v1.1.0 \
     --bucket $storagebucket \
     --secret-file ~/velero-backup-storage-sa-key.json

Версия Velero

velero version
Client:
        Version: v1.4.2
        Git commit: 56a08a4d695d893f0863f697c2f926e27d70c0c5
<error getting server version: timed out waiting for server status request to be processed>

Версия GKE

v1.15.12-gke.2

2 ответа

Решение

Разве это не частный кластер? - Марио 31 минуту назад

@mario это частный кластер, но я могу без проблем развертывать другие службы (например, я успешно развернул nginx) - Sreesan 15 минут назад

Ну, это знают ограничение на GKE частных Clusters. Как вы можете прочитать в документации:

Не удается получить изображение из общедоступного Docker Hub

Симптомы

Pod, запущенный в вашем кластере, отображает предупреждение в kubectl describe такие как Failed to pull image: 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)

Возможные причины

Узлы в частном кластере не имеют исходящего доступа к общедоступному Интернету. У них ограниченный доступ к API и сервисам Google, включая Реестр контейнеров.

разрешение

Вы не можете получать изображения напрямую из Docker Hub. Вместо этого используйте образы, размещенные в Реестре контейнеров. Обратите внимание, что хотя зеркало Docker Hub из реестра контейнеров доступно из частного кластера, на него не следует полагаться исключительно. Зеркало - это только кеш, поэтому образы периодически удаляются, и частный кластер не может вернуться к Docker Hub.

Вы также можете сравнить это с этим ответом.

Это легко проверить самостоятельно, поставив простой эксперимент. Попробуйте запустить два разных развертывания nginx. Сначала на основе изображенияnginx (что равно nginx:latest) и второй на основе nginx:1.14.2.

Хотя первый сценарий вполне осуществим, потому что nginx:latestизображение может быть получено из зеркала Docker Hub реестра контейнеров, доступного из частного кластера, любая попытка полученияnginx:1.14.2 потерпит неудачу, что вы увидите в PodСобытия. Это происходит из-за того, что кубелет не может найти эту версию изображения в GCR и пытается вытащить ее из общедоступного реестра докеров (https://registry-1.docker.io/v2/), что в частных кластерах невозможно. "Зеркало - это всего лишь кеш, поэтому изображения периодически удаляются, и частный кластер не может вернуться к Docker Hub".- как вы можете прочитать в документации.

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

curl https://cloud.google.com/container-registry/

curl https://registry-1.docker.io/v2/

Хотя первый работает отлично, второй в конечном итоге выйдет из строя:

curl: (7) Failed to connect to registry-1.docker.io port 443: Connection timed out

Причина? - "Узлы в частном кластере не имеют исходящего доступа к общедоступному Интернету".

Решение?

Вы можете искать то, что сейчас доступно в GCR, здесь.

Во многих случаях вы сможете получить необходимое изображение, если не укажете его точную версию (по умолчанию latestиспользуется тег). Хотя это может помочь сnginx, к сожалению, в настоящее время в зеркале Docker Hub реестра Google Container Registry нет версии https://hub.docker.com/r/velero/velero-plugin-for-gcp.

Предоставление частным узлам исходящего доступа в Интернет с помощью Cloud NAT кажется единственным разумным решением, которое можно применить в вашем случае.

Я решил эту проблему, реализовав эту версию:

      velero/velero-plugin-for-gcp

не соответствует версии:

      velero/velero

Например, сейчас последние версии:velero/velero:v1.9.1иvelero/velero-plugin-for-gcp:v1.5.0

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