You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

验证方法

  1. 重新构建Podman代理镜像并更新Jenkins代理配置
  2. 连续运行3-5次之前频繁失败的构建任务
  3. 监控Pod的CPU、内存和磁盘IO使用情况,确认无资源瓶颈

内容的提问来源于stack exchange,提问作者rokpoto.com

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:09:24