Kubernetes OAuth镜像拉取
2024-01-08 21:47:53 829
服务迁移到其他服务器后, 镜像一直拉取不下来
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
最后通过修改harbor
的EXT_ENDPOINT
解决的
因为拉取镜像这里是通过一种OAuth操作, 动态返回镜像地址和token来实现的
迁移前后, 服务不在同一个网络下
https://www.infoq.cn/article/d3t2aaphfhx5ha0a0xrt
拉取镜像是怎么回事
镜像一般会包括两部分内容,一个是 manifests 文件,这个文件定义了镜像的元数据,另一个是镜像层,是实际的镜像分层文件。镜像拉取基本上是围绕这两部分内容展开。因为我们这篇文章的重点是权限问题,所以我们这里只以 manifests 文件拉取为例。
拉取 manifests 文件,基本上也会做三件事情:
- 首先,docker 直接访问镜像 manifests 的地址,以便获取 Www-Authenticate 头字段。这个字段包括鉴权服务器的地址 Bearer realm,镜像服务地址 service,以及定义了镜像和操作的 scope。
- 接着,docker 访问上边拿到的 Bearer realm 地址来鉴权,以及在鉴权之后获取一个临时的 token。这对应协议大图使用账户密码获取临时 token 这一步,使用的账户密码直接读取自 docker.json 文件。
- 最后,使用上边的 token,以 Authorization 头字段的方式,来下载 manifests 文件。这对应的是协议大图下载镜像这一步。当然因为镜像还有分层文件,所以实际 docker 还会用这个临时 token 多次下载文件才能完整镜像下载