在 GKE 集群中安装 Velero 时无法拉取映像“velero/velero-plugin-for-gcp:v1.1.0”

srs*_*rsn 4 backup google-cloud-platform kubernetes google-kubernetes-engine velero

我正在尝试为 kubernetes 备份安装和配置 Velero。我已经按照链接在我的 GKE 集群中配置它。安装进行得很顺利,但 velero 无法正常工作。

我正在使用 google cloud shell 来运行我的所有命令(我已经在我的 google cloud shell 中安装并配置了 velero 客户端)

在进一步检查 velero 部署和 velero pod 时,我发现它无法从 docker 存储库中提取图像。

kubectl get pods -n velero
NAME                      READY   STATUS              RESTARTS   AGE
velero-5489b955f6-kqb7z   0/1     Init:ErrImagePull   0          20s
Run Code Online (Sandbox Code Playgroud)

来自 velero pod (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"
Run Code Online (Sandbox Code Playgroud)

用于安装velero的命令:(一些值作为变量给出)

velero install \
     --provider gcp \
     --plugins velero/velero-plugin-for-gcp:v1.1.0 \
     --bucket $storagebucket \
     --secret-file ~/velero-backup-storage-sa-key.json
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

GKE版本

v1.15.12-gke.2
Run Code Online (Sandbox Code Playgroud)

mar*_*rio 6

这不是私有集群吗?– 马里奥 31 分钟前

@mario 这是一个私有集群,但我可以毫无问题地部署其他服务(例如:我已经成功部署了 nginx)– Sreesan 15 分钟前

那么,这是一个专门限制GKE私人集群。正如您在文档中所读到的:

无法从公共 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)

潜在原因

私有集群中的节点没有对公共 Internet 的出站访问权限。他们对 Google API 和服务(包括 Container Registry)的访问权限有限。

解析度

您无法直接从 Docker Hub 获取图像。相反,请使用 Container Registry 上托管的映像。请注意,虽然 可以从私有集群访问Container Registry 的 Docker Hub 镜像,但不应完全依赖它。镜像只是一个缓存,所以镜像会定期删除,私有集群无法回退到 Docker Hub。

您也可以将其与答案进行比较。

通过做一个简单的实验,您可以很容易地自行验证。尝试运行两个不同的 nginx 部署。第一个基于图像nginx(等于nginx:latest),第二个基于nginx:1.14.2

虽然第一个场景是完全可行的,因为nginx:latest可以从Container Registry 的 Docker Hub 镜像中拉取镜像,该镜像可从私有集群访问,但任何拉取尝试都nginx:1.14.2将失败,您将在Pod事件中看到这一点。发生这种情况是因为kubelet无法在GCR 中找到此版本的映像,并且它尝试从公共 docker 注册表 ( https://registry-1.docker.io/v2/) 中提取它,而这在私有集群中是不可能的。“镜像只是一个缓存,所以镜像会被定期删除,私有集群无法回退到 Docker Hub。” - 正如您可以在文档中阅读的那样。

如果您仍有疑问,请直接ssh进入您的节点并尝试运行以下命令:

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

curl https://registry-1.docker.io/v2/
Run Code Online (Sandbox Code Playgroud)

虽然第一个工作得很好,但第二个最终会失败:

curl: (7) Failed to connect to registry-1.docker.io port 443: Connection timed out
Run Code Online (Sandbox Code Playgroud)

原因 ?- “私有集群中的节点没有对公共互联网的出站访问权限。”

解决方案 ?

您可以在此处搜索GCR 中 当前可用的内容。

在许多情况下,如果您没有指定它的确切版本(默认情况下使用latest标签),您应该能够获得所需的图像。虽然它可以帮助nginx,但不幸的是,Google Container Registry 的 Docker Hub 镜像中目前没有可用的velero/velero-plugin-for-gcp版本。

使用Cloud NAT授予私有节点出站 Internet 访问权限似乎是唯一可以应用于您的案例的合理解决方案。

  • mario 感谢您对该问题和可能的解决方案的详细解释。我解决了问题的最后部分(即在私有 gke 集群中使用 velero 映像),而无需使用云 NAT。相反,我使用 gcr.io 来存储图像。我按照 https://velero.io/docs/main/on-premises/ 中给出的步骤将 velero 映像保存在我的私有 gcr (不是 gcr 镜像)中,然后使用该私有映像在我的私有中安装 velero GKE集群 (2认同)