我正在尝试为 kubernetes 备份安装和配置 Velero。我已经按照 link 在我的 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
最佳答案
嗯,这是 know limitation 的 GKE Private Clusters 。正如您在 documentation 中所读到的:
您也可以将其与 this 答案进行比较。
通过做一个简单的实验,您可以很容易地自行验证。尝试运行两个不同的 nginx 部署。第一个基于图像 nginx
(等于 nginx:latest
),第二个基于 nginx:1.14.2
。
虽然第一个场景是完全可行的,因为 nginx:latest
镜像可以从 Container Registry 的 Docker Hub 镜像 中拉取, 可从私有(private)集群访问,任何拉取 nginx:1.14.2
的尝试都将失败,您将在 Pod
事件中看到这一点。发生这种情况是因为 kubelet 无法在 GCR 中找到此版本的镜像,并且它尝试从公共(public) docker 注册表 ( https://registry-1.docker.io/v2/
) 中提取它,而这在 私有(private)集群 中是不可能的。 “镜像只是一个缓存,所以镜像会定期删除,私有(private)集群无法回退到 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
原因 ? -“私有(private)集群中的节点没有对公共(public)互联网的出站访问权限。”解决方案 ?
您可以在 GCR here 中搜索当前可用的内容。
在许多情况下,如果您没有指定它的确切版本(默认情况下使用
latest
标记),您应该能够获得所需的图像。虽然它可以帮助 nginx
,但不幸的是,目前在 Google Container Registry 的 Docker Hub 镜像中没有可用的 velero/velero-plugin-for-gcp 版本。Granting private nodes outbound internet access 使用 Cloud NAT 似乎是唯一可以应用于您的情况的合理解决方案。
关于kubernetes - 在 GKE 集群中安装 Velero 时无法拉取镜像 "velero/velero-plugin-for-gcp:v1.1.0",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63411204/