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

Jenkins Kubernetes插件Pod异常终止及Agent运行问题咨询

问题分析与解决方案

你的核心问题是误解了Jenkins Kubernetes Agent的工作逻辑:自定义Agent镜像必须包含Jenkins的JNLP客户端(用于和Master建立连接、接收任务),否则容器启动后没有持续的Agent进程,或者无法和Master通信,导致Pod启动后立即退出。

为什么你的Pod会立即挂起?

当前Dockerfile的ENTRYPOINT直接运行你的Go程序/bin/runner,程序执行完成(或无持续运行逻辑)后就会退出,容器没有保持运行的进程,因此Pod会立即终止。而Jenkins Kubernetes Agent的设计要求容器先启动JNLP客户端,连接Master并等待任务下发,任务执行完成后才会退出。

修正方案

方案1:基于Jenkins官方Agent镜像构建(推荐)

使用Jenkins官方的inbound-agent镜像作为基础,它自带JNLP客户端,只需添加你的Go环境和程序即可。

修改后的Dockerfile:

# 选择对应版本的Jenkins inbound-agent镜像,这里用jdk17+alpine3.18
FROM jenkins/inbound-agent:jdk17-alpine3.18

# 安装Go 1.21.1及依赖
RUN apk add --no-cache build-base go=1.21.1-r0

# 设置Go环境变量
ENV GOPATH=/go
ENV PATH=$GOPATH/bin:/usr/local/go/bin:$PATH

# 复制并编译你的Go程序
WORKDIR /app
COPY go_src .
RUN go mod download

WORKDIR /app/cmd/runner/
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o /bin/runner

对应的Pipeline配置:

pipeline {
    agent none
    stages {
        stage('Execute Go Program') {
            agent {
                kubernetes {
                    yaml """
                    apiVersion: v1
                    kind: Pod
                    spec:
                      containers:
                      - name: runner
                        image: my_image:latest
                        volumeMounts:
                        - name: cache
                          mountPath: /cache
                      volumes:
                        - name: cache
                          persistentVolumeClaim:
                            claimName: cache-pvc
                      imagePullSecrets:
                      - name: regcred
                    """
                }
            }
            steps {
                container('runner') {
                    // 执行你的Go程序,程序完成后Agent自动退出,Pod随之终止
                    sh '/bin/runner'
                }
            }
        }
    }
}

方案2:手动在自定义镜像中添加JNLP客户端

如果不想使用官方Agent镜像,可在现有镜像中手动安装JNLP客户端:

修改后的Dockerfile:

FROM golang:1.21.1-alpine3.18 AS builder
RUN apk update && apk upgrade && apk add build-base

WORKDIR /app
COPY go_src .
RUN go mod download

WORKDIR /app/cmd/runner/
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o /bin/runner

# 构建最终镜像,添加JNLP客户端
FROM alpine:3.18
RUN apk add --no-cache openjdk17-jre-headless

# 下载Jenkins JNLP客户端(替换为对应版本,可从Jenkins Master的agent页面获取)
RUN curl -fsSL -o /usr/share/jenkins/agent.jar https://repo.jenkins-ci.org/public/org/jenkins-ci/main/remoting/4.14.3/remoting-4.14.3.jar
RUN chmod 755 /usr/share/jenkins/agent.jar

# 复制编译好的Go程序
COPY --from=builder /bin/runner /bin/runner

# 设置JNLP客户端为默认入口,确保先连接Jenkins Master
ENTRYPOINT ["java", "-jar", "/usr/share/jenkins/agent.jar"]

Pipeline配置和方案1一致,在steps中调用/bin/runner即可。

为什么之前的尝试无效?

  • sleep:只是让容器临时保持运行,但没有启动JNLP客户端和Master通信,Jenkins会认为Agent未注册,最终还是会终止Pod。
  • command: cat + tty:true:同样只是维持容器运行,但无法完成Agent与Master的连接,不符合Jenkins Agent的工作逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:12:09