Jenkins动态Podman代理执行podman build时随机出现TLS及连接超时错误
动态Podman Jenkins代理构建随机失败问题排查与解决
问题现象
在使用Kubernetes Pod形式的动态Podman Jenkins代理构建镜像时,频繁出现随机失败:
- 报错1:
Error writing blob: error storing blob to file "/var/tmp/storagexxxxxx/x": error happened during read: local error: tls: bad record MAC - 报错2:
Error writing blob: error storing blob to file "/var/tmp/storagexxxxxx/x": error happened during read: read tcp ... read: connection timed out - 部分镜像(如基于
jenkins/jenkins:lts-jdk17的构建)失败概率极高,同一镜像偶尔又能成功 - 用Docker执行相同构建全程正常,重启Jenkins后Podman构建偶尔恢复正常
- 成功的构建耗时也远超正常水平
环境配置
Podman代理Dockerfile
FROM jenkins/jnlp-agent-alpine RUN apk add podman RUN apk add openrc RUN apk --no-cache add curl RUN sed -i 's/#mount_program/mount_program/' /etc/containers/storage.conf RUN echo 'jenkins:100000:65536' > /etc/subuid RUN echo 'jenkins:100000:65536' > /etc/subgid USER jenkins
Jenkins流水线构建命令
rc = sh(returnStatus: true, script: "podman build -t ${REGISTRY}/${REPO_NAME}/${NAME} .")
排查方向与解决方案
1. 修复Podman临时存储瓶颈
Podman默认使用/var/tmp存储镜像blob,而Kubernetes Pod的默认tmpfs空间有限且性能不稳定,容易导致IO错误:
- 修改Dockerfile,调整Podman存储配置到更稳定的目录:
# 创建Jenkins用户可读写的存储目录 RUN mkdir -p /home/jenkins/containers/storage && chown jenkins:jenkins /home/jenkins/containers/storage # 修改storage.conf,替换graphroot路径 RUN sed -i 's/graphroot = "\/var\/lib\/containers\/storage"/graphroot = "\/home\/jenkins\/containers\/storage"/' /etc/containers/storage.conf
2. 增加代理Pod的资源配额
资源不足会导致IO和网络操作超时,为动态代理Pod配置合理的资源请求与限制:
在Jenkins Helm Chart的values.yaml中配置:
agent: podTemplates: podman-agent: containers: - name: jnlp resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "2" memory: "4Gi"
3. 优化Podman构建参数
关闭并行拉取镜像blob,避免网络冲突引发TLS错误:
修改流水线中的构建命令:
rc = sh(returnStatus: true, script: "podman build --parallel=false -t ${REGISTRY}/${REPO_NAME}/${NAME} .")
如果需要强制拉取最新基础镜像,可添加--pull-always参数。
4. 替换Pod的临时存储为emptyDir
为/var/tmp挂载独立的emptyDir存储卷,提升IO性能:
在代理Pod模板中添加卷配置:
volumes: - name: tmp-dir emptyDir: medium: Memory sizeLimit: 2Gi containers: - name: jnlp volumeMounts: - mountPath: /var/tmp name: tmp-dir
5. 更新Podman版本
旧版本Podman可能存在网络或存储兼容性问题,升级到稳定版:
修改Dockerfile中的Podman安装命令,指定版本(以alpine仓库可用版本为准):
RUN apk add podman=4.9.3-r0
验证方法
- 重新构建Podman代理镜像并更新Jenkins代理配置
- 连续运行3-5次之前频繁失败的构建任务
- 监控Pod的CPU、内存和磁盘IO使用情况,确认无资源瓶颈
内容的提问来源于stack exchange,提问作者rokpoto.com
相关产品推荐
相关产品推荐

