K8S部署安裝Jenkins全過程
1.Jenkins Kubernetes 清單文件
此處使用的所有 Jenkins Kubernetes 清單文件都托管在 GitHub 上。
克隆存儲庫。
[root@master test]# git clone https://github.com/scriptcamp/kubernetes-jenkins 正克隆到 'kubernetes-jenkins'... remote: Enumerating objects: 16, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (7/7), done. remote: Total 16 (delta 1), reused 0 (delta 0), pack-reused 9 接收對象中: 100% (16/16), 完成. 處理 delta 中: 100% (1/1), 完成 root@master test]# cd kubernetes-jenkins/ [root@master kubernetes-jenkins]# ls deployment.yaml namespace.yaml README.md serviceAccount.yaml service.yaml volume.yaml
2.Kubernetes Jenkins 部署
讓我們開始在 Kubernetes 上部署 Jenkins。
1、為 Jenkins 創(chuàng)建 Namespace
最好將所有DevOps工具分類為與其他應(yīng)用程序分開的命名空間。
[root@master kubernetes-jenkins]# kubectl create namespace devops-tools namespace/devops-tools created #查看空間名 [root@master jenkins]# kubectl get namespaces NAME STATUS AGE default Active 6d devops-tools Active 58m ingress-nginx Active 4d23h jenkins Active 3d18h kube-flannel Active 6d kube-node-lease Active 6d kube-public Active 6d kube-system Active 6d [root@master jenkins]
2、創(chuàng)建“serviceAccount.yaml”文件并復(fù)制以下管理員服務(wù)帳戶清單
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: jenkins-admin
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin
namespace: devops-tools
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins-admin
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: devops-toolsserviceAccount.yaml’ 創(chuàng)建一個 ‘jenkins-admin’ clusterRole, ‘jenkins-admin’ ServiceAccount,并將 ‘clusterRole’ 綁定到服務(wù)賬戶。
“jenkins-admin”集群角色具有管理集群組件的所有權(quán)限。 您還可以通過指定單個資源操作來限制訪問。
kubectl 創(chuàng)建服務(wù)帳戶。
[root@master kubernetes-jenkins]# kubectl apply -f serviceAccount.yaml clusterrole.rbac.authorization.k8s.io/jenkins-admin created
3、創(chuàng)建“volume.yaml”并復(fù)制以下持久性卷清單
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv-volume
labels:
type: local
spec:
storageClassName: local-storage
claimRef:
name: jenkins-pv-claim
namespace: devops-tools
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1 #替換為任何一個集群工作節(jié)點(diǎn)主機(jī)名
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pv-claim
namespace: devops-tools
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi重要提示:將“node1”替換為任何一個集群工作節(jié)點(diǎn)主機(jī)名。
kubectl 獲取工作節(jié)點(diǎn)主機(jī)名。
[root@master jenkins]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 6d v1.23.12 node1 Ready <none> 6d v1.23.12 node2 Ready <none> 6d v1.23.12
對于卷,我們使用“本地”存儲類進(jìn)行演示。 這意味著,它在“/mnt”位置下的特定節(jié)點(diǎn)中創(chuàng)建一個“PersistentVolume”卷。
由于“本地”存儲類需要節(jié)點(diǎn)選擇器,因此您需要正確指定工作節(jié)點(diǎn)名稱,以便 Jenkins pod 在特定節(jié)點(diǎn)中進(jìn)行調(diào)度。
如果 pod 被刪除或重新啟動,數(shù)據(jù)將保留在節(jié)點(diǎn)卷中。 但是,如果節(jié)點(diǎn)被刪除,您將丟失所有數(shù)據(jù)。
理想情況下,您應(yīng)使用云提供商提供的可用存儲類的持久卷,或者使用集群管理員提供的持久性卷,以在節(jié)點(diǎn)故障時持久化數(shù)據(jù)。
使用 kubectl 創(chuàng)建卷
[root@master kubernetes-jenkins]# kubectl create -f volume.yaml storageclass.storage.k8s.io/local-storage created
4、創(chuàng)建名為“deployment.yaml”的部署文件,并復(fù)制以下部署清單
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: devops-tools
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-server
template:
metadata:
labels:
app: jenkins-server
spec:
securityContext:
fsGroup: 1000
runAsUser: 1000
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: jenkins/jenkins:lts
resources:
limits:
memory: "2Gi"
cpu: "1000m"
requests:
memory: "500Mi"
cpu: "500m"
ports:
- name: httpport
containerPort: 8080
- name: jnlpport
containerPort: 50000
livenessProbe:
httpGet:
path: "/login"
port: 8080
initialDelaySeconds: 90
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 5
readinessProbe:
httpGet:
path: "/login"
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
volumeMounts:
- name: jenkins-data
mountPath: /var/jenkins_home
volumes:
- name: jenkins-data
persistentVolumeClaim:
claimName: jenkins-pv-claim在這個 Jenkins Kubernetes 部署中,我們使用了以下內(nèi)容:
- 1.ecurityContext’,以便 Jenkins pod 能夠?qū)懭氡镜爻志镁怼?/li>
- 2.活動和就緒情況探測,用于監(jiān)視 Jenkins pod 的運(yùn)行狀況。
- 3.基于保存 Jenkins 數(shù)據(jù)路徑“/var/jenkins_home”的本地持久性卷。
如果不需要本地存儲持久卷,可以將部署中的卷定義替換為主機(jī)目錄,如下所示。
volumes:
- name: jenkins-data
emptyDir: \{}1.使用 kubectl 創(chuàng)建部署。
[root@master kubernetes-jenkins]# kubectl apply -f deployment.yaml deployment.apps/jenkins created
2.檢查部署狀態(tài)。
[root@master kubernetes-jenkins]# kubectl get deployments -n devops-tools NAME READY UP-TO-DATE AVAILABLE AGE jenkins 0/1 1 0 9s
3.查看部署詳細(xì)信息。
[root@master kubernetes-jenkins]# kubectl describe deployments --namespace=devops-tools
Name: jenkins
Namespace: devops-tools
CreationTimestamp: Sun, 04 Aug 2024 22:15:18 -0400
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=jenkins-server
Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=jenkins-server
Service Account: jenkins-admin
Containers:
jenkins:
Image: jenkins/jenkins:lts
Ports: 8080/TCP, 50000/TCP
Host Ports: 0/TCP, 0/TCP
Limits:
cpu: 1
memory: 2Gi
Requests:
cpu: 500m
memory: 500Mi
Liveness: http-get http://:8080/login delay=90s timeout=5s period=10s #success=1 #failure=5
Readiness: http-get http://:8080/login delay=60s timeout=5s period=10s #success=1 #failure=3
Environment: <none>
Mounts:
/var/jenkins_home from jenkins-data (rw)
Volumes:
jenkins-data:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: jenkins-pv-claim
ReadOnly: false
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing True ReplicaSetUpdated
OldReplicaSets: <none>
NewReplicaSet: jenkins-b96f7764f (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 14s deployment-controller Scaled up replica set jenkins-b96f7764f to 1
3.使用 Kubernetes 服務(wù)訪問 Jenkins
現(xiàn)在,我們已經(jīng)創(chuàng)建了一個部署。 但是,它無法向外界開放。 為了從外部世界訪問 Jenkins 部署,我們需要創(chuàng)建一個服務(wù)并將其映射到部署。
1.創(chuàng)建“service.yaml”并復(fù)制以下服務(wù)清單
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: devops-tools
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: /
prometheus.io/port: '8080'
spec:
selector:
app: jenkins-server
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 32000在這里,我們使用類型為“NodePort”,它將在端口 32000 上的所有 kubernetes 節(jié)點(diǎn) IP 上公開 Jenkins。
如果您有入口設(shè)置,則可以創(chuàng)建入口規(guī)則來訪問 Jenkins。 此外,如果您在 AWS、Google 或 Azure 云上運(yùn)行集群,則可以將 Jenkins 服務(wù)公開為 Loadbalancer。
2.使用 kubectl 創(chuàng)建 Jenkins 服務(wù)
[root@master kubernetes-jenkins]# kubectl apply -f service.yaml service/jenkins-service created
3.顯示devops-tools所有 Deployme 中的命名空間
[root@master kubernetes-jenkins]# kubectl get deployments -n devops-tools NAME READY UP-TO-DATE AVAILABLE AGE jenkins 0/1 1 0 31s
4.顯示devops-tools所有 Pod 中的命名空間
[root@master kubernetes-jenkins]# kubectl get pods --namespace=devops-tools NAME READY STATUS RESTARTS AGE jenkins-b96f7764f-7zzbn 1/1 Running 0 3m5s
5.運(yùn)行 exec 命令直接從如下所示的位置獲取密碼
kubectl exec -it jenkins-b96f7764f-7zzbn cat /var/jenkins_home/secrets/initialAdminPassword -n devops-tools
4.訪問 Jenkins 儀表板和安裝設(shè)置
瀏覽器輸入:http://<node-ip>:32000
將 管理員賬戶密碼 復(fù)制到對應(yīng)的地方,點(diǎn)擊 繼續(xù)

這里建議點(diǎn)擊 選擇插件來安裝,在點(diǎn)擊 無 ,不安裝任何插件,再點(diǎn)擊 安裝,因?yàn)槲覀儧]有配置鏡像,安裝插件是從外網(wǎng)下載過來的,會比較慢,并且下載的插件可能會出現(xiàn)不兼容等狀況,導(dǎo)致失敗率很高


[進(jìn)入到創(chuàng)建管理員頁面,填寫賬戶信息后 保存并完成

進(jìn)入以下頁面配置 jenkins 的 url ,一般使用默認(rèn)的就行了,保存并完成

可以點(diǎn)擊 開始使用 Jenkins 直接登錄進(jìn)入 Jenkins

總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Rainbond云原生快捷部署生產(chǎn)可用的Gitlab步驟詳解
這篇文章主要為大家介紹了Rainbond云原生快捷部署生產(chǎn)可用的Gitlab步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
kubernetes認(rèn)證鑒權(quán)內(nèi)容淺析
這篇文章主要為大家介紹了kubernetes認(rèn)證鑒權(quán)內(nèi)容淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Kubernetes中根據(jù)Pod IP查找Pod及關(guān)聯(lián)服務(wù)的實(shí)現(xiàn)方式
文章介紹Kubernetes中通過Endpoints、Service選擇器、網(wǎng)絡(luò)策略及節(jié)點(diǎn)IPVS/iptables等方法快速定位Pod與關(guān)聯(lián)Service的技巧,推薦優(yōu)先使用Endpoints并結(jié)合標(biāo)簽匹配,適用于調(diào)試和運(yùn)維場景2025-10-10

