Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Jenkins 集群(Master + Agent)

下面是一份 企业级 Jenkins 集群(Master + Agent + 高可用 + Kubernetes 动态节点)完整指南(收藏版),包含原理、架构图、部署方式、最佳实践、踩坑点,非常全面。

1. Jenkins 集群是什么?

Jenkins 集群 = Controller(Master) + 多个 Agents

目的:

  • 分布式执行构建任务
  • 解耦 UI / 调度 和 构建
  • 支持大型并发 CI/CD
  • 隔离构建环境(Java/Python/Node/Docker/K8s)

Jenkins 自身的 Master 不负责 Heavy Workload,只做“调度 + 管理 UI”。

所有构建都应该下放到 Agents。

2. Jenkins 集群架构图(通用版)

            ┌─────────────────────────┐
                   Jenkins Master
                UI / 任务调度 / 流水线
            └───────────┬─────────────┘
        ┌───────────────┼───────────────┐
        │               │               │
┌──────────┐       ┌──────────┐       ┌──────────┐
│ Agent #1 │       │ Agent #2 │       │ Agent #3 │
│ Linux    │       │ Docker   │       │ Windows  │
└──────────┘       └──────────┘       └──────────┘

3. Jenkins Agent 类型(四种主流)

类型 描述 优点 使用场景
SSH Agent Master SSH 到机器 简单稳定 传统部署
JNLP Agent 由 Agent 主动连 网络穿透强 内网/混合网络
Docker Agent(推荐) 每次构建生成独立容器 隔离/干净/一致 现代项目
Kubernetes 动态 Agent(生产强推) 动态创建 Pod 弹性扩容 企业级 DevOps

4. 部署 Jenkins 集群(最佳实践架构)

⭐ 推荐方式:

  • Master 部署在 Kubernetes
  • Agents 使用 Kubernetes Pod 动态创建

这是现在全球企业最常用的方式。

🅰️ 方案 A:Jenkins(Master) + SSH Agents

1. Agent 机器创建 jenkins 用户

useradd jenkins
mkdir /home/jenkins/.ssh -p
chown jenkins:jenkins /home/jenkins/.ssh

2. 在 Jenkins Master 添加 SSH 源码凭证

Manage Jenkins -> Manage Credentials -> Add -> SSH Username with private key

3. 绑定 SSH Agent

Manage Jenkins -> Nodes -> New Node

配置 Label 方便 Pipeline 使用:

agent { label 'linux' }

🅱️ 方案 B:JNLP Agent(反向连接)

适用于:

  • Agent 不能被 Master SSH
  • 网络隔离(如 K8s node、云主机)

Agent 机器启动:

java -jar agent.jar \
    -jnlpUrl http://master:8080/computer/node1/jenkins-agent.jnlp \
    -secret 1234567890abcdef

🅾️ 方案 C:Docker Agent(构建更干净)

安装 Docker 插件:

Manage Jenkins -> Manage Plugins -> Docker Pipeline Plugin

Jenkinsfile:

pipeline {
    agent {
        docker {
            image 'python:3.12'
            args '-v /cache:/cache'
        }
    }
    stages {
        stage('Run') {
            steps {
                sh 'python --version'
            }
        }
    }
}

优势:

  • 构建环境一致
  • 代码与依赖隔离
  • 适合 Python/Node/Java/Go 项目

🅿️ 方案 D:Kubernetes 动态 Agent(企业级最推荐)

⭐ 架构图(K8s 动态 Agent)

                Jenkins Master(在 K8s)
           ┌──────────────┼─────────────┐
           │              │             │
     Pod Agent #1     Pod Agent #2   Pod Agent #3
   (python:3.12)     (node:20)       (maven:3-jdk17)

优点:

  • 无限扩容
  • 构建环境用完即删
  • 不会污染主机
  • 资源成本低
  • 多项目隔离强

➤ 安装 Kubernetes 插件

Manage Jenkins -> Plugins -> Kubernetes

➤ 配置 Kubernetes Cloud

Manage Jenkins -> Configure Clouds -> Add new cloud -> Kubernetes

填写:

  • Kubernetes URL:自动填
  • Jenkins 管理命名空间:jenkins
  • Jenkins URL:http://jenkins:8080
  • Credentials:使用 ServiceAccount

➤ Pod Template 示例

apiVersion: v1
kind: Pod
metadata:
  labels:
    jenkins: agent
spec:
  containers:
    - name: jnlp
      image: jenkins/inbound-agent:latest
      imagePullPolicy: IfNotPresent
    - name: python
      image: python:3.12
      command:
        - cat
      tty: true

➤ Jenkinsfile 动态调度

pipeline {
    agent {
        kubernetes {
            label "python-agent"
            yaml """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: python
    image: python:3.12
    command: ["sleep"]
    args: ["99d"]
"""
        }
    }
    stages {
        stage('Test') {
            steps {
                container('python') {
                    sh 'python3 --version'
                }
            }
        }
    }
}

5. Jenkins 集群持久化存储(非常关键)

Master 的 JENKINS_HOME 必须持久化:

场景 存储方式
Linux 本地安装 /var/jenkins_home + SSD
Docker volume
Kubernetes PVC (推荐使用 50~200GB)

6. Jenkins 集群高可用(HA)

Jenkins 本身 不支持 Active/Active

可实现:

方式 A:Active/Standby(Keepalived)

  • 2 台 Jenkins
  • 共享存储(NFS)
  • VIP(Keepalived)

方式 B:Master + Backup

  • 定时备份 /var/jenkins_home
  • 跳灾恢复(最快 3 分钟)

方式 C:K8s StatefulSet 单点(最常用)

配合:

  • PVC 备份
  • Velero
  • CronJob snapshot

7. Jenkins 集群最佳实践(企业生产环境)

Master 不执行任何构建

全部构建都在 Agent(SSH/Docker/K8s)

Agent 一律干净且一次性使用(强烈推荐 K8s Pod)

Jenkinsfile 全部存 Git repo

构建环境不装 Node/Python/Maven -> 交给容器

合理给 Agent 设置 Label,如:

go
python
node
maven
docker
k8s

控制台日志保留 14 天

构建历史只保留 20 次

插件控制在 40 个以内(越精简越稳定)