我已经部署了一个带有vmware-港口v1.5.0的专用码头注册中心。虽然它可以与大多数函数一起工作,比如登录和拉/推图像,但是当我尝试使用管理->复制时,“身份验证所需”的错误总是准确的。
以下是港口复制错误详细信息
2018-08T06:57:41Z信息初始化完成:存储库:op/test,标记: 3.4.11,源注册表: URL-http://registry.xx.com不安全-true,目标注册表:URL-不安全https://registry-slave.xx.com-false 2018-08-06T06:57:41Z警告在目标注册表上创建项目操作时状态代码为409,请执行下一步。 2018-08-06T06:57:41Z错误:从源注册表拉出操作系统/动物园管理员的清单:3.4.11来自源注册表: 401 {“错误”:[{“代码”:“未经授权”,“消息”:“身份验证所需”,“详细信息”:{“类型”:“存储库”,“类”:“,名称”:“of /test”,“操作”:“拉”}]
如前所述,未经授权的错误似乎是由于从本地提取图像,而不是由于远程。实际上,远程注册表已经通过了管理->注册表创建页面中的“测试连接”。
我想知道,是否应该将某些指定的配置设置为使用复制功能?从本地提取图像时使用了哪个角色?
因此,我尝试阅读港口源代码,并在第230行的作业服务/作业/impl/复制/转移。中找到错误消息引发点:
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头来处理媒体类型,而不是身份验证。那么港口是如何从当地吸引图像的呢?
环境
linux:版本7.5 (Maipo)
港口: v1.5.0
码头(客户及服务器):17.12.1-行政长官
网络拓扑
->港(http:8082)
nginx和港湾都部署在同一个KVM上。
"registry-test.xx.com“在DNS中解析
我更希望知道有谁成功地使用了港口的复制功能..。
所以任何人都可以帮我个忙还是给我点小费?非常感谢~
更多细节: 08-07
尝试从KVM本地获取一些wireshark信息
tcpdump -i any port 8082如图所示,"/service/ token“请求已被发送,并获得了正确的令牌,但下面的清单请求没有携带炭疽令牌,因此失败了。所以我不知道令牌缓存发生了什么。
也许我需要阅读公共/实用/注册表/auth/TokenAuthizer.go的更多代码细节。
发布于 2018-08-07 12:47:17
幸运的是解决了这个问题!
实际上,关键的错误是网络拓扑:
-> nginx (https:443) ->港(http:8082)
"nginx (https:80) -> nginx (https:443)“只需通过301重定向处理从港口组件到自注册中心的请求,因为以http模式部署的港口本身也是http请求。
它需要灾难,因为30X重定向不能接受敏感的标题,如cookie和身份验证。因此,请求重定向到https --实际上,永远不要将任何身份验证令牌带到港口,因此在提取图像时会引发401错误。
在我的选择中,解决这个问题的方法只是改变网络拓扑:
->港(https:8082)
这意味着港口必须以https模式部署。
事实上,它现在真的很好用。
https://stackoverflow.com/questions/51703817
复制相似问题