运行 cronjob 通过从 Artifact Registry 中拉取图像时出现 GKE 问题
GKE problem when running cronjob by pulling image from Artifact Registry
我在 GKE 中创建了一个具有以下规范的 cronjob:
# cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: collect-data-cj-111
spec:
schedule: "*/5 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 100
suspend: false
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: collect-data-cj-111
image: collect_data:1.3
restartPolicy: OnFailure
我使用以下命令创建 cronjob:
kubectl apply -f collect_data.yaml
当我稍后查看它是否 运行ning 时(为了测试,我将它安排为每 5 分钟 运行),这是我看到的:
$ kubectl get pods --watch
NAME READY STATUS RESTARTS AGE
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 Pending 0 0s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 Pending 0 1s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ContainerCreating 0 1s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ErrImagePull 0 3s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ImagePullBackOff 0 17s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ErrImagePull 0 30s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ImagePullBackOff 0 44s
似乎无法从 Artifact Registry 中提取镜像。我在同一个项目下创建了 GKE 和 Artifact Registry。
可能是什么原因?花了几个小时在文档上,我仍然无法取得进展,我对 GKE 的世界还很陌生。
如果你碰巧推荐我检查任何东西,如果你也描述我应该在 GCP 中的什么地方,我将非常感激check/control你的推荐。
附录:
当我运行以下命令时:
kubectl describe pods
输出相当大,但我想下面的消息应该表明了问题。
Failed to pull image "collect_data:1.3": rpc error: code = Unknown
desc = failed to pull and unpack image "docker.io/library/collect_data:1.3":
failed to resolve reference "docker.io/library/collect_data:1.3": pull
access denied, repository does not exist or may require authorization:
server message: insufficient_scope: authorization failed
如何逐步解决这个问题?
从共享的错误中,我可以看出图像不是从 Artifact Registry 中拉取的,失败的原因是默认情况下,GKE 直接从 Docker Hub 中拉取它,除非另有说明。由于那里没有 collect_data 图片,因此出现错误。
指定存储在 Artifact Registry 中的图像的正确方法如下:
image: <location>-docker.pkg.dev/<project>/<repo-name>/<image-name:tag>
请注意,如果您使用的是 docker 容器化映像,则必须将注册表格式设置为“docker”。
查看 Quickstart for Docker 指南,其中指定了如何将 docker 图像拉取和推送到 Artifact Registry 以及所需的权限。
我在 GKE 中创建了一个具有以下规范的 cronjob:
# cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: collect-data-cj-111
spec:
schedule: "*/5 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 100
suspend: false
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: collect-data-cj-111
image: collect_data:1.3
restartPolicy: OnFailure
我使用以下命令创建 cronjob:
kubectl apply -f collect_data.yaml
当我稍后查看它是否 运行ning 时(为了测试,我将它安排为每 5 分钟 运行),这是我看到的:
$ kubectl get pods --watch
NAME READY STATUS RESTARTS AGE
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 Pending 0 0s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 Pending 0 1s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ContainerCreating 0 1s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ErrImagePull 0 3s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ImagePullBackOff 0 17s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ErrImagePull 0 30s
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 0/1 ImagePullBackOff 0 44s
似乎无法从 Artifact Registry 中提取镜像。我在同一个项目下创建了 GKE 和 Artifact Registry。
可能是什么原因?花了几个小时在文档上,我仍然无法取得进展,我对 GKE 的世界还很陌生。
如果你碰巧推荐我检查任何东西,如果你也描述我应该在 GCP 中的什么地方,我将非常感激check/control你的推荐。
附录:
当我运行以下命令时:
kubectl describe pods
输出相当大,但我想下面的消息应该表明了问题。
Failed to pull image "collect_data:1.3": rpc error: code = Unknown
desc = failed to pull and unpack image "docker.io/library/collect_data:1.3":
failed to resolve reference "docker.io/library/collect_data:1.3": pull
access denied, repository does not exist or may require authorization:
server message: insufficient_scope: authorization failed
如何逐步解决这个问题?
从共享的错误中,我可以看出图像不是从 Artifact Registry 中拉取的,失败的原因是默认情况下,GKE 直接从 Docker Hub 中拉取它,除非另有说明。由于那里没有 collect_data 图片,因此出现错误。
指定存储在 Artifact Registry 中的图像的正确方法如下:
image: <location>-docker.pkg.dev/<project>/<repo-name>/<image-name:tag>
请注意,如果您使用的是 docker 容器化映像,则必须将注册表格式设置为“docker”。
查看 Quickstart for Docker 指南,其中指定了如何将 docker 图像拉取和推送到 Artifact Registry 以及所需的权限。