Kubernetes OAuth镜像拉取

kyaa111 9月前 ⋅ 815 阅读

服务迁移到其他服务器后, 镜像一直拉取不下来

start failed in pod xxx-shop-5b98fd55d8-xxx(xxx): ErrImagePull: rpc error: code = Unknown desc = failed to pull and unpack image "xxx.harbor/xxx-dev/xxx-pro@sha256:xxx": failed to resolve reference "xxx.harbor/xxx-dev/xxx-pro@sha256:xxx": failed to authorize: failed to fetch oauth token: Post "https://172.21.0.8/service/token": dial tcp 172.21.0.8:443: connect: no route to host

最后通过修改harborEXT_ENDPOINT解决的

因为拉取镜像这里是通过一种OAuth操作, 动态返回镜像地址和token来实现的

迁移前后, 服务不在同一个网络下

https://www.infoq.cn/article/d3t2aaphfhx5ha0a0xrt

拉取镜像是怎么回事

镜像一般会包括两部分内容,一个是 manifests 文件,这个文件定义了镜像的元数据,另一个是镜像层,是实际的镜像分层文件。镜像拉取基本上是围绕这两部分内容展开。因为我们这篇文章的重点是权限问题,所以我们这里只以 manifests 文件拉取为例。

拉取 manifests 文件,基本上也会做三件事情:

  1. 首先,docker 直接访问镜像 manifests 的地址,以便获取 Www-Authenticate 头字段。这个字段包括鉴权服务器的地址 Bearer realm,镜像服务地址 service,以及定义了镜像和操作的 scope。

1.png

  1. 接着,docker 访问上边拿到的 Bearer realm 地址来鉴权,以及在鉴权之后获取一个临时的 token。这对应协议大图使用账户密码获取临时 token 这一步,使用的账户密码直接读取自 docker.json 文件。

2.png

  1. 最后,使用上边的 token,以 Authorization 头字段的方式,来下载 manifests 文件。这对应的是协议大图下载镜像这一步。当然因为镜像还有分层文件,所以实际 docker 还会用这个临时 token 多次下载文件才能完整镜像下载

3.png