使用Jenkins脚本化管道创建Kubernetes Pod模板时的脱机代理

时间:2018-10-04 22:56:43

标签: jenkins kubernetes jenkins-pipeline

我已经创建了一个共享库,并且它有一个名为myBuildPlugin.groovy的常规文件:

def label = "worker-${UUID.randomUUID().toString()}"

podTemplate(label: label, yaml: """
          apiVersion: v1
          kind: Pod
          metadata:
            name: my-build
          spec:
            containers:
              - name: jnlp
                image: dtr.myhost.com/test/jenkins-build-agent:latest
                ports:
                  - containerPort: 8080
                  - containerPort: 50000
                resources:
                  limits:
                    cpu : 1
                    memory : 1Gi
                  requests:
                    cpu: 200m
                    memory: 256Mi
                env:
                  - name: JENKINS_URL
                    value: http://jenkins:8080
              - name: mongo
                image: mongo
                ports:
                  - containerPort: 8080
                  - containerPort: 50000
                  - containerPort: 27017
                resources:
                  requests:
                    cpu: 200m
                    memory: 256Mi
                  limits:
                    cpu: 1
                    memory: 512Mi
            imagePullSecrets:
            - name: dtrsecret""")
        {
            node(label) {
                pipelineParams.step1.call([label : label])
        }
    }

在我的项目中,按以下方式使用myBuildPlugin时,日志显示它永远等待执行程序。当我看着Jenkins时,我可以看到正在创建代理,但是由于某种原因,它无法通过端口50000与代理进行通讯(或者pod无法与代理进行通讯!)

稍后,我尝试删除yaml,而是使用以下代码:

podTemplate(label: 'mypod', cloud: 'kubernetes', containers: [
        containerTemplate(
                name: 'jnlp',
                image: 'dtr.myhost.com/test/jenkins-build-agent:latest',
                ttyEnabled: true,
                privileged: false,
                alwaysPullImage: false,
                workingDir: '/home/jenkins',
                resourceRequestCpu: '1',
                resourceLimitCpu: '100m',
                resourceRequestMemory: '100Mi',
                resourceLimitMemory: '200Mi',
                envVars: [
                        envVar(key: 'JENKINS_URL', value: 'http://jenkins:8080'),
                ]
        ),
        containerTemplate(name: 'maven', image: 'maven:3.5.0', command: 'cat', ttyEnabled: true),
        containerTemplate(name: 'docker', image: 'docker', command: 'cat', ttyEnabled: true)
],
        volumes: [
                emptyDirVolume(mountPath: '/etc/mount1', memory: false),
                hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
        ],
        imagePullSecrets: [ 'dtrsecret' ],
)
        {
            node(label) {
                pipelineParams.step1.call([label : label])
            }
        }

仍然没有运气。有趣的是,如果我在Jenkins配置中定义了所有这些容器,则一切运行顺利。这是我的配置:

enter image description here

这是pod模板的配置:

enter image description here

看来,如果我将标签更改为jenkins-jenkins-slave以外的其他名称,则会发生此问题。即使是通过Jenkins的配置页定义的,也是如此。如果是这样,我应该如何为不同类型的项目创建多个Pod模板?

直到今天,我还尝试如下使用pod继承,但没有成功:

def label = 'kubepod-test'
podTemplate(label : label, inheritFrom : 'default',
        containers : [
                containerTemplate(name : 'mongodb', image : 'mongo', command : '', ttyEnabled : true)
        ]
)
        {
            node(label) {


            }

        }

请帮助我解决这个问题。谢谢

1 个答案:

答案 0 :(得分:1)

您的Pod配置有些变化,您无法将Jenkins和Mongo容器使用相同的端口50000。通常,您要指定唯一的端口,因为Pod共享相同的port space

在这种情况下,您似乎需要端口50000才能建立通往Jenkins代理的隧道。请记住,Jenkins插件可能正在做其他事情,例如设置Kubernetes Service或使用内部Kubernetes DNS

在第二个示例中,我什至看不到端口50000被暴露。