🐇明明跟你说过:个人主页
🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、Jenkins简介
Jenkins 是一个开源的自动化服务器,主要用于持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)。它由Sun Microsystems的前员工在2004年左右开发,最初命名为Hudson。后来由于一些商标争议,项目改名为Jenkins,并且迅速成为构建、测试和部署软件项目的流行工具。
Jenkins的主要特点包括:
- 持续集成与持续交付:Jenkins可以自动监控版本控制系统中的代码变更,触发构建过程,运行测试,并根据结果决定是否部署到生产环境。这有助于快速发现集成问题并缩短开发周期。
- 插件生态系统:Jenkins拥有庞大的插件库,支持几乎所有现代软件开发中可能用到的工具和技术,比如Git、Maven、Gradle等。
- 易于扩展:由于Jenkins是基于Java编写的,因此它非常灵活,用户可以通过编写自定义脚本或插件来扩展其功能。
- 分布式构建:Jenkins支持通过“主从”架构进行分布式构建,允许将构建任务分配给多个节点,以提高效率和资源利用率。
- 图形化界面:Jenkins提供了直观的Web界面,使得配置和管理CI/CD流程变得简单。
- Pipeline即代码:Jenkins Pipeline是一个特性集,它允许用户定义其CI/CD流程为代码的形式(通常使用Groovy语言),这样可以将其纳入版本控制,并与其他团队成员共享。
- 安全性:Jenkins提供了一些安全特性和认证机制,确保只有授权用户才能执行特定的操作。
- 社区和支持:作为一个开源项目,Jenkins有一个活跃的社区,提供文档、论坛讨论以及第三方服务和支持。
2、k8s简介
Kubernetes(通常简写为K8s)是一个开源平台,用于自动化部署、扩展和管理容器化的应用程序。它最初由Google设计并开发,并于2014年捐赠给了云原生计算基金会(CNCF)。Kubernetes提供了强大的机制来管理分布式系统中的应用,使其能够在物理机或虚拟机集群上运行。
特性
- 自动化容器编排:自动重启失败的容器、替换和重新调度容器、水平扩展容器等。
- 自我修复:如果某个节点故障,Kubernetes会自动将该节点上的工作负载迁移到其他健康的节点上。
- 横向扩展:通过简单的命令、用户界面或者基于CPU使用情况自动调整应用的规模。
- 服务发现与负载均衡:无需修改代码即可实现服务之间的通信,Kubernetes为容器提供了自己的IP地址以及一个DNS名称,并且可以负载均衡分配到容器上。
- 自动发布与回滚:逐步发布新的版本,同时监视应用健康状况,如有问题则自动回滚更改。
- 密钥与配置管理:让您可以轻松地管理和分发密码、OAuth令牌和其他敏感数据,而无需重建镜像。
3、什么在k8s中部署Jenkins
在Kubernetes(简称K8s)中部署Jenkins,可以带来许多好处,尤其是对于那些需要高效、可扩展和可靠的持续集成/持续交付(CI/CD)流程的企业或团队。
1. 动态资源管理
- 想象一下,你有一家餐厅,有时候客人很多,有时候客人很少。如果每次客人都很多时,你都需要临时雇佣更多的服务员,而当客人少时又得解雇他们,这样不仅麻烦还浪费资源。而在Kubernetes中部署Jenkins就像是有一个智能管理系统,它可以根据当前的工作负载自动调整所需的服务员数量(即Jenkins构建节点)。当有很多构建任务时,系统会自动增加更多“服务员”来帮忙;反之,则减少“服务员”,从而更有效地利用资源。
2. 提高可靠性和容错能力
- 如果你的餐厅只有一个厨房,一旦这个厨房出现问题,整个餐厅就无法正常运营了。同样,在传统设置下,如果Jenkins主节点出现故障,所有的构建任务都会停止。但在Kubernetes环境中,即使一个节点出问题,其他健康的节点可以立即接管工作,确保服务不间断。
3. 快速响应变化
- 假设你的餐厅突然接到一个大型宴会订单,你需要快速准备好额外的食物和服务。有了Kubernetes的帮助,Jenkins可以迅速扩展其处理能力,就像瞬间增加了多个厨房一样,以应对突如其来的大量工作。完成后,还可以快速缩减规模,节省成本。
4. 统一环境
- 无论是在家中准备食物还是在商业厨房里烹饪,保持一致的食谱和做法是非常重要的。将Jenkins部署到Kubernetes上,意味着你可以确保开发、测试和生产环境尽可能地相似,避免由于环境差异导致的问题。
二、准备工作
1、准备k8s集群
这里我们用的k8s版本为 1.23.1,大家也可以使用其他的k8s发行版本,如果还未安装k8s请参考下面的文章。
《深度解析:Kubernetes 1.28.2集群安装过程中的关键步骤》
2、Jenkins官方镜像版本介绍
官方镜像的推荐
- Jenkins官方推荐使用 jenkinsci/blueocean 这个镜像。与直接下载Jenkins的镜像相比,Blue Ocean镜像提供了更为现代和直观的用户界面,使得Jenkins的使用和管理变得更加容易。因此,对于新用户或者希望简化Jenkins使用的用户来说,推荐使用jenkinsci/blueocean镜像。
镜像版本标签
Jenkins官方镜像在Docker Hub上提供了多个版本标签,以便用户选择。以下是一些常见的版本标签:
- latest:表示最新版本的Jenkins,包括最新的功能和安全更新。然而,由于它是最新的版本,可能存在一些未知的问题或不稳定因素。
- lts:表示长期支持版本的Jenkins,通常更稳定且经过更多的测试。它适合用于生产环境,因为提供了更多的安全更新和稳定性修复。
- 具体版本号:例如2.401.1、1.24.1-bcc31d32159f等,表示特定版本的Jenkins。用户可以根据自己的需求选择特定的版本号。
3、Jenkins镜像准备
这里我们使用的Jenkins版本为2.410,镜像我放在个人资源中了,大家也可以自行下载或使用其他的发行版本。
上传至worker节点后,执行下面的命令解压
docker load -i jenkins-2.410.tar.gz
如果k8s版本大于1.23,则执行下面的命令
ctr -n=k8s.io images import jenkins2.410
三、在Kubernetes中部署Jenkins
1、准备存储资源
我们准备一个PVC,将Jenkins的数据持久化到当中,以免pod漂移到其他节点后,历史数据丢失。
下面简单介绍下如何创建PVC,更详细的可以参考《k8s PV与PVC持久化存储详解与实际应用分享》这篇文章
首先准备一个NFS共享目录
yum install nfs-utils -y
systemctl enable nfs --now
mkdir /data/jenkins -p
vim /etc/exports
# 添加下面的内容
/data/jenkins *(rw,no_root_squash)
#保存、退出
exportfs -arv
创建一个名称空间,用于部署Jenkins
kubectl create namespace jenkins-k8s
编写pv的yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-k8s-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.40.181
path: /data/jenkins
- kind: PersistentVolume:定义了这个资源对象的类型是一个PersistentVolume(持久卷)。PersistentVolume是集群中的一段存储,它独立于Pod的生命周期而存在。
- metadata: 开始元数据部分,这里包含了资源对象的一些基本信息。
- name: jenkins-k8s-pv:给这个PersistentVolume指定一个名称,这里是jenkins-k8s-pv。在Kubernetes集群中,每个资源对象都需要一个唯一的名称。
- spec::开始定义PersistentVolume的具体规格和配置。
-
capacity::定义了这个持久卷的容量。
- storage: 10Gi:指定了持久卷的存储大小为10GiB(Gibibytes)。
- accessModes::描述了持久卷可以被访问的方式或模式。
- - ReadWriteMany:表示这个卷可以被多个节点同时以读写方式挂载。其他可能的访问模式包括ReadWriteOnce(只能由一个节点以读写方式挂载)和ReadOnlyMany(可以被多个节点以只读方式挂载)。
-
capacity::定义了这个持久卷的容量。
- nfs::指定了这个持久卷使用NFS(网络文件系统)作为其后端存储机制。
- server: 192.168.40.181:指定了NFS服务器的IP地址,这里是192.168.40.181。
- path: /data/jenkins:指定了NFS服务器上共享的路径,即实际存储数据的位置,在这个例子中是/data/jenkins。
创建PV
kubectl apply -f pv.yaml
编写创建PVC的yaml文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-k8s-pvc
namespace: jenkins-k8s
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteMany
创建PVC
kubectl apply -f pvc.yaml
2、准备账号
创建sa账号
kubectl create sa jenkins-k8s-sa -n jenkins-k8s
进行RBAC授权
kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa
3、部署Jenkins
准备yaml文件
kind: Deployment
apiVersion: apps/v1
metadata:
name: jenkins
namespace: jenkins-k8s
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
serviceAccount: jenkins-k8s-sa
containers:
- name: jenkins
image: jenkins/jenkins:2.410
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: web
protocol: TCP
- containerPort: 50000
name: agent
protocol: TCP
resources:
limits:
cpu: 2000m
memory: 2Gi
requests:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
readinessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
volumeMounts:
- name: jenkins-volume
subPath: jenkins-home
mountPath: /var/jenkins_home
volumes:
- name: jenkins-volume
persistentVolumeClaim:
claimName: jenkins-k8s-pvc
部署Jenkins
kubectl apply -f jenkins-deployment.yaml
4、创建Service
部署成功后,创建一个service,以供外部访问
编写yaml文件
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: jenkins-k8s
labels:
app: jenkins
spec:
selector:
app: jenkins
type: NodePort
ports:
- name: web
port: 8080
targetPort: web
nodePort: 30089
- name: agent
port: 50000
targetPort: agent
创建service
kubectl apply -f service.yaml
5、访问测试
浏览器输入worker节点的IP+30089端口,如果显示下面的页面,证明部署成功
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Docker的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!