基于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 构建流水线,实现自动构建与部署。