
# 在Jenkins界面中配置Jenkins Agent
在本章中，您需要完成以下部分：
- 在Jenkins界面中安装Kubernetes的插件，并在Cloud中配置集群信息用于连接集群。
- 在Cloud中配置Pod Template，作为后续在集群中动态创建Agent Pod的模板。
在执行上述安装和配置步骤前，请先完成[集群的准备工作]。
 #### 集群的准备工作
在配置Jenkins Agent之前，集群侧需要提前进行一些操作，用来支持Jenkins Agent的后续配置。
1. 返回[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击对应集群名称，在"概览"界面的右侧"连接信息"模块，单击"配置"，下载kubectl配置文件，作为Jenkins连接集群的凭证。
   
   图1连接信息   
   ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002134524017.png "点击放大")
   
   
   
2. 在集群控制台左侧导航栏中单击"存储"，在右上角单击"创建存储卷声明 PVC"。在"创建存储卷声明 PVC"界面输入以下参数，单击"创建"。创建PVC，用于持久化存储Jenkins Agent完成任务过程中产生的数据。
   
   ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
   在CCE控制台中，极速文件存储表示SFS Turbo类型存储。
   图2创建PVC   
   ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002107765517.png "点击放大")
   
   - 存储卷声明类型：极速文件存储
   
   - PVC名称：jenkins-agent
   
   - 创建方式：新建存储卷 PV
   
   - 极速文件存储：选择[2](https://support.huaweicloud.com/bestpractice-cce-autopilot/cce_bestpractice_1005.html#cce_bestpractice_1005__li35911263318)中使用的极速文件存储
   
   - PV名称：pv-efs-jenkins-agent
   
   
   
   
3. 返回ECS，依次执行下述命令，创建具有SWR认证信息的Secret，作为后续向SWR推送镜像的凭证。
   
   1. 下载jq命令，用于处理和操作JSON数据，支持查询、筛选、修改和格式化等功能。以下命令以CentOS 7.6操作系统为例。
      ```
      yum install jq
      ```
      
   
   2. 执行以下命令，创建docker-registry类型的Secret，用于存储SWR的认证信息。同时，提取并解码SWR的认证信息，保存至/tmp/config.json文件中。
      - docker-server：填写SWR的镜像仓库地址，格式为swr.\[区域\].myhuaweicloud.com。 获取方式：需要先获取不同区域对应的值，请参见[地区和终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint/SWR)。随后将swr.\[区域\].myhuaweicloud.com中的\[区域\]替换为对应值即可，如华东-上海一：swr.cn-east-3.myhuaweicloud.com。
        
      
      - docker-username：填写SWR登录指令中的用户名。 获取方式：登录[SWR控制台](https://console.huaweicloud.com/swr/)，"总览"界面右上角单击"登录指令"，查看临时登录指令页签中命令，命令中-u后的内容即为用户名。
        
      
      - docker-password：填写SWR登录指令中的密码。 获取方式：登录指令的命令中-p后的内容即为密码。
        ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
        临时登录指令有效期为6小时，过期后需要重新配置。
        您可以在"登录指令"界面中选择"长期有效登录指令"，根据页面提示配置相关信息，获取"长期有效登录命令"，进而获得用户名和密码。
        图3获取docker-username和docker-password   
        ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002095488842.png "点击放大")
        
        
      
      
      ```
      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
      ```
      
   
   3. 利用/tmp/config.json文件创建一个generic类型的Secret，该Secret可以直接挂载在后续创建的Jenkins Agent的Pod实例中。
      ```
      kubectl create secret generic swr-secret --from-file=/tmp/config.json -n default
      ```
      
   
   
   
   
 
#### 在Jenkins界面中配置Cloud信息
1. 返回Jenkins界面，在左侧导航栏中单击"Manage Jenkins"，选择"System Configuration \> Plugins \> Available plugins"，在"Available plugins"页签中查找并安装"Kubernetes"插件。安装"Kubernetes"插件，用于在集群中动态创建Jenkins Agent（Pod形式呈现），并在每次构建完成后销毁Pod。 
   本示例中安装的插件版本为[Kubernetes pluginVersion：4295.v7fa_01b_309c95](https://plugins.jenkins.io/kubernetes)，插件版本可能随时间变化发生变动，请您自行选择。此外，您可以根据需要安装其他插件，如[Kubernetes CLI Plugin](https://plugins.jenkins.io/kubernetes-cli/)（允许为Job配置kubectl工具，与Kubernetes集群进行交互）等。
   图4查找"Kubernetes"插件   
   ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002080986926.png "点击放大")
   
   
2. 在当前界面左上方路径中单击"Manage Jenkins"，单击"Security \> Security"。在"CSRF Protection"模块中勾选"Enable Proxy Compatibility"，最下方单击"Apply"。 
   ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
   开启"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"   
   ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002080832186.png "点击放大")
   
   
3. 在当前界面左上方路径中单击"Manage Jenkins" ，单击"Security \> Credentials"，单击"Stores scoped to Jenkins \> System \> Global credentials (unrestricted)"，在右侧单击"Add Credentials"，增加集群凭证。
   
   在"New credentials"界面中，"Kind"选择"Secret file"，"Scope"选择"Global (Jenkins, nodes, items, all child items, etc)"，"File"选择下载的kubectl配置文件，其他参数保持默认，单击"Create"。
   图6上传凭证   
   ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002110819034.png "点击放大")
   
   
4. 创建Cloud，Cloud用于配置集群信息，帮助Jenkins匹配到正确的集群。
   
   1. 在当前界面左上方路径中单击"Manage Jenkins" ，单击"SystemConfiguration \> Clouds"，单击"New Cloud"创建新Cloud，并填写Cloud基本信息。 "Cloud name"输入Cloud名称，名称可自定义，"Type"勾选"Kubernetes"，单击"Create"。
      图7Cloud基本信息   
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002116506177.png "点击放大") 
   
   2. 填写集群相关信息。
      图8集群详细信息   
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002080986934.png "点击放大")
      表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运行的命名空间。 说明： 该命名空间需与[3](https://support.huaweicloud.com/bestpractice-cce-autopilot/cce_bestpractice_1005.html#cce_bestpractice_1005__li186991041512)创建的工作负载jenkins-master所在命名空间一致。                                               |
      | Credentials          | **xxx-kubeconfig.yaml**                              | 表示集群连接凭证。 请选择[3]中上传的连接凭证。 说明： 选择凭证之后，请单击右侧"Test Connection"，查看是否能正常连接集群。 若左侧回显"Connected to Kubernetes xxx"，则说明集群能够正常连接。 |
      | Jenkins URL          | **http://10.247.22.139:8080**                        | 表示Jenkins的访问路径。 请填写[4](https://support.huaweicloud.com/bestpractice-cce-autopilot/cce_bestpractice_1005.html#cce_bestpractice_1005__li11218185620487)的集群内访问的IP地址，端口号为8080。                                                                                                                  |
      | Jenkins tunnel       | **10.247.22.139:50000**                              | 用于在Jenkins Master与Jenkins Agent之间建立连接。 请填写[4](https://support.huaweicloud.com/bestpractice-cce-autopilot/cce_bestpractice_1005.html#cce_bestpractice_1005__li11218185620487)的集群内访问的IP地址，端口号为50000。                                                                                          |
         
      
   
   3. 确保以上信息无误后，请单击"Save"。
   
   
   
   
5. 配置Pod模板。通过该模板Jenkins能够在集群中按需创建Jenkins Agent的Pod实例，并使用创建的Pod运行Jenkin任务。这些Pod是按需创建的，任务执行完毕后会被自动销毁。
   
   1. 单击新配置的Cloud名称，单击"Pod Templates \> Add a pod template"。
   
   2. 配置Pod模板基本参数。
      - Name：表示Pod模板的名称，可自定义，如jenkins-agent。
      
      - Namespace：表示创建Pod的命名空间，需要与Cloud中的命名空间一致，如default。
      
      - 其他参数：您可以根据需要进行填写，本示例保持默认。
      
      
      图9Pod模板基本参数   
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002146418589.png "点击放大") 
   
   3. 添加容器模板。本示例需要依次添加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镜像。
        ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
        建议提前将上述3个镜像推送至SWR的镜像仓库中，这样可以提高构建速度和可靠性，具体操作步骤请参见[客户端上传镜像](https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html)。
        将镜像存储在SWR的镜像仓库中，Jenkins在构建Pod时无需重新从外部源拉取镜像，从而加快镜像获取的速度并减少网络延迟。这不仅能够优化构建时间，还能有效减少因网络波动或镜像拉取失败而导致的构建失败风险，确保构建过程更加稳定和高效。
        
      
      
      图10容器模板参数   
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002110822198.png "点击放大")
       表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秒或被手动终止。该配置主要用于让容器保持活跃状态，防止容器在没有任务时自动退出。 |
         
      
   
   4. 单击"Add Volume"，选择"Persistent Volume Claim"，配置Persistent Volume Claim信息。该PVC会被挂载到所有容器中，为各容器提供持久化存储。填写信息如下：
      - Claim Name：填写[2]中集群创建的PVC名称。
      
      - Mount path：表示挂载路径，固定填写/root/.m2。
      
      
      图11配置Persistent Volume Claim   
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002116506185.png "点击放大") 
   
   5. 再次单击"Add Volume"，选择"Secret Volume"，配置Secret Volume信息。执行Pipeline作业时，该Secret作为kaniko容器向SWR中推送镜像的凭证。填写信息如下：
      - Secret Name：填写[3]中集群创建的Secret名称。
      
      - Mount path：表示挂载路径，固定填写/kaniko/.docker。
      
      
      图12配置Secret Volume   
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002080986942.png "点击放大") 
   
   6. 配置拉取镜像的密钥，本示例使用默认密钥default-secret。
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
      拉取本账号的SWR镜像时，可以使用默认密钥default-secret。如果需要使用其他账号的SWR镜像，则需要创建第三方镜像仓库的密钥，具体操作请参见[创建第三方镜像仓库的密钥](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0009.html#section2)。
      图13配置Image Pull Secret   
      ![](https://support.huaweicloud.com/bestpractice-cce-autopilot/zh-cn_image_0000002123994789.png "点击放大") 
   
   7. 确保以上信息无误后，单击"Save"。
   
   
   
   
 
