OCP推送镜像至外部仓库前的存储位置及访问端口查询
OCP构建镜像推送至外部Nexus仓库问题排查解答
一、推送动作触发前镜像的存储位置
OCP的镜像构建动作完全在独立的Build Pod中执行,镜像在推送至外部仓库前不会持久化存储到集群固定位置:
- 构建生成的镜像层临时存储在Build Pod的内部overlay文件系统,同时会在Pod调度到的工作节点上用emptyDir卷做层缓存,提升推送效率
- 这类临时存储会在Build Pod生命周期结束(构建成功/失败/超时被销毁)后自动清理,不会留存到OCP内部镜像仓库,除非你在BuildConfig的output里额外配置了推送到内部Registry的规则
- 整个探测仓库、推送镜像的动作都是由这个Build Pod直接发起,不会经过OCP控制平面节点中转,配置网络策略的时候要注意这一点
二、查询Nexus仓库连通端口的实操方法
首先明确默认规则:如果你在镜像地址里没有显式写端口,OCP会按照Docker Registry API的默认规则探测:HTTPS协议默认走443端口,HTTP协议默认走80端口。你当前配置里的镜像地址nexus.compnanyhost/image:latest没有带端口,默认会优先去连443,这也是你现在报ping registry错误的最常见原因。
要精准拿到实际使用的端口,直接按以下步骤操作:
- 定位报错构建对应的Build Pod
在你执行构建的项目下执行命令,找到build开头、对应你本次构建任务的Pod名称:oc get pods | grep -E '^build-' - 直接在Build Pod内验证连通端口(结果100%准确,因为推送就是这个Pod发起的)
执行以下命令进入Pod终端:
进入后用curl命令逐个验证端口:oc rsh <上一步查到的Build Pod名称>- 验证默认HTTPS 443端口:
curl -v https://nexus.compnanyhost/v2/,如果返回401未授权、200响应码,说明端口通;如果返回连接超时、连接被拒绝,说明443未放通或者Nexus没在这个端口监听 - 如果你们Nexus的Docker仓库用了自定义端口(常见的有5000、8081、8082等),直接在地址后加端口测试:
curl -v http://nexus.compnanyhost:<自定义端口>/v2/,能正常返回响应的端口就是你需要配置放通的端口
- 验证默认HTTPS 443端口:
- 实时抓包确认连接端口
如果上述方法还不能确认,可以在Build任务运行时,登录Build Pod调度到的工作节点,执行以下命令查看Build进程的外连目标端口:
返回结果里的目标端口就是OCP实际尝试连接Nexus的端口。# 先找到Build Pod对应的容器进程ID crictl inspect <Build Pod的容器ID> | grep pid # 查看该进程的所有外连TCP连接 ss -tnp | grep <上一步查到的进程ID>
注意配置网络放通规则时,需要放通所有可调度Build Pod的工作节点到Nexus对应端口的出方向流量,不要只放通控制平面节点,否则Build Pod调度到没放通的节点时还是会推送失败。如果你的Nexus实际监听的是自定义端口,记得把端口写到BuildConfig的output.to.name字段里,格式为
nexus.compnanyhost:<端口号>/image:latest,否则OCP永远会默认连接443端口。
内容的提问来源于stack exchange,提问作者Winston
相关产品推荐
相关产品推荐

