Jenkins 集群(Master + Agent)
下面是一份 企业级 Jenkins 集群(Master + Agent + 高可用 + Kubernetes 动态节点)完整指南(收藏版),包含原理、架构图、部署方式、最佳实践、踩坑点,非常全面。
Jenkins 集群 = Controller(Master) + 多个 Agents
目的:
- 分布式执行构建任务
- 解耦 UI / 调度 和 构建
- 支持大型并发 CI/CD
- 隔离构建环境(Java/Python/Node/Docker/K8s)
Jenkins 自身的 Master 不负责 Heavy Workload,只做“调度 + 管理 UI”。
所有构建都应该下放到 Agents。
┌─────────────────────────┐
Jenkins Master
UI / 任务调度 / 流水线
└───────────┬─────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Agent #1 │ │ Agent #2 │ │ Agent #3 │
│ Linux │ │ Docker │ │ Windows │
└──────────┘ └──────────┘ └──────────┘
| 类型 | 描述 | 优点 | 使用场景 |
|---|---|---|---|
| SSH Agent | Master SSH 到机器 | 简单稳定 | 传统部署 |
| JNLP Agent | 由 Agent 主动连 | 网络穿透强 | 内网/混合网络 |
| Docker Agent(推荐) | 每次构建生成独立容器 | 隔离/干净/一致 | 现代项目 |
| Kubernetes 动态 Agent(生产强推) | 动态创建 Pod | 弹性扩容 | 企业级 DevOps |
⭐ 推荐方式:
- Master 部署在 Kubernetes
- Agents 使用 Kubernetes Pod 动态创建
这是现在全球企业最常用的方式。
useradd jenkins
mkdir /home/jenkins/.ssh -p
chown jenkins:jenkins /home/jenkins/.ssh
Manage Jenkins -> Manage Credentials -> Add -> SSH Username with private key
Manage Jenkins -> Nodes -> New Node
配置 Label 方便 Pipeline 使用:
agent { label 'linux' }
适用于:
- Agent 不能被 Master SSH
- 网络隔离(如 K8s node、云主机)
Agent 机器启动:
java -jar agent.jar \
-jnlpUrl http://master:8080/computer/node1/jenkins-agent.jnlp \
-secret 1234567890abcdef
安装 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 项目
⭐ 架构图(K8s 动态 Agent)
Jenkins Master(在 K8s)
│
┌──────────────┼─────────────┐
│ │ │
Pod Agent #1 Pod Agent #2 Pod Agent #3
(python:3.12) (node:20) (maven:3-jdk17)
优点:
- 无限扩容
- 构建环境用完即删
- 不会污染主机
- 资源成本低
- 多项目隔离强
Manage Jenkins -> Plugins -> Kubernetes
Manage Jenkins -> Configure Clouds -> Add new cloud -> Kubernetes
填写:
- Kubernetes URL:自动填
- Jenkins 管理命名空间:jenkins
- Jenkins URL:http://jenkins:8080
- Credentials:使用 ServiceAccount
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
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'
}
}
}
}
}
Master 的 JENKINS_HOME 必须持久化:
| 场景 | 存储方式 |
|---|---|
| Linux 本地安装 | /var/jenkins_home + SSD |
| Docker | volume |
| Kubernetes | PVC (推荐使用 50~200GB) |
Jenkins 本身 不支持 Active/Active
可实现:
- 2 台 Jenkins
- 共享存储(NFS)
- VIP(Keepalived)
- 定时备份 /var/jenkins_home
- 跳灾恢复(最快 3 分钟)
配合:
- PVC 备份
- Velero
- CronJob snapshot
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 个以内(越精简越稳定)