第七章:节点管理

配置和管理 Jenkins 节点/代理,包括内置节点、SSH 节点、Kubernetes 集群。

最后更新: 2024-01-15
页面目录

Jenkins 节点管理

Jenkins 的分布式架构允许您使用多台机器分担构建任务,提高构建效率。本章介绍节点的概念、配置和管理。

节点概述

架构说明

┌─────────────────────────────────────────────────────────────────┐
│                    Jenkins Controller                            │
│                                                                  │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │  调度器 (Scheduler)                                      │   │
│   │  • 接收构建请求                                           │   │
│   │  • 选择合适的节点                                          │   │
│   │  • 分配 Executor                                          │   │
│   └─────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘
                ↓                               ↓
        ┌───────────────┐               ┌───────────────┐
        │   Linux Node   │               │ Windows Node   │
        │  Executor: 4   │               │  Executor: 2   │
        │  Label: docker │               │  Label: .net   │
        └───────────────┘               └───────────────┘
        ┌───────────────┐
        │ macOS Node     │
        │  Executor: 2   │
        │  Label: ios    │
        └───────────────┘

核心概念

概念 说明
Controller 主节点,负责管理配置、调度任务
Agent/Node 代理节点,实际执行构建任务
Executor 执行槽位,节点上可并行执行的任务数
Label 标签,用于标记节点能力
Workspace 工作目录,每个构建分配的工作空间

内置节点配置

通过 Web 界面配置

  1. 进入 「系统管理」→「节点管理」
  2. 点击 「新建节点」
  3. 配置节点参数

节点配置参数

参数 说明 示例
节点名称 节点唯一标识符 linux-builder-01
描述 节点说明 Linux 构建服务器
执行器数量 并行构建数 4
远程工作目录 工作空间根目录 /home/jenkins/workspace
标签 节点标签(空格分隔) linux docker maven
用法 节点使用策略 尽可能使用
启动方式 节点连接方式 通过 Java Web Start 启动
可用性 节点可用策略 保持在线

通过 SSH 连接节点

1. 配置 SSH 节点

系统管理 → 节点管理 → 新建节点 → 永久节点
配置项
节点名称 linux-ssh-01
执行器数量 4
远程工作目录 /opt/jenkins/agents/${ITEM_FULLNAME}
标签 linux docker
启动方式 Launch agent by connecting it to the master
Host Key Verification Strategy Manually trusted key Verification Strategy

2. 配置凭据

凭据 → 系统 → 全局凭据 → 添加凭据
凭据类型 配置
类型 SSH Username with private key
Username jenkins
Private Key From the jenkins master ~/.ssh

3. Linux/Mac 节点设置

# 1. 创建 jenkins 用户
sudo useradd -m -s /bin/bash jenkins
sudo passwd jenkins

# 2. 配置 sudo 权限(可选)
sudo visudo
# 添加: jenkins ALL=(ALL) NOPASSWD: ALL

# 3. 配置 SSH
sudo su - jenkins
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 4. 生成 SSH 密钥对
ssh-keygen -t ed25519 -C "jenkins@controller"

# 5. 授权公钥
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 6. 安装必要工具
sudo apt install -y openjdk-11-jdk docker.io maven git
# 或
sudo yum install -y java-11-openjdk docker maven git

4. Windows SSH 节点设置

使用 OpenSSH 或 Bitvise SSH Server:

# 使用 Chocolatey 安装 OpenSSH
choco install openssh -y

# 配置服务
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

Kubernetes 动态节点

安装 Kubernetes 插件

  1. 进入 「系统管理」→「插件管理」
  2. 搜索并安装 Kubernetes 插件

配置云端

系统管理 → 系统配置 → 云计算 → 添加新的云 → Kubernetes
配置项
名称 kubernetes
Kubernetes 地址 https://kubernetes.default.svc
命名空间 default
凭据 Kubeconfig
Jenkins 地址 http://jenkins:8080
Jenkins 通道 jenkins:50000

Jenkins Agent 模板配置

# Pod 模板配置
---
name: jenkins-agent
namespace: jenkins
label: jenkins-agent
containers:
- name: jnlp
  image: jenkins/inbound-agent:latest-jdk11
  imagePullPolicy: IfNotPresent
  workingDir: /home/jenkins/agent
  ttyEnabled: true
  resourceRequestCpu: 500m
  resourceLimitCpu: 1000m
  resourceRequestMemory: 512Mi
  resourceLimitMemory: 1Gi
  envVars:
  - envVar:
      key: JENKINS_URL
      value: http://jenkins:8080
- name: maven
  image: maven:3.8-openjdk-11
  command: sleep
  args: infinity
  resourceRequestCpu: 1000m
  resourceLimitCpu: 2000m
  resourceRequestMemory: 1Gi
  resourceLimitMemory: 2Gi
- name: docker
  image: docker:20.10-dind
  securityContext:
    privileged: true
  volumeMounts:
  - name: docker-graph-storage
    mountPath: /var/lib/docker
volumes:
- name: docker-graph-storage
  emptyDir: {}
yamlMergeStrategy:
  override

Kubernetes Pipeline 示例

pipeline {
    agent {
        kubernetes {
            label 'java-build'
            defaultContainer 'jnlp'
            yaml '''
apiVersion: v1
kind: Pod
metadata:
  name: jenkins-agent
spec:
  containers:
  - name: jnlp
    image: jenkins/inbound-agent:latest-jdk11
  - name: maven
    image: maven:3.8-openjdk-11
    command: sleep
    args: infinity
    resources:
      requests:
        memory: "1Gi"
        cpu: "500m"
      limits:
        memory: "2Gi"
        cpu: "1000m"
  restartPolicy: Never
'''
        }
    }
    
    stages {
        stage('Build') {
            steps {
                container('maven') {
                    sh 'mvn clean package'
                }
            }
        }
    }
}

Docker 动态节点

安装 Docker 插件

系统管理 → 插件管理 → 搜索 "Docker"

配置 Docker Cloud

系统管理 → 系统配置 → 云计算 → 添加新的云 → Docker
配置项
名称 docker-cloud
Docker Agent URL tcp://docker:2375
Enabled

容器模板

配置项
镜像 jenkins/inbound-agent:latest
拉取策略 Pull if not exist
标签 docker
运行方式 Container JumpStart

节点使用策略

节点配置选项

// Pipeline 中指定节点
pipeline {
    agent {
        node {
            label 'docker && linux'
            customWorkspace '/opt/jenkins/custom-workspace'
        }
    }
}

// 仅在标签节点执行
agent { label 'windows' }

// 任意可用节点
agent any

节点选择策略

策略 说明
尽可能使用 优先分配到负载较低的节点
只在指定标签运行 只在匹配标签的节点运行
从不分配 用于特殊目的节点

节点组管理

按标签分组

# Web 界面配置
标签: "docker,linux,maven,ubuntu-20.04"
// Pipeline 使用标签组
agent { label 'docker' }
agent { label 'linux && maven' }
agent { label 'docker || windows' }

节点池示例

标签 用途 节点
build 通用构建 node-1, node-2
docker Docker 构建 node-1, node-3
windows Windows 构建 win-node-1
macos macOS/iOS 构建 mac-mini
k8s Kubernetes Pod -

节点监控

查看节点状态

系统管理 → 节点管理 → [节点名称]

可查看:

  • CPU/内存使用率
  • 磁盘空间
  • 执行器状态
  • 构建历史

监控指标

指标 说明 告警阈值
CPU 使用率 处理器占用 > 80%
内存使用率 内存占用 > 85%
磁盘空间 可用空间 < 10GB
Executor 占用 并行槽位使用 > 90%

常见问题

1. 节点连接失败

# 检查 SSH 连接
ssh -v jenkins@agent-host

# 检查 Java 安装
java -version

# 检查端口连通性
telnet jenkins-host 50000

2. 磁盘空间不足

// Pipeline 中清理
post {
    always {
        cleanWs()
        sh 'docker system prune -af'
    }
}

3. 节点突然离线

检查网络、防火墙、资源耗尽等问题。

下一步

接下来让我们学习如何配置 Jenkins 安全设置。

👉 安全配置


💡 提示:生产环境建议使用 Kubernetes 或 Docker 动态节点,实现按需创建和销毁。