从专用注册表拉取失败 - 不支持的 docker v1 存储库请求



我正在尝试使用私有注册表(Artifactory(在我的Kubernetes集群(1.9.7-gke.6(上运行容器。

Failed to pull image "myrepo.myartifactory.mycompany.com/org/image:latest": rpc error: code = Unknown desc = Error: Status 400 trying to pull repository org/image: "{
"errors" :[ {
"status" : 400,
"message" : "Unsupported docker v1 repository request for 'myrepo'"n  } ]
}"

我认为这意味着docker客户端尝试执行v1注册表请求,我们的Artifactory安装似乎不支持该请求。

我检查了群集节点的 docker 版本:

$ kubectl describe nodes | grep docker
Container Runtime Version:  docker://17.3.2
Container Runtime Version:  docker://17.3.2
Container Runtime Version:  docker://17.3.2

我找到了 Docker 标志--disable-legacy-registry=true但我不确定如何以这种方式最好地配置我的 GKE 集群。

实际问题是我们的注册表凭据发生了变化。更新集群上的拉取凭据解决了此问题。

我假设在注册表 API 返回错误(例如身份验证或授权错误(的某些情况下可能会出现此问题。如果是这种情况,docker 客户端会尝试降级到较旧的 API 版本 - 该版本在 Artifactory 上不可用。

这将导致Artifactory返回上述Unsupported docker v1 repository request for 'myrepo'错误,不幸的是,该错误掩盖了实际错误。

幸运的是,你可以通过SSH连接到你的GKE节点(你不能连接到GKE主节点(。因此,您可以在所有节点的/etc/docker/daemon.json文件中添加此标志。像这样:

{
...
"disable-legacy-registry": true,
"log-driver": "json-file",
"log-opts": {
"max-size": "1g",
"max-file": "3"
}
...
}

然后在所有节点上重新启动 docker。在每个节点中:

sudo docker systemctl restart docker

请注意,此标志已从 Docker 17.12 及更高版本中完全删除。

最新更新