在Jenkins界面中配置Jenkins Agent
在本章中,您需要完成以下部分:
- 在Jenkins界面中安装Kubernetes的插件,并在Cloud中配置集群信息用于连接集群。
- 在Cloud中配置Pod Template,作为后续在集群中动态创建Agent Pod的模板。
在执行上述安装和配置步骤前,请先完成集群的准备工作。
集群的准备工作
在配置Jenkins Agent之前,集群侧需要提前进行一些操作,用来支持Jenkins Agent的后续配置。
- 返回CCE控制台,单击对应集群名称,在“总览”界面的右侧“连接信息”模块,单击“配置”,下载kubectl配置文件,作为Jenkins连接集群的凭证。
图1 连接信息
- 在集群控制台左侧导航栏中单击“存储”,在右上角单击“创建存储卷声明 PVC”。在“创建存储卷声明 PVC”界面输入以下参数,单击“创建”。创建PVC,用于持久化存储Jenkins Agent完成任务过程中产生的数据。
说明:
在CCE控制台中,极速文件存储表示SFS Turbo类型存储。
图2 创建PVC- 存储卷声明类型:极速文件存储
- PVC名称:jenkins-agent
- 创建方式:新建存储卷 PV
- 极速文件存储:选择2中使用的极速文件存储
- PV名称:pv-efs-jenkins-agent
- 返回ECS,依次执行下述命令,创建具有SWR认证信息的Secret,作为后续向SWR推送镜像的凭证。
- 下载jq命令,用于处理和操作JSON数据,支持查询、筛选、修改和格式化等功能。以下命令以CentOS 7.6操作系统为例。
yum install jq
- 执行以下命令,创建docker-registry类型的Secret,用于存储SWR的认证信息。同时,提取并解码SWR的认证信息,保存至/tmp/config.json文件中。
- docker-server:填写SWR的镜像仓库地址,格式为swr.[区域].myhuaweicloud.com。
获取方式:需要先获取不同区域对应的值,请参见地区和终端节点。随后将swr.[区域].myhuaweicloud.com中的[区域]替换为对应值即可,如华东-上海一:swr.cn-east-3.myhuaweicloud.com。
- docker-username:填写SWR登录指令中的用户名。
获取方式:登录SWR控制台,“总览”界面右上角单击“登录指令”,查看临时登录指令页签中命令,命令中-u后的内容即为用户名。
- docker-password:填写SWR登录指令中的密码。
说明:
临时登录指令有效期为6小时,过期后需要重新配置。
您可以在“登录指令”界面中选择“长期有效登录指令”,根据页面提示配置相关信息,获取“长期有效登录命令”,进而获得用户名和密码。
图3 获取docker-username和docker-password
kubectl create secret docker-registry swr-secret \ --docker-server=https://swr.xxx.myhuaweicloud.com \ --docker-username=xxx \ --docker-password=xxx \ --dry-run=client -o json | jq -r '.data.".dockerconfigjson"' | base64 -d > /tmp/config.json
- docker-server:填写SWR的镜像仓库地址,格式为swr.[区域].myhuaweicloud.com。
- 利用/tmp/config.json文件创建一个generic类型的Secret,该Secret可以直接挂载在后续创建的Jenkins Agent的Pod实例中。
kubectl create secret generic swr-secret --from-file=/tmp/config.json -n default
- 下载jq命令,用于处理和操作JSON数据,支持查询、筛选、修改和格式化等功能。以下命令以CentOS 7.6操作系统为例。
在Jenkins界面中配置Cloud信息
- 返回Jenkins界面,在左侧导航栏中单击“Manage Jenkins”,选择“System Configuration > Plugins > Available plugins”,在“Available plugins”页签中查找并安装“Kubernetes”插件。安装“Kubernetes”插件,用于在集群中动态创建Jenkins Agent(Pod形式呈现),并在每次构建完成后销毁Pod。
本示例中安装的插件版本为Kubernetes pluginVersion:4295.v7fa_01b_309c95,插件版本可能随时间变化发生变动,请您自行选择。此外,您可以根据需要安装其他插件,如Kubernetes CLI Plugin(允许为Job配置kubectl工具,与Kubernetes集群进行交互)等。
图4 查找“Kubernetes”插件 - 在当前界面左上方路径中单击“Manage Jenkins”,单击“Security > Security”。在“CSRF Protection”模块中勾选“Enable Proxy Compatibility”,最下方单击“Apply”。
说明:
开启“Enable Proxy Compatibility”的主要目的是避免“Error 403 No valid crumb was included in the request”错误。
Jenkins通过CSRF保护机制防止跨站请求伪造攻击。当用户执行敏感操作(如构建项目)时,Jenkins会要求提供有效的“crumb”。而在使用反向代理(如 Nginx 或 Apache)或负载均衡器时,请求会从客户端转发到Jenkins服务器。这些代理和负载均衡器可能会修改请求头,导致CSRF令牌(crumb)丢失或未能正确传递,从而引发“Error 403 No valid crumb was included in the request”错误。
启用“Enable Proxy Compatibility”后 ,Jenkins会采取一种容错机制,使其能够在代理环境下能够正常处理传递的请求,确保CSRF令牌(crumb)能够正确通过代理传递并进行验证。
图5 开启“Enable Proxy Compatibility” - 在当前界面左上方路径中单击“Manage Jenkins” ,单击“Security > Credentials”,单击“Stores scoped to Jenkins > System > Global credentiials (unrestricted)”,在右侧单击“Add Credentials”,增加集群凭证。
在“New credentials”界面中,“Kind”选择“Secret file”,“Scope”选择“Global (Jenkins, nodes, items, all child items, etc)”,“File”选择下载的kubectl配置文件,其他参数保持默认,单击“Create”。
图6 上传凭证 - 创建Cloud,Cloud用于配置集群信息,帮助Jenkins匹配到正确的集群。
- 在当前界面左上方路径中单击“Manage Jenkins” ,单击“SystemConfiguration > Clouds”,单击“New Cloud”创建新Cloud,并填写Cloud基本信息。
“Cloud name”输入Cloud名称,名称可自定义,“Type”勾选“Kubernetes”,单击“Create”。
图7 Cloud基本信息 - 填写集群相关信息。
图8 集群详细信息
表1 集群详细参数说明 参数
示例
描述
Kubernetes URL
https://kubernetes.default.svc.cluster.local:443
表示集群API Server地址。
可直接填写“https://kubernetes.default.svc.cluster.local:443",该地址表示集群内部访问Kubernetes API Server的标准DNS地址。
Kubernetes Namespace
default
表示动态创建的Jenkins Agent运行的命名空间。
Credentials
xxx-kubeconfig.yaml
表示集群连接凭证。
请选择3中上传的连接凭证。
说明:
选择凭证之后,请单击右侧“Test Connection”,查看是否能正常连接集群。
若左侧回显“Connected to Kubernetes xxx”,则说明集群能够正常连接。
Jenkins URL
http://10.247.22.139:8080
表示Jenkins的访问路径。
请填写4的集群内访问的IP地址,端口号为8080。
Jenkins tunnel
10.247.22.139:50000
用于在Jenkins Master与Jenkins Agent之间建立连接。
请填写4的集群内访问的IP地址,端口号为50000。
- 确保以上信息无误后,请单击“Save”。
- 在当前界面左上方路径中单击“Manage Jenkins” ,单击“SystemConfiguration > Clouds”,单击“New Cloud”创建新Cloud,并填写Cloud基本信息。
- 配置Pod模板。通过该模板Jenkins能够在集群中按需创建Jenkins Agent的Pod实例,并使用创建的Pod运行Jenkin任务。这些Pod是按需创建的,任务执行完毕后会被自动销毁。
- 单击新配置的Cloud名称,单击“Pod Templates > Add a pod template”。
- 配置Pod模板基本参数。
- Name:表示Pod模板的名称,可自定义,如jenkins-agent。
- Namespace:表示创建Pod的命名空间,需要与Cloud中的命名空间一致,如default。
- 其他参数:您可以根据需要进行填写,本示例保持默认。
图9 Pod模板基本参数 - 添加容器模板。本示例需要依次添加3个容器模板,具体参数信息将以容器1、容器2和容器3的形式在表2中呈现,您可以按照表中信息添加3个容器模板。
- 容器1:使用jenkins/inbound-agent:latest镜像,主要用于连接Jenkins Agent和Jenkins Master,保证任务的连续执行。
- 容器2:使用maven:3.8.1-jdk-8镜像,主要用于执行流水线(Pipeline)中的打包任务。
- 容器3:使用gcr.io/kaniko-project/executor:v1.23.2-debug,主要用于在容器内构建Docker镜像。
说明:
建议提前将上述3个镜像推送至SWR的镜像仓库中,这样可以提高构建速度和可靠性,具体操作步骤请参见客户端上传镜像。
将镜像存储在SWR的镜像仓库中,Jenkins在构建Pod时无需重新从外部源拉取镜像,从而加快镜像获取的速度并减少网络延迟。这不仅能够优化构建时间,还能有效减少因网络波动或镜像拉取失败而导致的构建失败风险,确保构建过程更加稳定和高效。
图10 容器模板参数表2 容器模板参数说明 参数
示例
描述
Name
容器1:jnlp
容器2:maven
容器3:kaniko
表示在集群中构建的容器名称。
容器1的名称通常固定为jnlp,其他可自定义。
Docker image
容器1:jenkins/inbound-agent:latest
容器2:maven:3.8.1-jdk-8
容器3:gcr.io/kaniko-project/executor:v1.23.2-debug
表示构建容器时需要的镜像。
如果您已将相应的镜像上传至SWR,则需要将对应值改为SWR中的镜像地址。
Working directory
容器1~3:/home/jenkins/agent
表示容器在执行构建任务期间默认的文件存储位置,可自定义。
Command to run
容器1~3:sleep
指定容器启动时要执行的命令。
Arguments to pass to the command
容器1~3:9999999
指定传递给“Command to run”的参数。
sleep 9999999命令表示容器持续运行,直到超过9999999秒或被手动终止。该配置主要用于让容器保持活跃状态,防止容器在没有任务时自动退出。
- 单击“Add Volume”,选择“Persistent Volume Claim”,配置Persistent Volume Claim信息。该PVC会被挂载到所有容器中,为各容器提供持久化存储。填写信息如下:
- Claim Name:填写2中集群创建的PVC名称。
- Mount path:表示挂载路径,固定填写/root/.m2。
图11 配置Persistent Volume Claim - 再次单击“Add Volume”,选择“Secret Volume”,配置Secret Volume信息。执行Pipeline作业时,该Secret作为kaniko容器向SWR中推送镜像的凭证。填写信息如下:
- Secret Name:填写3中集群创建的Secret名称。
- Mount path:表示挂载路径,固定填写/kaniko/.docker。
图12 配置Secret Volume - 配置拉取镜像的密钥,本示例使用默认密钥default-secret。
图13 配置Image Pull Secret
- 确保以上信息无误后,单击“Save”