在Kubernetes集群中运行动态代理的Jenkins插件

本文介绍了如何在Kubernetes集群中使用Jenkins插件动态扩展代理。该插件创建基于Docker的Pod来运行Jenkins代理,每次构建后自动停止。代理通过JNLP连接到Jenkins,并使用环境变量进行配置。文章还涵盖了设置Kubernetes云配置、限制作业使用云、容器模板配置以及在OpenShift和Windows环境中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Kubernetes集群中运行动态代理的Jenkins插件。

基于基于Kubernetes扩展Docker的文章,自动扩展在Kubernetes中运行的Jenkins代理。
该插件为每个启动的代理创建一个Kubernetes Pod,由Docker映像定义运行,并在每次构建后停止。
代理是使用JNLP启动的,因此预期图像会自动连接到Jenkins主机。因此,一些环境变量会被自动注入:
JENKINS_URL: Jenkins web接口url
JENKINS_SECRET:用于身份验证的密钥
JENKINS_AGENT_NAME:Jenkins agent的名称
JENKINS_NAME: Jenkins代理的名称(已弃用。只有在这里向后兼容)
使用jenkins/inbound-agent进行测试,见Docker镜像源代码。
不需要在Kubernetes内部运行Jenkins master。
通用设置
先决条件
正在运行的Kubernetes集群1.14或更高版本。对于OpenShift用户来说,这意味着OpenShift容器平台4.x。
安装了一个Jenkins实例
安装了Jenkins Kubernetes插件
需要注意的是,使用全局pod模板定义的主要原因是将大量现有项目(包括freestyle)迁移到Kubernetes上运行,而不需要更改作业定义。设置新的Kubernetes构建的新用户应该使用下面示例片段中所示的podTemplate步骤
填写Kubernetes插件配置。为了做到这一点,你将打开Jenkins的UI,导航到管理Jenkins ->配置系统->云-> Kubernetes,并输入Kubernetes的URL和Jenkins的URL适当,这是除非Jenkins是在Kubernetes在这种情况下默认的工作。
支持凭证包括:
用户名/密码
秘密文件(kubeconfig文件)
秘密文本(基于令牌的身份验证)(OpenShift)
私钥方式的服务帐户谷歌(GKE认证)
X.509客户端证书
要测试这个连接是否成功,可以使用test connection按钮来确保从Jenkins到Kubernetes集群之间有足够的通信,如下所示

除此之外,在Kubernetes Pod模板部分中,我们需要配置用于启动代理Pod的映像。我们不建议重写jnlp容器,除非在不寻常的情况下。对于您的代理,您可以使用Docker Hub中提供的默认Jenkins代理映像。在“Kubernetes Pod Template”部分,您需要指定以下内容(其余的配置由您决定):Kubernetes Pod模板名称,可以是任何和将显示为一个前缀独特的生成代理的名字,这期间将自动运行构建Docker image——docker image名称将作为参考自旋新Jenkins agent,如下见过

Kubernetes云配置
在Jenkins设置点击添加云,选择Kubernetes和填写信息,如名称,Kubernetes URL, Kubernetes服务器证书密钥,…
如果没有设置Kubernetes URL,连接选项将从服务帐户或kube config文件自动配置。
在Kubernetes外运行Jenkins master时,您需要将凭证设置为secret text。凭据的值将是您在代理运行的集群中为Jenkins创建的服务帐户的令牌。
如果你检查WebSocket,那么代理将通过HTTP连接,而不是Jenkins服务TCP端口。当Jenkins master运行在同一个Kubernetes集群中时,这是不必要的,但是当代理在外部集群中并且不能直接访问Jenkins master时(例如,它在反向代理的后面),这可以极大地简化设置。参见JEP-222了解更多信息。
注意:如果您的Jenkins主机在集群之外,并且使用了自签名的HTTPS证书,那么您将需要一些额外的配置。
限制哪些作业可以使用您配置的云
可以将云配置为只允许某些作业使用它们。
要启用此功能,请在云的高级配置中检查“限制管道支持到授权文件夹”框。要让作业使用这个云配置,您需要将它添加到jobs文件夹的配置中。
管道的支持
节点可以在管道中定义然后使用,但是,默认执行总是进入jnlp容器。您需要指定要在其中执行任务的容器。
请注意,POD_LABEL是一个新特性,可以自动标记1.17.0或更高版本中生成的pod,旧版本的Kubernetes插件需要手动标记podTemplate
这将在jnlp容器中运行

podTemplate {
   
    node(POD_LABEL) {
   
        stage('Run shell') {
   
            sh 'echo hello world'
        }
    }
}

这是特定于容器的。注意,变量POD_CONTAINER包含了当前上下文中容器的名称。它只在一个container block(容器块)中定义。

podTemplate(containers: []) {
   
  node(POD_LABEL) {
   
    stage('Run shell') {
   
      container('mycontainer') {
   
        sh "echo hello from $POD_CONTAINER" // displays 'hello from mycontainer'
      }
    }
  }
}

在examples目录下找到更多的例子。
可以通过将其添加到模板来定制所使用的默认jnlp代理映像

containerTemplate(name: 'jnlp', image: 'jenkins/inbound-agent:4.3-4-alpine', args: '${computer.jnlpmac} ${computer.name}'),

或者使用yaml语法

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: jnlp
    image: 'jenkins/inbound-agent:4.3-4-alpine'
    args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)']

容器组支持
可以为代理pod定义多个容器,这些容器具有共享的资源,比如挂载。通过使用localhost,可以像在任何Kubernetes pod中一样访问每个容器中的端口。
container语句允许直接在每个容器中执行命令。

podTemplate(containers: [
    containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'golang', image: 'golang:1.8.0', ttyEnabled: true, command: 'cat')
  ]) {
   

    node(POD_LABEL) {
   
        stage('Get a Maven project') {
   
            git 'https://github.com/jenkinsci/kubernetes-plugin.git'
            container('maven') {
   
                stage('Build a Maven project') {
   
                    sh 'mvn -B clean install'
                }
            }
        }

        stage('Get a Golang project') {
   
            git url: 'https://github.com/hashicorp/terraform.git'
            container('golang') {
   
                stage('Build a Go project') {
   
                    sh """
                    mkdir -p /go/src/github.com/hashicorp
                    ln -s `pwd` /go/src/github.com/hashicorp/terraform
                    cd /go/src/github.com/hashicorp/terraform && make core-dev
                    """
                }
            }
        }

    }
}

Pod和容器模板配置
podTemplate是pod的模板,它将用于创建代理。可以通过用户界面配置,也可以通过管道配置。无论哪种方式,它都提供了对以下字段的访问:
cloud 在Jenkins设置中定义的云的名称。默认为kubernetes
name pod的名称。
namespace pod的命名空间。
label pod标签。可以设置为唯一的值,以避免跨构建冲突,或省略,并在步骤中定义POD_LABEL。
yaml Pod的yaml表示,允许将不支持的任何值设置为字段
yamlMergeStrategy 合并()或覆盖()。控制yaml定义是覆盖还是与用inheritFrom声明的pod模板继承的yaml定义合并。默认为覆盖()。
containers 用于创建pod容器的容器模板(见下文)。
serviceAccount pod的service account。
nodeSelector 节点选择器pod的节点选择器。
nodeUsageMode 是’NORMAL’还是’EXCLUSIVE’,这控制Jenkins是只调度标签表达式匹配的作业还是尽可能多地使用节点。
volumes 为pod定义的由所有容器装载的卷。
envVars 应用于所有容器的环境变量。
envVar 环境变量,其值内联定义。
secretEnvVar 环境变量,其值来自Kubernetes secret。
imagePullSecrets secret名称列表,从私有Docker仓库中提取图像。
annotations 注释应用于pod的注释。
inheritFrom 一个或多个要继承的pod模板列表(下面有更多细节)。
slaveConnectTimeout 在线代理的超时时间(以秒为单位)(下面有更多详细信息)。
podRetention 贮藏力控制着贮藏剂pod的行为。可以是’never()’, ‘onFailure()’, ‘always()’,或’default()’——如果为空,则默认在activedeadlinesseconds传递后删除pod。
activeDeadlineSeconds 如果podreattention设置为’never()‘或’onFailure()’, pod将在此截止日期之后被删除。
idleMinutes 允许Pod保持活动状态以便重用,直到最后一步在Pod上执行之后,配置的分钟数已经过去。
showRawYaml 启用或禁用原始Yaml文件的输出。默认值为true
runAsUser 运行pod中所有容器的用户ID。
runAsGroup 运行pod中所有容器的组ID。
hostNetwork 使用主机网络。
workspaceVolume 用于工作区的卷类型。可以是emptyDirWorkspaceVolume(默认)、dynamicPVC()、hostPathWorkspaceVolume()、nfsWorkspaceVolume()或persistentvoluumeclaimworkspacevolume()。

containerTemplate是一个将被添加到pod中的容器模板。同样,它可以通过用户界面或管道进行配置,并允许你设置以下字段:
name 容器的名称。
image 容器的映像。
envVars 应用于容器的环境变量(补充和覆盖在pod级别上设置的环境变量)。
envVar 环境变量,其值内联定义。
secretEnvVar 环境变量,其值来自Kubernetes秘密。
command 容器将执行的命令。
args 参数传递给命令的参数。
ttyEnabled 标志,标记tty应该被启用。
livenessProbe 在容器中添加到exec活动探测的livessprobe参数(不支持httpGet活动探测)
ports 端口暴露集装箱上的端口。
alwaysPullImage 容器将在启动时拉出图像。
runAsUser 运行容器的用户ID。
runAsGroup 容器as运行的组ID。
指定不同的默认代理连接超时
缺省情况下,座席连接超时时间设置为100秒。在某些情况下,您希望设置一个不同的值,如果这样的话&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值