k8s环境下配置jenkins主从
通过以上配置,可实现按需创建 Jenkins Slave Pod,单集群可支持 2000+ 并发构建任务(取决于 K8s 集群规模)。建议配合声明式流水线(Declarative Pipeline)实现全自动化 CI/CD 流程。的 Jenkins 主从架构,支撑日均万级构建任务。实现全自动化 CI/CD 流程。通过以上配置,可实现。
·
一、架构概述与核心组件
| 组件 | 作用 | 示例配置 |
|---|---|---|
| Jenkins Master | 调度任务、管理流水线,部署为 K8s Deployment | 使用 jenkins/jenkins:lts 镜像,挂载 PVC 存储 /var/jenkins_home |
| Kubernetes Plugin | 动态创建/销毁 Slave Pod,需配置云集群信息 | Manage Jenkins → Manage Nodes and Clouds → Add Kubernetes Cloud |
| Slave Pod | 按需启动的临时执行节点,包含 JNLP 容器及工具链(如 Maven、Docker 等) | 定义多容器 Pod 模板,共享 /var/run/docker.sock 和 Maven 缓存目录 |
二、部署步骤与关键配置
1. 部署 Jenkins Master
# jenkins-master-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-master
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
securityContext:
fsGroup: 1000 # 确保 PVC 挂载权限
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- containerPort: 8080
- containerPort: 50000 # JNLP 协议端口(可选,建议禁用明文端口)
volumeMounts:
- name: jenkins-data
mountPath: /var/jenkins_home
volumes:
- name: jenkins-data
persistentVolumeClaim:
claimName: jenkins-pvc # 需提前创建 PVC
2. 配置 Kubernetes Plugin
-
必填参数:
- Kubernetes URL:
https://kubernetes.default.svc.cluster.local(集群内访问 API) - Namespace: 指定 Slave Pod 运行的命名空间(如
jenkins-slave) - Jenkins URL:
http://jenkins-master:8080(服务名需与 Master 的 Service 名称一致) - Credentials: 绑定 K8s ServiceAccount(需 RBAC 权限)
- Kubernetes URL:
-
高级配置:
- Pod Retention →
Never(任务完成后销毁 Pod) - Container Cap → 设置最大并发 Pod 数(如
10)
- Pod Retention →
三、Slave Pod 模板优化
1. 多容器协作模式
# Pod 模板示例(Jenkins 配置界面填写)
containers:
- name: jnlp
image: jenkins/inbound-agent:4.11.2-jdk11
args: '$(JENKINS_SECRET) $(JENKINS_NAME)'
resources:
limits:
cpu: 500m
memory: 1Gi
- name: maven
image: maven:3.8.6-jdk-11
command: ["cat"]
tty: true # 保持容器运行
volumeMounts:
- name: maven-repo
mountPath: /root/.m2
volumes:
- name: maven-repo
persistentVolumeClaim:
claimName: maven-repo-pvc # 共享 Maven 仓库缓存
2. **持久化与资源配置
| 优化项 | 配置方法 |
|---|---|
| Docker in Docker | 挂载宿主机 Docker Socket:/var/run/docker.sock → 容器内执行 Docker 命令 |
| 资源配额 | 通过 requests/limits 控制 CPU/Memory,避免 Slave 资源争抢 |
| 亲和性调度 | 使用 nodeAffinity 将 Slave Pod 调度到高配置节点 |
四、安全加固与权限管理
-
RBAC 权限最小化:
# 创建 Jenkins Slave 专用 ServiceAccount apiVersion: v1 kind: ServiceAccount metadata: name: jenkins-slave namespace: jenkins-slave --- # 仅授予必要权限(非 cluster-admin) kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: jenkins-slave-role rules: - apiGroups: [""] resources: ["pods", "pods/exec"] verbs: ["create", "delete", "get", "list"] -
网络安全策略:
- 禁用 JNLP 明文端口(仅通过 WebSocket 通信)
- 使用 NetworkPolicy 限制 Master 与 Slave 的通信范围
五、运维监控与调试
1. 日志与故障排查
- Pod 启动失败 → 检查
kubectl describe pod <slave-pod>事件详情 - JNLP 连接超时 → 验证 Jenkins Master Service 的网络可达性
- 工具链缺失 → 检查 Slave 容器镜像是否预装所需软件(如 Git、Maven)
2. 性能监控
| 指标 | 监控工具 | 优化方向 |
|---|---|---|
| Pod 启动延迟 | Prometheus + kube-state-metrics |
优化镜像体积,启用缓存预热 |
| 资源利用率 | Grafana 面板(CPU/Memory/IO) | 调整 requests/limits 参数 |
| 任务队列堆积 | Jenkins Queue Monitoring 插件 | 动态扩展 Slave Pod 数量上限 |
六、扩展场景与高级技巧
- 多集群分发:配置多个 Kubernetes Cloud,将任务分发到不同集群。
- Spot 实例优化:使用
nodeSelector调度 Slave 到低成本节点,并设置优雅驱逐策略。 - 自定义工具链:构建专用 Slave 镜像,预装企业内部分发工具(如内部 SDK)。
通过以上配置,可实现 弹性伸缩、资源隔离、安全可控 的 Jenkins 主从架构,支撑日均万级构建任务。建议结合 声明式流水线(Declarative Pipeline) 实现全自动化 CI/CD 流程。
主从配置案例
一、基础环境要求
- Kubernetes 集群
- 版本 ≥ 1.19,支持 CSI 存储
- 已部署
kubectl和kubeconfig权限配置
- Jenkins 主节点
- 版本 ≥ 2.346.3(支持 Kubernetes Plugin 1.36+)
- 已安装插件:
Kubernetes Plugin、Pipeline、Docker Plugin
二、核心配置步骤
1. 配置 Kubernetes 云(Manage Jenkins → Manage Nodes and Clouds)
-
参数说明:
Name: k8s-cloud Kubernetes URL: https://<k8s-api-server>:6443 Namespace: jenkins-slave Credentials: kubeconfig 文件或 ServiceAccount Token Jenkins URL: http://jenkins-master:8080 -
高级配置:
- Pod Retention:
Never(任务完成后自动销毁 Pod) - 容器模板空闲时间:
300s(5分钟无任务自动回收) - Pod 实例上限:
10(并行任务限制)
- Pod Retention:
2. Pod 模板配置
# 容器模板(主容器)
- Name: jnlp
Image: jenkins/inbound-agent:4.11.2-jdk11
WorkingDir: /home/jenkins
Resource Limits:
CPU: 500m
Memory: 1Gi
Volume Mounts:
- Name: docker-sock
MountPath: /var/run/docker.sock
- Name: maven-repo
MountPath: /root/.m2
# 附加工具容器(示例)
- Name: maven
Image: maven:3.8.6-jdk-11
Command: sleep
Args: infinity
3. 持久化存储配置
volumes:
- Name: maven-repo
PersistentVolumeClaim:
ClaimName: maven-repo-pvc
- Name: docker-sock
HostPath:
Path: /var/run/docker.sock
4. 标签与调度策略
- 标签规则:
Label: k8s-slave-maven Usage: Only build jobs with label expressions matching this node - 节点亲和性示例:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: [ssd]
三、权限与安全配置
-
ServiceAccount 权限:
apiVersion: v1 kind: ServiceAccount metadata: name: jenkins-slave --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: jenkins-slave-rolebinding subjects: - kind: ServiceAccount name: jenkins-slave namespace: jenkins-slave roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io -
安全加固:
- 禁用 JNLP 协议的明文端口(仅使用 WebSocket)
- 容器镜像签名验证(需配置 Admission Controller)
四、测试与验证
-
手动触发测试任务:
pipeline { agent { label 'k8s-slave-maven' } stages { stage('Test') { steps { sh 'mvn --version' sh 'docker ps' } } } } -
日志排查要点:
- Pod 调度失败 → 检查资源配额/节点亲和性
- JNLP 连接超时 → 验证 Jenkins URL 和网络策略
- 工具缺失 → 检查容器镜像内预装软件
五、性能优化建议
- 动态伸缩策略:
- 基于 Jenkins 队列长度自动扩展 Pod(需配合
Jenkins Auto Scaling Plugin)
- 基于 Jenkins 队列长度自动扩展 Pod(需配合
- 镜像缓存优化:
- 使用
DaemonSet预拉取基础镜像
- 使用
- 资源利用率监控:
- 集成 Prometheus + Grafana 监控 CPU/Memory/IO 指标
常见问题处理
| 问题现象 | 解决方案 |
|---|---|
| Pod 处于 Pending 状态 | 检查 ResourceQuota 和节点资源可用性 |
| JNLP 连接被拒绝 | 验证 Jenkins 主节点防火墙规则 |
| 容器启动后立即退出 | 检查容器启动命令和存活探针配置 |
通过以上配置,可实现按需创建 Jenkins Slave Pod,单集群可支持 2000+ 并发构建任务(取决于 K8s 集群规模)。建议配合声明式流水线(Declarative Pipeline)实现全自动化 CI/CD 流程。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)