GKE部署自定义Nginx镜像遇镜像拉取失败问题求助
嘿,我来帮你理清楚问题根源——你的GKE集群节点运行在Google云端,它们完全没办法直接访问你本地机器上的Docker镜像仓库!你本地构建的mynginx镜像只存在于你的电脑里,GKE的节点根本找不到它,这就是你看到repository mynginx not found错误的核心原因。
下面给你两种最常用的解决方案,选适合你的就行:
方法一:用Google Container Registry(GCR,推荐和GKE搭配)
GCR是Google官方的容器镜像仓库,和GKE集成得最好,操作也简单:
给本地镜像打GCR标签:按照
gcr.io/[你的GCP项目ID]/镜像名:版本号的格式标记,你提供的项目ID是involuted-ratio-227118,所以命令是:docker tag mynginx gcr.io/involuted-ratio-227118/mynginx:v1这里的
v1是版本号,你可以改成自己喜欢的标识,比如latest或者v2都可以。把镜像推送到GCR:先确保你已经配置了Docker和GCR的认证,然后推送:
gcloud auth configure-docker docker push gcr.io/involuted-ratio-227118/mynginx:v1更新你的Kubernetes部署:现在可以用GCR上的镜像地址重新创建部署了:
kubectl delete deployment myapp kubectl run myapp --image=gcr.io/involuted-ratio-227118/mynginx:v1 --port=80 --image-pull-policy=IfNotPresent或者你也可以直接编辑现有Deployment,把镜像地址改成上面的GCR地址就行。
方法二:用Docker Hub
如果你更习惯用Docker Hub,步骤也类似:
给本地镜像打Docker Hub标签:用你的Docker Hub用户名标记,比如你之前用的
xxx:docker tag mynginx xxx/mynginx:v1推送到Docker Hub:先确保你已经登录了Docker Hub(你之前执行过
docker login,应该没问题),然后推送:docker push xxx/mynginx:v1更新部署并关联密钥:重新创建部署时,要指定你之前创建的
regcred密钥,这样GKE才能拉取你的私有镜像:kubectl delete deployment myapp kubectl run myapp --image=xxx/mynginx:v1 --port=80 --image-pull-policy=IfNotPresent --image-pull-secrets=regcred要是不想删旧部署,也可以编辑Deployment,在
spec.template.spec里加上imagePullSecrets字段,指向regcred。
补充说明
你之前创建regcred密钥的操作本身没错,但问题是你根本没把本地镜像推送到Docker Hub,所以即使有密钥,GKE节点还是找不到这个镜像。另外,--image-pull-policy=IfNotPresent只有当节点本地已经有这个镜像时才会跳过拉取,但GKE的节点是全新的云端机器,不可能有你本地的镜像,所以必须先把镜像推送到集群能访问的远程仓库才行。
内容的提问来源于stack exchange,提问作者Gopi

