基于k8s的Jenkins CI/CD平台部署实践(一):Jenkins部署详解

基于k8s的Jenkins CI/CD平台部署实践(一):Jenkins部署详解

文章目录

  • [基于k8s的Jenkins CI/CD平台部署实践(一):Jenkins部署详解](#基于k8s的Jenkins CI/CD平台部署实践(一):Jenkins部署详解)
  • 一、Jenkins简介
  • 二、Jenkins自定义镜像构建
    • [1. Dockerfile示例(大家根据自己情况来进行修改)](#1. Dockerfile示例(大家根据自己情况来进行修改))
    • [2. 构建镜像并推送仓库](#2. 构建镜像并推送仓库)
  • 三、Jenkins实战部署
    • [1. 创建Namespace(cicd-namespace.yaml)](#1. 创建Namespace(cicd-namespace.yaml))
    • [2. 创建ServiceAccount(jenkins-serviceaccount.yaml)](#2. 创建ServiceAccount(jenkins-serviceaccount.yaml))
    • [3. 创建ClusterRoleBinding(jenkins-clusterrolebinding.yaml)](#3. 创建ClusterRoleBinding(jenkins-clusterrolebinding.yaml))
    • [4. 创建PersistentVolumeClaim(jenkins-pvc.yaml)](#4. 创建PersistentVolumeClaim(jenkins-pvc.yaml))
    • [5. 创建Deployment(jenkins-deploy.yaml)](#5. 创建Deployment(jenkins-deploy.yaml))
    • [6. 创建Service(jenkins-svc.yaml)](#6. 创建Service(jenkins-svc.yaml))
    • [7. 部署所有资源](#7. 部署所有资源)
    • [8. 验证Jenkins Pod状态和PVC绑定](#8. 验证Jenkins Pod状态和PVC绑定)
  • [四、Jenkins Web-ui配置](#四、Jenkins Web-ui配置)
    • [1. 查看外部访问端口](#1. 查看外部访问端口)
    • [2. 访问ui页面和配置](#2. 访问ui页面和配置)
  • 总结

随着容器化与微服务架构的广泛应用,传统的 CI/CD 系统面临着可扩展性与高可用性的挑战。Jenkins 作为最主流的持续集成工具,其本身具备强大的插件生态与灵活的任务配置能力。为了更好地支持动态扩缩容、资源隔离与自动化运维,本文将介绍如何在 Kubernetes 环境中部署 Jenkins,并结合持久化存储与流水线实践,构建一个稳定、高可用、可扩展的 CI/CD 平台。

一、Jenkins简介

Jenkins 是一款开源的自动化持续集成与持续交付(CI/CD)工具,拥有丰富的插件生态和高度可配置的流水线系统。它能够帮助开发团队实现自动化构建、测试、打包、部署等流程,从而提高开发效率与软件交付质量。

得益于其良好的可扩展性和与主流版本控制、构建工具、容器平台(如 Docker、Kubernetes)的高度兼容,Jenkins 已成为 DevOps 实践中的核心工具之一。通过与 Kubernetes 集成,Jenkins 可以动态调度构建任务至集群中的 Pod 中运行,实现弹性伸缩与资源隔离,适用于构建大规模分布式的 CI/CD 系统。

二、Jenkins自定义镜像构建

Jenkins 官方镜像提供了基本功能,但在生产环境中通常还需要预装 Maven、Docker CLI、kubectl、Node.js 等工具,因此推荐构建自定义 Jenkins 镜像

1. Dockerfile示例(大家根据自己情况来进行修改)

bash 复制代码
FROM jenkins/jenkins:lts

USER root

# 预装 Jenkins 插件
RUN jenkins-plugin-cli --plugins timestamper antisamy-markup-formatter workflow-aggregator pipeline-stage-view

# 复制 Maven 压缩包并解压
COPY apache-maven-3.8.8-bin.tar.gz /opt/
RUN tar -xzvf /opt/apache-maven-3.8.8-bin.tar.gz -C /opt && \
    ln -s /opt/apache-maven-3.8.8 /opt/maven && \
    rm -f /opt/apache-maven-3.8.8-bin.tar.gz

# 配置 Maven 环境变量
ENV MAVEN_HOME=/opt/maven
ENV PATH="$MAVEN_HOME/bin:$PATH"

# 验证 Maven 版本
RUN mvn -version

# 替换settings.xml文件
COPY settings.xml /opt/apache-maven-3.8.8/conf/settings.xml

# 复制 Node.js 压缩包并解压
COPY node-v16.10.0-linux-x64.tar.gz /usr/local/
RUN tar -xzvf /usr/local/node-v16.10.0-linux-x64.tar.gz -C /usr/local && \
    ln -s /usr/local/node-v16.10.0-linux-x64 /usr/local/node && \
    ln -s /usr/local/node/bin/node /usr/bin/node && \
    ln -s /usr/local/node/bin/npm /usr/bin/npm && \
    ln -s /usr/local/node/bin/npx /usr/bin/npx && \
    rm -f /usr/local/node-v16.10.0-linux-x64.tar.gz

# 安装 Yarn
RUN npm install -g yarn && \
    ln -s $(npm root -g)/yarn/bin/yarn /usr/bin/yarn && \
    yarn -v

# 安装JDK8
COPY jdk-8u181-linux-x64.tar.gz /usr/local/
RUN tar -xzvf /usr/local/jdk-8u181-linux-x64.tar.gz -C /usr/local/ && mv /usr/local/jdk1.8.0_181 /usr/local/jdk8

USER jenkins

2. 构建镜像并推送仓库

这里我已经构建过相同的镜像并推送到仓库了,所以速度很快

bash 复制代码
docker build -t jenkins:v1.1 .
docker tag jenkins:v1.1 harbor.local/k8s/jenkins:v1.1
docker push harbor.local/k8s/jenkins:v1.1

三、Jenkins实战部署

1. 创建Namespace(cicd-namespace.yaml)

创建一个名为 cicd 的命名空间,用于逻辑上隔离 CI/CD 相关资源,便于管理、权限控制和资源统计。所有 Jenkins 的资源后续都会部署在这个命名空间中

yaml 复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: cicd

2. 创建ServiceAccount(jenkins-serviceaccount.yaml)

为 Jenkins Pod 创建一个服务账号 jenkins-sa,后续绑定 RBAC 权限使用。这个账号将授予 Jenkins 在 Kubernetes 集群中执行操作的权限(如:创建 Pod、获取资源等),以支持动态创建构建 Pod 或访问集群资源

yaml 复制代码
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-sa
  namespace: cicd

3. 创建ClusterRoleBinding(jenkins-clusterrolebinding.yaml)

将上面创建的服务账号jenkins-sa绑定到集群管理员角色cluster-admin,使 Jenkins 拥有集群级别的权限,能够进行比如创建 Pod、获取节点信息、执行部署等操作

yaml 复制代码
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-sa-cluster
subjects:
- kind: ServiceAccount
  name: jenkins-sa
  namespace: cicd
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

4. 创建PersistentVolumeClaim(jenkins-pvc.yaml)

为 Jenkins 数据(尤其是/var/jenkins_home)持久化提供存储。使用 ReadWriteMany 是为了支持多副本读写(即将来支持 HA),这里使用的是 NFS 类型的 StorageClass。PVC 保证 Jenkins 重启后数据不会丢失,例如插件配置、流水线定义、构建历史等

yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: cicd
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 3Gi
  storageClassName: nfs-storage  # StorageClass存储类名称

5. 创建Deployment(jenkins-deploy.yaml)

部署 Jenkins 实例并挂载持久化存储

yaml 复制代码
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: cicd
spec:
  replicas: 1  #实例数为1(后续可扩展为HA)
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins-sa  #使用前面创建的ServiceAccount
      affinity:
        nodeAffinity:  #这里做了节点亲和性,指定调度到node1节点
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            preference:
              matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node1
      containers:
      - name: jenkins
        image: harbor.local/k8s/jenkins:v1.0  #使用自定义镜像
        imagePullPolicy: Always
        ports:
        - containerPort: 8080  #Web-ui端口
          name: web
          protocol: TCP
        - containerPort: 50000  #Agent连接端口
          name: agent
          protocol: TCP
        resources:
          limits:
            cpu: 2000m
            memory: 2Gi
          requests:
            cpu: 1000m
            memory: 1Gi
        livenessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 120
          timeoutSeconds: 10
          failureThreshold: 12
        readinessProbe:
          httpGet:
            path: /login
            port: 8080
          initialDelaySeconds: 120
          timeoutSeconds: 10
          failureThreshold: 12
        volumeMounts:
        - name: jenkins-volume
          subPath: jenkins-home
          mountPath: /var/jenkins_home
      volumes:
      - name: jenkins-volume
        persistentVolumeClaim:
          claimName: jenkins-pvc  #使用PVC持久化Jenkins数据

6. 创建Service(jenkins-svc.yaml)

通过 NodePort 暴露 Jenkins UI 与 Agent 通信端口

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: cicd
  labels:
    app: jenkins
spec:
  selector:
    app: jenkins
  type: NodePort  #使用NodePort暴露端口,便于外部访问
  ports:
  - name: web
    port: 8080
    targetPort: web  #容器中定义的端口名
    nodePort: 30089
  - name: agent
    port: 50000
    targetPort: agent

7. 部署所有资源

将上述 YAML 文件保存后,使用以下命令统一部署

bash 复制代码
kubectl apply -f cicd-namespace.yaml
kubectl apply -f jenkins-serviceaccount.yaml
kubectl apply -f jenkins-clusterrolebinding.yaml
kubectl apply -f jenkins-pvc.yaml
kubectl apply -f jenkins-deploy.yaml
kubectl apply -f jenkins-svc.yaml

8. 验证Jenkins Pod状态和PVC绑定

bash 复制代码
kubectl get pod -n cicd
kubcetl get pvc -n cicd

四、Jenkins Web-ui配置

1. 查看外部访问端口

bash 复制代码
kubectl get svc -n cicd

2. 访问ui页面和配置

访问地址:http://ip:30089


安装推荐插件即可







总结

🚀 本文详细介绍了在 Kubernetes 环境中部署 Jenkins 的流程,包括自定义镜像构建、权限配置、持久化卷挂载和服务暴露,为后续实现自动化 CI/CD 奠定基础。

👉 在下一篇中,我们将基于该部署环境,介绍如何使用 Jenkins 构建流水线,实现自动构建与部署。

相关推荐
咸鱼求放生1 小时前
验证es启动成功
大数据·elasticsearch·jenkins
默心4 小时前
jenkins配置多nexus仓库多maven版本
servlet·jenkins·maven
AllData公司负责人6 小时前
【能力比对】K8S数据平台VS数据平台
云原生·容器·kubernetes
识途老码7 小时前
k8s部署OpenELB
云原生·容器·kubernetes·eip
hwj运维之路8 小时前
基于k8s的Jenkins CI/CD平台部署实践(二):流水线构建与自动部署全流程
ci/cd·kubernetes·jenkins
Super_man541888 小时前
k8s之ingress解释以及k8s创建业务的流程定义
云原生·容器·kubernetes
木二_9 小时前
实践004-Gitlab CICD部署应用
ci/cd·gitlab·devops
Python测试之道11 小时前
K8s ConfigMap实战:像设置手机一样管理配置!
容器·智能手机·kubernetes
开心码农1号12 小时前
如何理解k8s中的controller
docker·容器·kubernetes