我正在尝试使用私有注册表(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 及更高版本中完全删除。