一、架构概述与核心组件

组件 作用 示例配置
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 权限)
  • 高级配置

    • Pod RetentionNever(任务完成后销毁 Pod)
    • Container Cap → 设置最大并发 Pod 数(如 10

三、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 调度到高配置节点

四、安全加固与权限管理

  1. 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"]
    
  2. 网络安全策略

    • 禁用 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 数量上限

六、扩展场景与高级技巧

  1. 多集群分发:配置多个 Kubernetes Cloud,将任务分发到不同集群。
  2. Spot 实例优化:使用 nodeSelector 调度 Slave 到低成本节点,并设置优雅驱逐策略。
  3. 自定义工具链:构建专用 Slave 镜像,预装企业内部分发工具(如内部 SDK)。

通过以上配置,可实现 弹性伸缩、资源隔离、安全可控 的 Jenkins 主从架构,支撑日均万级构建任务。建议结合 声明式流水线(Declarative Pipeline) 实现全自动化 CI/CD 流程。

主从配置案例

一、基础环境要求

  1. Kubernetes 集群
    • 版本 ≥ 1.19,支持 CSI 存储
    • 已部署 kubectlkubeconfig 权限配置
  2. Jenkins 主节点
    • 版本 ≥ 2.346.3(支持 Kubernetes Plugin 1.36+)
    • 已安装插件:Kubernetes PluginPipelineDocker 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(并行任务限制)

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]
    

三、权限与安全配置

  1. 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 
    
  2. 安全加固

    • 禁用 JNLP 协议的明文端口(仅使用 WebSocket)
    • 容器镜像签名验证(需配置 Admission Controller)

四、测试与验证

  1. 手动触发测试任务

    pipeline {
      agent { label 'k8s-slave-maven' }
      stages {
        stage('Test') {
          steps {
            sh 'mvn --version'
            sh 'docker ps'
          }
        }
      }
    }
    
  2. 日志排查要点

    • Pod 调度失败 → 检查资源配额/节点亲和性
    • JNLP 连接超时 → 验证 Jenkins URL 和网络策略
    • 工具缺失 → 检查容器镜像内预装软件

五、性能优化建议

  1. 动态伸缩策略
    • 基于 Jenkins 队列长度自动扩展 Pod(需配合 Jenkins Auto Scaling Plugin
  2. 镜像缓存优化
    • 使用 DaemonSet 预拉取基础镜像
  3. 资源利用率监控
    • 集成 Prometheus + Grafana 监控 CPU/Memory/IO 指标

常见问题处理

问题现象 解决方案
Pod 处于 Pending 状态 检查 ResourceQuota 和节点资源可用性
JNLP 连接被拒绝 验证 Jenkins 主节点防火墙规则
容器启动后立即退出 检查容器启动命令和存活探针配置

通过以上配置,可实现按需创建 Jenkins Slave Pod,单集群可支持 2000+ 并发构建任务(取决于 K8s 集群规模)。建议配合声明式流水线(Declarative Pipeline)实现全自动化 CI/CD 流程。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐