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

基于Kubernetes的Jenkins:如何避免ClosedChannelException并保持Pod Agent存活

Jenkins K8s环境ClosedChannelException问题解决方案

一、配置Jenkins主节点重连丢失连接的Agent

可以通过Kubernetes插件的配置实现自动重连,结合Jenkins Configuration as Code(JCasC)的配置示例如下:

  • 全局重连配置:在JCasC中设置Kubernetes云的重连超时时间,让主节点尝试重新连接存活的Agent Pod:
jenkins:
  clouds:
    - kubernetes:
        reconnectTimeout: 30000  # 30秒,单位毫秒
        templates:
          - name: default-agent
            containers:
              - name: jnlp
                image: jenkins/inbound-agent:latest
                reconnectTimeout: 30000  # 针对该容器的重连超时
  • 插件版本要求:确保使用v1.30.0及以上版本的Jenkins Kubernetes插件,该版本优化了Agent连接稳定性与重连逻辑。
  • 任务层面优化:在Pipeline的Agent配置中,可显式启用重连机制:
pipeline {
  agent {
    kubernetes {
      label 'build-agent'
      reconnectTimeout 30000
    }
  }
  // 流水线逻辑
}

二、延迟Pod驱逐至任务完成的实现方案

可以结合Kubernetes的Pod Disruption Budget(PDB)、preStop钩子与优雅终止配置来实现:

1. 配置Pod Disruption Budget(PDB)

限制节点维护时可驱逐的Agent Pod数量,避免批量驱逐导致任务中断:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: jenkins-agent-pdb
spec:
  minAvailable: 1  # 至少保留1个可用的Agent Pod
  selector:
    matchLabels:
      jenkins/agent: true

2. 使用preStop钩子等待任务完成

在Agent Pod模板中配置preStop钩子,执行脚本检查当前Agent是否有运行中的任务,等待任务结束后再终止Pod:

jenkins:
  clouds:
    - kubernetes:
        templates:
          - name: build-agent
            label: build-agent
            containers:
              - name: jnlp
                image: jenkins/inbound-agent:latest
                lifecycle:
                  preStop:
                    exec:
                      command:
                        - "/bin/sh"
                        - "-c"
                        - |
                          # 循环检查Agent是否有运行的任务,直到任务结束
                          while curl -s "http://jenkins:8080/computer/${NODE_NAME}/api/json" | grep -q '"currentExecutable":'; do
                            sleep 60
                          done
            terminationGracePeriodSeconds: 3600  # 设置1小时的优雅终止超时,确保有足够时间完成任务

注意:需确保Agent镜像中包含curl工具,若没有需提前构建自定义镜像添加该依赖。

3. 节点维护时的配合操作

集群管理员执行kubectl drain时,需添加以下参数,确保Pod有足够时间完成任务:

kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data --grace-period=3600

内容的提问来源于stack exchange,提问作者aldo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:33:28