OpenShift3.11构建Pod推送镜像到内部registry报i/o超时如何解决
OpenShift 3.11 构建Pod推送镜像到内部Registry超时问题排查与修复方案
排查步骤
- 第一步:验证DNS解析是否正常
进入异常构建Pod的终端,执行nslookup docker-registry.default.svc,确认可以正确解析到Registry服务的ClusterIP,排除集群DNS配置故障。 - 第二步:校验Registry服务端点状态
在集群CLI执行oc get endpoints docker-registry -n default,检查输出的端点IP是否和正在运行的Registry Pod IP一致,排除端点未注册导致的流量黑洞。 - 第三步:排查网络策略限制
执行oc get networkpolicy -A,检查是否存在网络策略禁止了构建Pod所在命名空间访问default命名空间的5000端口,或者default命名空间限制了Registry的入口流量。 - 第四步:检查节点网络配置与Azure NSG规则
- 登录构建Pod所在的Azure虚拟机,执行
sysctl net.ipv4.ip_forward,确认返回值为1,OpenShift集群要求所有节点开启IP转发,否则跨节点Pod通信会被丢弃。 - 检查Azure VM关联的网络安全组(NSG),确认集群内网网段的5000端口入站、出站规则已放行,无端口拦截。
- 登录构建Pod所在的Azure虚拟机,执行
- 第五步:确认kube-proxy服务状态
在构建Pod所在节点执行systemctl status kube-proxy,确认服务运行正常无报错,kube-proxy负责Service ClusterIP到后端Pod的流量转发,异常会导致访问超时。 - 第六步:排查OVS流表规则(使用OVS网络插件时)
执行ovs-ofctl dump-flows br0 | grep 5000,检查是否存在丢弃Registry端口流量的流表规则。
修复方案
- DNS解析异常:重启集群CoreDNS/SkyDNS Pod,修正节点
/etc/resolv.conf配置,确保指向集群DNS的ClusterIP。 - 网络策略拦截:在default命名空间添加允许所有命名空间访问Registry 5000端口的网络策略,配置示例如下:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all-registry-access namespace: default spec: podSelector: matchLabels: docker-registry: default ingress: - from: - namespaceSelector: {} ports: - port: 5000
配置完成后执行oc apply -f <文件名>生效。
- IP转发未开启:在节点执行
sysctl -w net.ipv4.ip_forward=1,同时将net.ipv4.ip_forward = 1写入/etc/sysctl.conf实现永久生效;同步在Azure VM的网络配置页面开启IP转发选项。 - NSG拦截:在Azure NSG中添加入站规则,允许源地址为集群VPC内网段、目标端口5000的TCP流量通行。
- kube-proxy异常:执行
systemctl restart kube-proxy重启服务,如有配置错误修正kube-proxy配置文件后再重启。 - 端点异常:执行
oc delete pod -l docker-registry=default -n default重启Registry Pod,触发服务端点重新注册。
内容的提问来源于stack exchange,提问作者Sanidhya
相关产品推荐
相关产品推荐

