部署 Jenkins 的方式有很多种,我这里就演示一种,在 Kubernetes 上部署 Jenkins。
为 Jenkins 创建一个 NamSpace
root@master:~# kubectl create namespace jenkins
准备 yaml 文件。关于 Jenkins 的版本,我这里使用的是 lts 版本,而不是最新的版本。并且我们将 NFS 服务器的 /share/jenkins 目录挂载到了 Jenkins 的 /var/jenkins_vol 目录。
root@master:~# vim jenkins.yaml
root@master:~# cat jenkins.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- name: http-port
containerPort: 8080
- name: jnlp-port
containerPort: 50000
volumeMounts:
- name: jenkins-vol
mountPath: /var/jenkins_vol
volumes:
- name: jenkins-vol
nfs:
server: work2
path: /share/jenkins
在 Jenkins 的 NameSpace 下 apply Jenkins 的 yaml 文件。并确保最终状态(Status)为 Running。
root@master:~# kubectl apply -f jenkins.yaml
deployment.apps/jenkins created
root@master:~# kubectl get pods -n jenkins
NAME READY STATUS RESTARTS AGE
jenkins-844c5d459b-d6gq9 0/1 ContainerCreating 0 2s
root@master:~# kubectl get pods -n jenkins
NAME READY STATUS RESTARTS AGE
jenkins-844c5d459b-d6gq9 1/1 Running 0 2s
为 Jenkins 的 service 准备 yaml 文件。我这里使用的 service 类型为 NodePort。Jenkins 使用了两个端口,所以我们需要为每个端口创建 service。由于 jnlp 端口不需要与外网通信,所以使用了 ClusterIP。
root@master:~# vim jenkins_service.yaml
root@master:~# cat jenkins_service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30008
selector:
app: jenkins
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-jnlp
namespace: jenkins
spec:
type: ClusterIP
ports:
- port: 50000
targetPort: 50000
selector:
app: jenkins
同样使用 apply 的方式创建 service。
root@master:~# kubectl apply -f jenkins_service.yaml
service/jenkins created
service/jenkins-jnlp created
root@master:~# kubectl get service -n jenkins
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins NodePort 192.168.109.226 <none> 8080:30008/TCP 9s
jenkins-jnlp ClusterIP 192.168.213.170 <none> 50000/TCP 9s
通过查看日志,查看 Jenkins 初始密码。 字段就是初始密码的字段。
root@master:~# kubectl get pods -n jenkins
NAME READY STATUS RESTARTS AGE
jenkins-844c5d459b-d6gq9 1/1 Running 0 4m18s
root@master:~# kubectl logs jenkins-844c5d459b-d6gq9 -n jenkins
Running from: /usr/share/jenkins/jenkins.war
webroot: /var/jenkins_home/war
2023-09-03 02:00:21.082+0000 [id=1] INFO winstone.Logger#logInternal: Beginning extraction from war file
2023-09-03 02:00:22.923+0000 [id=1] WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2023-09-03 02:00:23.072+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-10.0.15; built: 2023-04-11T17:25:14.480Z; git: 68017dbd00236bb7e187330d7585a059610f661d; jvm 11.0.20+8
2023-09-03 02:00:23.773+0000 [id=1] INFO o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
... ...
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 (file:/var/jenkins_home/war/WEB-INF/lib/groovy-all-2.4.21.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2023-09-03 02:00:30.839+0000 [id=31] INFO jenkins.install.SetupWizard#init:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
<Password>
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
2023-09-03 02:01:06.043+0000 [id=28] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-09-03 02:01:06.095+0000 [id=22] INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2023-09-03 02:01:06.839+0000 [id=44] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2023-09-03 02:01:06.839+0000 [id=44] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
... ...
现在,我们就可以通过 http://<Node_IP>:30008 来访问我们的 Jenkins 了。这里的端口号,是我们在 Jenkins 的 service 里面定义的 nodePort,如果你在 service 里面的定义与我定义的不一样,这样需要将它改成你配置的端口号。
输入前面 logs 里面的密码,并点击 Continue
选择 Install suggested plugins
正在安装插件
输入管理员用户信息,用户名,密码等待
点击 Save and Finish,保存并完成配置
点击 Start using Jenkins
到这里,我们的 Jenkins 安装就算完成了。
更多安装相关的内容,可以查看:https://www.jenkins.io/zh/doc/book/installing/