如何在Jenkins中使用已部署的Kubernetes服务替代每次运行新建Pod
实现方案
你当前的配置是通过Jenkins Kubernetes插件每次新建独立agent Pod执行解析逻辑,要复用已部署的log-parser Service,可选择以下两种方案:
方案一:改造服务为HTTP服务(推荐,生产环境优先)
- 给现有log-parser服务新增HTTP接口,接收年、月、日、小时参数,触发解析任务并返回执行状态
- 流水线无需再启动专属log-parser agent Pod,直接通过HTTP调用服务即可,调整后的流水线示例如下:
stage('Parse logs') { // 用任意轻量agent即可,比如自带的jnlp agent,不需要专门指定kubernetes agent agent any when { beforeAgent true expression { params.parse_logs } } steps { // 用curl调用log-parser服务的接口,注意替换成你的服务实际接口地址、命名空间 sh 'curl -X POST "http://log-parser.你的服务所在命名空间.svc.cluster.local/parse" -d "year=$year&month=$month&day=$day&hour=$hour"' } }
方案二:无需改造服务,通过kubectl exec直接在现有Pod执行命令(改造成本最低)
如果不想修改现有log-parser服务的代码,可以直接通过kubectl进入已部署的Pod执行命令,需要先确保Jenkins使用的集群凭据有对应Pod的exec权限,调整后的流水线示例如下:
stage('Parse logs') { // 这里可以用自带的jnlp agent,只要agent里装了kubectl、配置了sandbox集群的访问权限即可 agent any when { beforeAgent true expression { params.parse_logs } } steps { // 先获取log-parser服务对应的Pod名称,注意替换下方的Pod标签为你实际部署使用的标签,比如app=log-parser sh ''' POD_NAME=$(kubectl get pods -l 你的log-parser服务的Pod标签 -o jsonpath='{.items[0].metadata.name}') kubectl exec $POD_NAME -- /usr/local/openjdk-11/bin/java -jar /opt/log-parser/log-parser.jar --year=$year --month=$month --day=$day --hour=$hour ''' } }
注意:你原有的流水线代码存在两处语法错误:
container('log-parser'')多了一个多余的单引号,sh命令末尾缺少闭合的单引号,调整时注意修正。
内容的提问来源于stack exchange,提问作者Dragos Roban
相关产品推荐
相关产品推荐

