0

我已经使用 vmware-harbor v1.5.0 部署了一个私有 docker 注册表。虽然它可以与大多数功能一起使用,例如登录和拉/推图像,但是当我尝试使用 [管理] -> [复制] 时,总是会出现“需要身份验证”的错误。

以下是港口复制错误详细信息

2018-08-06T06:57:41Z [INFO] 初始化完成:存储库:ops/test,标签:[3.4.11],源注册表:URL - http ://registry.xx.com insecure-true,目标注册表: URL - https://registry-slave.xx.com insecure-false

2018-08-06T06:57:41Z [警告] 在目标注册表上创建项目操作时状态码为 409,尝试执行下一步

2018-08-06T06:57:41Z [错误] [job_logger.go:81]:从源注册表中提取 ops/zookeeper:3.4.11 的清单时发生错误:401 {"errors":[{"code": "UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"ops/test","Action":"pull "}]}]


如上所述,UNAUTHORIZED 错误似乎是由于从本地提取图像而不是由于远程引起的。事实上,远程注册中心已经通过了【管理】->【注册中心】创建页面中的“测试连接”。

我想知道,是否有一些指定的配置应该设置为使用复制功能?从本地提取图像时使用了哪个角色?


所以我尝试阅读harbor源代码并在第230行的jobservice/job/impl/replication/transfer.go中找到错误消息引发点:

acceptMediaTypes := []string{schema1.MediaTypeManifest, schema2.MediaTypeManifest} digest, mediaType, payload, err := t.srcRegistry.PullManifest(tag, acceptMediaTypes) if err != nil { t.logger.Errorf("an error occurred while pulling manifest of %s:%s from source registry: %v", t.repository.name, tag, err) return "", nil, err

如上代码,似乎从来没有考虑过 401 http 代码,acceptMediaTypes 是一些处理媒体类型的 http 标头,而不是身份验证。那么harbor如何从本地提取图像?


环境

linux:Red Hat Enterprise Linux Server 7.5 版(迈坡)

港口:v1.5.0

码头工人(客户端和服务器):17.12.1-ce


网络拓扑

nginx (https:443) -> 港口 (http:8082)

nginx和harbor都部署在同一个KVM上

“registry-test.xx.com”在 DNS 中解析


我更想知道有人成功使用harbor的复制功能...

所以任何人都可以帮我或只是一些提示?非常感谢~


更多细节:08-07

尝试从本地 KVM 获取一些 wireshark 信息

tcpdump -i any port 8082

复制期间的 pcap

如图所示,“/service/token”请求已经发送,并且得到了正确的token,但是后面的manifest请求没有携带anthenticate token,所以失败了。所以我不知道令牌缓存发生了什么。

也许我需要从common/utils/registry/auth/tokenauthorizer.go阅读更多代码细节

4

1 回答 1

0

有幸解决问题!

事实上,关键错误在于网络拓扑:

nginx (https:80) -> nginx (https:443) -> 港口 (http:8082)

“nginx (https:80) -> nginx (https:443)”只是通过301重定向处理harbor组件到self registry的请求,因为harbor是http方式部署的,harbor本身的请求也是http。

它需要灾难,因为 30X 重定向不能接受诸如 cookie 和身份验证之类的敏感标头。所以请求确实重定向到 https,从不将任何身份验证令牌带到港口,因此在拉取图像时会引发 401 错误。


在我的选择中,解决这个问题的方法只是改变网络拓扑:

nginx (https:443) -> 港口 (https:8082)

这意味着harbor必须以https方式部署。

事实上,它现在真的很好用。

于 2018-08-07T12:47:17.833 回答