Не удалось получить образ "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