4

我正在尝试为 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

来自 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"

用于安装 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
4

1 回答 1

6

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

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

好吧,这是GKE Private 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)

潜在原因

私有集群中的节点没有对公共 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/

虽然第一个完美运行,但第二个最终会失败:

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

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

解决方案 ?

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

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

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

于 2020-08-14T15:41:23.473 回答