在?k8s?中部署Jenkins的實(shí)踐指南(最新推薦)
一、引言
1、Jenkins簡(jiǎn)介
Jenkins 是一個(gè)開(kāi)源的自動(dòng)化服務(wù)器,主要用于持續(xù)集成(Continuous Integration, CI)和持續(xù)交付(Continuous Delivery, CD)。它由Sun Microsystems的前員工在2004年左右開(kāi)發(fā),最初命名為Hudson。后來(lái)由于一些商標(biāo)爭(zhēng)議,項(xiàng)目改名為Jenkins,并且迅速成為構(gòu)建、測(cè)試和部署軟件項(xiàng)目的流行工具。
Jenkins的主要特點(diǎn)包括:
- 持續(xù)集成與持續(xù)交付:Jenkins可以自動(dòng)監(jiān)控版本控制系統(tǒng)中的代碼變更,觸發(fā)構(gòu)建過(guò)程,運(yùn)行測(cè)試,并根據(jù)結(jié)果決定是否部署到生產(chǎn)環(huán)境。這有助于快速發(fā)現(xiàn)集成問(wèn)題并縮短開(kāi)發(fā)周期。
- 插件生態(tài)系統(tǒng):Jenkins擁有龐大的插件庫(kù),支持幾乎所有現(xiàn)代軟件開(kāi)發(fā)中可能用到的工具和技術(shù),比如Git、Maven、Gradle等。
- 易于擴(kuò)展:由于Jenkins是基于Java編寫(xiě)的,因此它非常靈活,用戶(hù)可以通過(guò)編寫(xiě)自定義腳本或插件來(lái)擴(kuò)展其功能。
- 分布式構(gòu)建:Jenkins支持通過(guò)“主從”架構(gòu)進(jìn)行分布式構(gòu)建,允許將構(gòu)建任務(wù)分配給多個(gè)節(jié)點(diǎn),以提高效率和資源利用率。
- 圖形化界面:Jenkins提供了直觀的Web界面,使得配置和管理CI/CD流程變得簡(jiǎn)單。
- Pipeline即代碼:Jenkins Pipeline是一個(gè)特性集,它允許用戶(hù)定義其CI/CD流程為代碼的形式(通常使用Groovy語(yǔ)言),這樣可以將其納入版本控制,并與其他團(tuán)隊(duì)成員共享。
- 安全性:Jenkins提供了一些安全特性和認(rèn)證機(jī)制,確保只有授權(quán)用戶(hù)才能執(zhí)行特定的操作。
- 社區(qū)和支持:作為一個(gè)開(kāi)源項(xiàng)目,Jenkins有一個(gè)活躍的社區(qū),提供文檔、論壇討論以及第三方服務(wù)和支持。

2、k8s簡(jiǎn)介
Kubernetes(通常簡(jiǎn)寫(xiě)為K8s)是一個(gè)開(kāi)源平臺(tái),用于自動(dòng)化部署、擴(kuò)展和管理容器化的應(yīng)用程序。它最初由Google設(shè)計(jì)并開(kāi)發(fā),并于2014年捐贈(zèng)給了云原生計(jì)算基金會(huì)(CNCF)。Kubernetes提供了強(qiáng)大的機(jī)制來(lái)管理分布式系統(tǒng)中的應(yīng)用,使其能夠在物理機(jī)或虛擬機(jī)集群上運(yùn)行。
特性
- 自動(dòng)化容器編排:自動(dòng)重啟失敗的容器、替換和重新調(diào)度容器、水平擴(kuò)展容器等。
- 自我修復(fù):如果某個(gè)節(jié)點(diǎn)故障,Kubernetes會(huì)自動(dòng)將該節(jié)點(diǎn)上的工作負(fù)載遷移到其他健康的節(jié)點(diǎn)上。
- 橫向擴(kuò)展:通過(guò)簡(jiǎn)單的命令、用戶(hù)界面或者基于CPU使用情況自動(dòng)調(diào)整應(yīng)用的規(guī)模。
- 服務(wù)發(fā)現(xiàn)與負(fù)載均衡:無(wú)需修改代碼即可實(shí)現(xiàn)服務(wù)之間的通信,Kubernetes為容器提供了自己的IP地址以及一個(gè)DNS名稱(chēng),并且可以負(fù)載均衡分配到容器上。
- 自動(dòng)發(fā)布與回滾:逐步發(fā)布新的版本,同時(shí)監(jiān)視應(yīng)用健康狀況,如有問(wèn)題則自動(dòng)回滾更改。
- 密鑰與配置管理:讓您可以輕松地管理和分發(fā)密碼、OAuth令牌和其他敏感數(shù)據(jù),而無(wú)需重建鏡像。

3、什么在k8s中部署Jenkins
在Kubernetes(簡(jiǎn)稱(chēng)K8s)中部署Jenkins,可以帶來(lái)許多好處,尤其是對(duì)于那些需要高效、可擴(kuò)展和可靠的持續(xù)集成/持續(xù)交付(CI/CD)流程的企業(yè)或團(tuán)隊(duì)。
1. 動(dòng)態(tài)資源管理
想象一下,你有一家餐廳,有時(shí)候客人很多,有時(shí)候客人很少。如果每次客人都很多時(shí),你都需要臨時(shí)雇傭更多的服務(wù)員,而當(dāng)客人少時(shí)又得解雇他們,這樣不僅麻煩還浪費(fèi)資源。而在Kubernetes中部署Jenkins就像是有一個(gè)智能管理系統(tǒng),它可以根據(jù)當(dāng)前的工作負(fù)載自動(dòng)調(diào)整所需的服務(wù)員數(shù)量(即Jenkins構(gòu)建節(jié)點(diǎn))。當(dāng)有很多構(gòu)建任務(wù)時(shí),系統(tǒng)會(huì)自動(dòng)增加更多“服務(wù)員”來(lái)幫忙;反之,則減少“服務(wù)員”,從而更有效地利用資源。
2. 提高可靠性和容錯(cuò)能力
如果你的餐廳只有一個(gè)廚房,一旦這個(gè)廚房出現(xiàn)問(wèn)題,整個(gè)餐廳就無(wú)法正常運(yùn)營(yíng)了。同樣,在傳統(tǒng)設(shè)置下,如果Jenkins主節(jié)點(diǎn)出現(xiàn)故障,所有的構(gòu)建任務(wù)都會(huì)停止。但在Kubernetes環(huán)境中,即使一個(gè)節(jié)點(diǎn)出問(wèn)題,其他健康的節(jié)點(diǎn)可以立即接管工作,確保服務(wù)不間斷。
3. 快速響應(yīng)變化
假設(shè)你的餐廳突然接到一個(gè)大型宴會(huì)訂單,你需要快速準(zhǔn)備好額外的食物和服務(wù)。有了Kubernetes的幫助,Jenkins可以迅速擴(kuò)展其處理能力,就像瞬間增加了多個(gè)廚房一樣,以應(yīng)對(duì)突如其來(lái)的大量工作。完成后,還可以快速縮減規(guī)模,節(jié)省成本。
4. 統(tǒng)一環(huán)境
無(wú)論是在家中準(zhǔn)備食物還是在商業(yè)廚房里烹飪,保持一致的食譜和做法是非常重要的。將Jenkins部署到Kubernetes上,意味著你可以確保開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境盡可能地相似,避免由于環(huán)境差異導(dǎo)致的問(wèn)題。

二、準(zhǔn)備工作
1、準(zhǔn)備k8s集群
這里我們用的k8s版本為 1.23.1,大家也可以使用其他的k8s發(fā)行版本,如果還未安裝k8s請(qǐng)參考下面的文章。
《在Centos中搭建 K8s 1.23 集群超詳細(xì)講解》
《深度解析:Kubernetes 1.28.2集群安裝過(guò)程中的關(guān)鍵步驟》

2、Jenkins官方鏡像版本介紹
官方鏡像的推薦
Jenkins官方推薦使用 jenkinsci/blueocean 這個(gè)鏡像。與直接下載Jenkins的鏡像相比,Blue Ocean鏡像提供了更為現(xiàn)代和直觀的用戶(hù)界面,使得Jenkins的使用和管理變得更加容易。因此,對(duì)于新用戶(hù)或者希望簡(jiǎn)化Jenkins使用的用戶(hù)來(lái)說(shuō),推薦使用jenkinsci/blueocean鏡像。
鏡像版本標(biāo)簽
Jenkins官方鏡像在Docker Hub上提供了多個(gè)版本標(biāo)簽,以便用戶(hù)選擇。以下是一些常見(jiàn)的版本標(biāo)簽:
- latest:表示最新版本的Jenkins,包括最新的功能和安全更新。然而,由于它是最新的版本,可能存在一些未知的問(wèn)題或不穩(wěn)定因素。
- lts:表示長(zhǎng)期支持版本的Jenkins,通常更穩(wěn)定且經(jīng)過(guò)更多的測(cè)試。它適合用于生產(chǎn)環(huán)境,因?yàn)樘峁┝烁嗟陌踩潞头€(wěn)定性修復(fù)。
- 具體版本號(hào):例如2.401.1、1.24.1-bcc31d32159f等,表示特定版本的Jenkins。用戶(hù)可以根據(jù)自己的需求選擇特定的版本號(hào)。

3、Jenkins鏡像準(zhǔn)備
這里我們使用的Jenkins版本為2.410,鏡像我放在個(gè)人資源中了,大家也可以自行下載或使用其他的發(fā)行版本。
上傳至worker節(jié)點(diǎn)后,執(zhí)行下面的命令解壓
docker load -i jenkins-2.410.tar.gz
如果k8s版本大于1.23,則執(zhí)行下面的命令
ctr -n=k8s.io images import jenkins2.410
三、在Kubernetes中部署Jenkins
1、準(zhǔn)備存儲(chǔ)資源
我們準(zhǔn)備一個(gè)PVC,將Jenkins的數(shù)據(jù)持久化到當(dāng)中,以免pod漂移到其他節(jié)點(diǎn)后,歷史數(shù)據(jù)丟失。
下面簡(jiǎn)單介紹下如何創(chuàng)建PVC,更詳細(xì)的可以參考《k8s PV與PVC持久化存儲(chǔ)詳解與實(shí)際應(yīng)用分享》這篇文章
首先準(zhǔn)備一個(gè)NFS共享目錄
yum install nfs-utils -y systemctl enable nfs --now mkdir /data/jenkins -p vim /etc/exports # 添加下面的內(nèi)容 /data/jenkins *(rw,no_root_squash) #保存、退出 exportfs -arv
創(chuàng)建一個(gè)名稱(chēng)空間,用于部署Jenkins
kubectl create namespace jenkins-k8s
編寫(xiě)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:定義了這個(gè)資源對(duì)象的類(lèi)型是一個(gè)PersistentVolume(持久卷)。PersistentVolume是集群中的一段存儲(chǔ),它獨(dú)立于Pod的生命周期而存在。
- metadata: 開(kāi)始元數(shù)據(jù)部分,這里包含了資源對(duì)象的一些基本信息。
- name: jenkins-k8s-pv:給這個(gè)PersistentVolume指定一個(gè)名稱(chēng),這里是jenkins-k8s-pv。在Kubernetes集群中,每個(gè)資源對(duì)象都需要一個(gè)唯一的名稱(chēng)。
- spec::開(kāi)始定義PersistentVolume的具體規(guī)格和配置。
- capacity::定義了這個(gè)持久卷的容量。
- storage: 10Gi:指定了持久卷的存儲(chǔ)大小為10GiB(Gibibytes)。
- capacity::定義了這個(gè)持久卷的容量。
- accessModes::描述了持久卷可以被訪(fǎng)問(wèn)的方式或模式。
- - ReadWriteMany:表示這個(gè)卷可以被多個(gè)節(jié)點(diǎn)同時(shí)以讀寫(xiě)方式掛載。其他可能的訪(fǎng)問(wèn)模式包括ReadWriteOnce(只能由一個(gè)節(jié)點(diǎn)以讀寫(xiě)方式掛載)和ReadOnlyMany(可以被多個(gè)節(jié)點(diǎn)以只讀方式掛載)。
- nfs::指定了這個(gè)持久卷使用NFS(網(wǎng)絡(luò)文件系統(tǒng))作為其后端存儲(chǔ)機(jī)制。
- server: 192.168.40.181:指定了NFS服務(wù)器的IP地址,這里是192.168.40.181。
- path: /data/jenkins:指定了NFS服務(wù)器上共享的路徑,即實(shí)際存儲(chǔ)數(shù)據(jù)的位置,在這個(gè)例子中是/data/jenkins。
創(chuàng)建PV
kubectl apply -f pv.yaml

編寫(xiě)創(chuàng)建PVC的yaml文件
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jenkins-k8s-pvc
namespace: jenkins-k8s
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteMany創(chuàng)建PVC
kubectl apply -f pvc.yaml

2、準(zhǔn)備賬號(hào)
創(chuàng)建sa賬號(hào)
kubectl create sa jenkins-k8s-sa -n jenkins-k8s
進(jìn)行RBAC授權(quán)
kubectl create clusterrolebinding jenkins-k8s-sa-cluster -n jenkins-k8s --clusterrole=cluster-admin --serviceaccount=jenkins-k8s:jenkins-k8s-sa
3、部署Jenkins
準(zhǔn)備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、創(chuàng)建Service
部署成功后,創(chuàng)建一個(gè)service,以供外部訪(fǎng)問(wèn)
編寫(xiě)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創(chuàng)建service
kubectl apply -f service.yaml
5、訪(fǎng)問(wèn)測(cè)試
瀏覽器輸入worker節(jié)點(diǎn)的IP+30089端口,如果顯示下面的頁(yè)面,證明部署成功

到此這篇關(guān)于在 k8s 中部署Jenkins的實(shí)踐指南的文章就介紹到這了,更多相關(guān)k8s部署Jenkins內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
二進(jìn)制方式安裝?Kubernetes1.18.3版本實(shí)現(xiàn)腳本
這篇文章主要為大家介紹了二進(jìn)制方式安裝Kubernetes1.18.3版本實(shí)現(xiàn)腳本,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
kubernetes部署dashboard及應(yīng)用小結(jié)
Dashboard?是基于網(wǎng)頁(yè)的?Kubernetes?用戶(hù)界面,可以對(duì)?Deployment?實(shí)現(xiàn)彈性伸縮、發(fā)起滾動(dòng)升級(jí)、重啟?Pod?或者使用向?qū)?chuàng)建新的應(yīng)用,這篇文章主要介紹了kubernetes部署dashboard,需要的朋友可以參考下2024-06-06
Linux安裝Kubernetes(k8s)超詳細(xì)教程
Kubernetes是一個(gè)輕便的和可擴(kuò)展的開(kāi)源平臺(tái),用于管理容器化應(yīng)用和服務(wù),通過(guò)Kubernetes能夠進(jìn)行應(yīng)用的自動(dòng)化部署和擴(kuò)縮容,這篇文章主要給大家介紹了關(guān)于Linux安裝Kubernetes(k8s)的相關(guān)資料,需要的朋友可以參考下2024-07-07
Windows下安裝并使用kubectl查看K8S日志的操作方法
本文給大家介紹Windows下安裝并使用kubectl查看K8S日志的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友安康下吧2025-06-06
Kubernetes Dashboard 配置用戶(hù)名密碼方式登錄操作流程
為了K8s集群安全,默認(rèn)情況下Dashboard以Token的形式登錄的,那如果我們想以用戶(hù)名/密碼的方式登錄該怎么操作呢?其實(shí)只需要我們創(chuàng)建用戶(hù)并進(jìn)行 ClusterRoleBinding綁定即可,下面給大家分享Kubernetes Dashboard 配置用戶(hù)名密碼方式登錄操作流程,感興趣的朋友一起看看吧2024-06-06
K8S使用NFS動(dòng)態(tài)創(chuàng)建PVC實(shí)踐
本文介紹了兩種使用NFS作為K8S中容器數(shù)據(jù)持久化后端存儲(chǔ)的方法,并在產(chǎn)線(xiàn)環(huán)境中進(jìn)行了驗(yàn)證,第一種方法使用了nfs-client-provisioner,第二種方法使用了csi-nfs-driver,兩種方法均通過(guò)動(dòng)態(tài)創(chuàng)建PVC實(shí)現(xiàn)數(shù)據(jù)持久化,并驗(yàn)證了文件的讀寫(xiě)能力2026-03-03

