我正在尝试为kubernetes备份安装和配置Velero。我已经按照链接在我的GKE集群中配置了它。安装进行得很顺利,但velero无法工作。
我使用谷歌云外壳来运行我的所有命令(我已经在我的谷歌云外壳中安装并配置了velero客户端(
在对velero部署和velero pods进行进一步检查时,我发现它无法从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
这不是私有集群吗?–马里奥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)
潜在原因
专用群集中的节点没有对公用的出站访问权限互联网他们对谷歌API和服务的访问权限有限,包括Container Registry。
分辨率
您无法直接从Docker Hub获取图像。而是使用图像托管在Container Registry上。请注意,虽然Container RegistryDocker集线器镜子可以从专用群集访问,不应以独占方式访问依赖。镜像只是一个缓存,因此图像是周期性的删除,并且私有集群无法回退到Docker Hub。
您也可以将其与此答案进行比较。
只需做一个简单的实验就可以很容易地验证它。尝试运行两种不同的nginx部署。第一个基于图像nginx
(等于nginx:latest
(,第二个基于nginx:1.14.2
。
虽然第一种情况是完全可行的,因为nginx:latest
映像可以从容器注册表的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
原因?-";专用群集中的节点没有对公共internet的出站访问权限">
解决方案
您可以在GCR中搜索当前可用的内容。
在许多情况下,如果您没有指定所需图像的确切版本(默认情况下使用latest
标记(,您应该能够获得所需图像。虽然它可以帮助nginx
,但不幸的是,谷歌容器注册中心的Docker Hub镜像中目前没有适用于gcp的velero/velero插件版本。
通过使用云NAT授予私有节点出站互联网访问权限似乎是唯一合理的解决方案,可以应用于您的情况。
我通过实现的版本解决了这个问题
velero/velero-plugin-for-gcp
不遵循以下版本:
velero/velero
例如,现在的最新版本是:velero/velero:v1.9.1
和velero/velero-plugin-for-gcp:v1.5.0