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

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


随着容器化与微服务架构的广泛应用,传统的 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示例(大家根据自己情况来进行修改)

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. 构建镜像并推送仓库

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

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 的资源后续都会部署在这个命名空间中

apiVersion: v1
kind: Namespace
metadata:
  name: cicd

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

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

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-sa
  namespace: cicd

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

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

---
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 重启后数据不会丢失,例如插件配置、流水线定义、构建历史等

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 实例并挂载持久化存储

---
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 通信端口

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 文件保存后,使用以下命令统一部署

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绑定

kubectl get pod -n cicd
kubcetl get pvc -n cicd

在这里插入图片描述

四、Jenkins Web-ui配置

1. 查看外部访问端口

kubectl get svc -n cicd

在这里插入图片描述

2. 访问ui页面和配置

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

在这里插入图片描述
在这里插入图片描述

安装推荐插件即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

🚀 本文详细介绍了在 Kubernetes 环境中部署 Jenkins 的流程,包括自定义镜像构建、权限配置、持久化卷挂载和服务暴露,为后续实现自动化 CI/CD 奠定基础。
👉 在下一篇中,我们将基于该部署环境,介绍如何使用 Jenkins 构建流水线,实现自动构建与部署。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值