OpenShift集群中dind容器无网络无法构建Docker镜像问题求助
Azure UPI部署OpenShift下Jenkins dind容器网络异常修复方案
修复思路
1. 调整dind默认网段避免地址冲突
dind默认使用172.17.0.0/16作为容器网桥网段,该网段极易与Azure VNet默认网段、OpenShift集群网段/服务网段重叠,导致路由转发异常无法访问公网。
你需要先确认你的Azure VNet、OpenShift集群已使用的网段,选择一个未被占用的私有网段,在dind容器的启动参数中指定自定义网桥地址:
- name: docker-daemon image: docker:19.03.1-dind securityContext: privileged: true command: ["dockerd", "--bip=192.168.10.1/24"] # 替换为未被使用的网段 volumeMounts: - name: docker-socket mountPath: /var/run
2. 强制指定dind使用OpenShift集群DNS
dind默认会为构建容器配置8.8.8.8作为DNS服务器,Azure环境下通常会限制公网DNS的访问,导致DNS解析失败。你需要修改dind启动参数,指定使用OpenShift集群的CoreDNS地址:
- name: docker-daemon image: docker:19.03.1-dind securityContext: privileged: true command: ["dockerd", "--bip=192.168.10.1/24", "--dns=<你的OpenShift CoreDNS服务IP>", "--dns-search=svc.cluster.local", "--dns-search=<你的集群域名>"] volumeMounts: - name: docker-socket mountPath: /var/run
你可以通过在OpenShift任意普通Pod中执行cat /etc/resolv.conf获取集群正确的DNS地址与搜索域配置。
3. 调整dind容器MTU适配Azure网络
Azure VNet默认网卡MTU为1500,若OpenShift SDN使用OVN/Openshift SDN插件,容器网卡MTU通常会降低为1450/1400,dind默认1500的MTU会导致数据包分片丢包,出现连接超时。添加启动参数指定dind容器的MTU:
command: ["dockerd", "--bip=192.168.10.1/24", "--mtu=1400", "--dns=<CoreDNS IP>"]
4. 验证Azure网络出站规则
检查OpenShift工作节点所在子网的Azure NSG出站规则,确保允许以下流量:
- 到公网
0.0.0.0/0的TCP 80/443端口流量 - 到公网DNS或集群DNS的UDP 53端口流量
验证方法
修改podTemplate配置后,在流水线中添加临时验证步骤确认问题修复:
container('docker') { stage('验证网络') { // 验证公网连通性 sh 'docker run --rm alpine ping -c 4 8.8.8.8' // 验证DNS解析 sh 'docker run --rm alpine nslookup archive.ubuntu.com' // 验证apt访问 sh 'docker run --rm ubuntu:bionic apt update' } }
内容的提问来源于stack exchange,提问作者Aruna Fernando
相关产品推荐
相关产品推荐

