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
相关产品推荐
相关产品推荐

