在kubernetes环境中部署jenkins,jenkins在持续集成中用的是最多的,但是这里把jenkins部署到kubernetes中的目的是为了在多服务下的一个资源节约,举个例子,我的环境里有一千个服务,然后根据三个环境需要在jenkins里配置三千个job,但是在多个服务部署的时候,如果我的jenkins配置较低就会影响到发布时间,但是我把jenkins部署到kubernetes中,根据kubernetes的伸缩性,当需要发布job时,只需要调度jenkins集群,启动pod即可,发布成功后jenkins的pod在资源回收,不但节约资源,还能多任务同时运行。
因为jenkins中的配置数据是不允许丢失的,所以我们这里使用nfs挂载,把jenkins中的数据保存到nfs中,这样就能避免jenkins重启数据丢失的问题了,可以参考:https://www.wulaoer.org/?p=2714,这里已经做好了nfs并且加入到集群中,下面开始部署jenkins集群。
创建jenkins-pvc
前面已经介绍了pv和pvc,这里我们需要先创建个pv,然后在创建pvc
[root@Mater ~]# cat >jenkins-k8s-pv.yaml<<EOF apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-k8s-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany storageClassName: nfs-storage EOF [root@Mater ~]# cat >jenkins-k8s-pvc.yaml<<EOF kind: PersistentVolumeClaim #创建PVC资源 apiVersion: v1 metadata: name: jenkins-k8s-pvc #PVC的名称 spec: accessModes: #定义对PV的访问模式,代表PV可以被多个PVC以读写模式挂载 - ReadWriteMany resources: #定义PVC资源的参数 requests: #设置具体资源需求 storage: 20Gi #表示申请200MI的空间资源 storageClassName: nfs-storage #指定存储类的名称,就指定上面创建的那个存储类。 EOF [root@Mater ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-18f238d8-c2ab-4c0a-918c-3bf5d654fd1a 20Gi RWX Delete Bound default/jenkins-k8s-pvc nfs-storage 40m pvc-29c5e68b-abd4-4822-a338-440b9e66421e 200Mi RWX Delete Bound default/nginx-pvc nfs-storage 3d21h [root@Mater ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE jenkins-k8s-pvc Bound pvc-18f238d8-c2ab-4c0a-918c-3bf5d654fd1a 20Gi RWX nfs-storage 40m nginx-pvc Bound pvc-29c5e68b-abd4-4822-a338-440b9e66421e 200Mi RWX nfs-storage 3d21h
sa授权
创建完pv和pvc,就可以把jenkins中的master挂载到我们创建的pvc上了,但是创建jenkins之前需要进行授权。这里我使用的是默认命名空间,如果自己想创建指定的命名空间,需要指定一下即可。
[root@Mater ~]# kubectl create sa jenkins-k8s-sa [root@Mater ~]# kubectl create clusterrolebinding jenkins-k8s-sa-cluster --clusterrole=cluster-admin --serviceaccount=default:jenkins-k8s-sa #注意default是默认命名空间,如果想加命名空间需要把default修改后,在jenkins-k8s-sa-cluster后在加一个-n 命名空间 #如果加错了可以直接删除重新添加即可 [root@Mater ~]# kubectl delete clusterrolebinding jenkins-k8s-sa-cluster clusterrolebinding.rbac.authorization.k8s.io "jenkins-k8s-sa-cluster" deleted
创建jenkins
这里需要注意的是,如果你使用的不是默认命名空间需要特别注明。还有就是上面创建的pvc名称。
[root@Mater ~]# cat jenkins-deploy.yaml kind: Deployment apiVersion: apps/v1 metadata: name: jenkins spec: replicas: 1 selector: matchLabels: app: jenkins template: metadata: labels: app: jenkins spec: serviceAccount: jenkins-k8s-sa containers: - name: jenkins image: jenkins/jenkins:2.328 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 name: web protocol: TCP - containerPort: 50000 name: agent protocol: TCP resources: limits: cpu: 1000m memory: 1Gi 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 [root@Mater ~]# kubectl apply -f jenkins-deploy.yaml deployment.apps/jenkins created
创建了jenkins的pod,为了方便直接访问,我们需要给jenkins加一个nodeport,方便直接访问。
[root@Mater ~]# cat jenkins-service.yaml apiVersion: v1 kind: Service metadata: name: jenkins-service labels: app: jenkins spec: selector: app: jenkins type: NodePort ports: - name: web port: 8080 targetPort: web nodePort: 30002 - name: agent port: 50000 targetPort: agent [root@Mater ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins-service NodePort 10.102.54.88 <none> 8080:30002/TCP,50000:30254/TCP 51m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 65d
创建后,就会在nfs中创建文件,这个时候需要稍等一下,jenkins创建成功后,在nfs文件中找到jenkins的挂载目录。
[root@wulaoer.org ~]# cd /nfs/data/default-jenkins-k8s-pvc-pvc-18f238d8-c2ab-4c0a-918c-3bf5d654fd1a/jenkins-home/secrets/ [root@wulaoer.org secrets]# cat initialAdminPassword 74eb0f94edfd4a04935c734c84d3c266
安装成功后,我们需要安装kubernetes插件,让jenkins连接kubernetes后,能够配置pod模版,让jenkins自动创建pod,安装后需要重启。这里还需要安装一下Blue Ocean,方便后期管理job流水线。
jenkins配置连接kubernetes
登录jenkins后,在【系统管理】---【系统配置】最后一行有一个【Cloud】
选择kubernetes,然后保存。
先配置kubernetes,这里要注意如果不是默认的命名空间,一定要和sa中设置的一样。
测试通过,保存并应用即可。并把jenkins的地址添加一下即可。
配置容器
因为slave中需要用到docker,需要这里使用的是宿主机的,利用卷进行挂载。
到此,jenkins集群部署到kubernetes配置完成了,下面就创建一个job,测试一下,是否会在job构建时,起一个新的pod,并且在构建成功后,pod自动回收,这样环境就是我们需要的了。
创建job
我这里为了简单,就直接执行一个shell命令,不会的可以看看pipeline的使用方法,后期有时间也会单独写一章关于pipeline是如何使用的。我这里创建了一个test job,只执行这段即可。其他的都不做配置,我这里创建的是流水线。
node('testhan') { //node()不写,不会指定jenkins标签的节点 sh 'sleep 200' }
这里的testhan是我构建slave的pod标签,一定要和设置的一样,要不执行不了。创建成功后我多执行几个。
这里是创建job时增加的节点,也就是新创建的pod。
[root@Mater ~]# kubectl get pod NAME READY STATUS RESTARTS AGE centos7 1/1 Running 5 (5h25m ago) 37d jenkins-cdf9869f6-mmgm7 1/1 Running 0 3h6m nfs-client-provisioner-7949fd6786-8wszc 1/1 Running 173 (77m ago) 3d23h redis-leader-d6b84c8c5-gwqbm 1/1 Running 3 (5h25m ago) 9d test-6l8dm 2/2 Running 0 2m1s test-7319x 0/2 ContainerCreating 0 29s test-h4ws2 2/2 Running 0 30s test-kq8h3 2/2 Running 0 48s test-nc6p5 2/2 Running 0 3m27s test-xs7ts 0/2 Pending 0 18s test-z54s7 2/2 Running 0 58s [root@Mater ~]# kubectl get pod --show-labels | grep testhan test-sdnn3 2/2 Running 0 9s jenkins/label-digest=ea530a482329fd24c70bf97789d7079206c561d3,jenkins/label=testhan,jenkins=slave
前面设置的标签是pod的标签不是node节点的标签,这个标签是可以随意定义的,至此,jenkins的集群构建方法测试结束,这里说明一下test开头的pod不需要在意,这个是在设置的时候定义的,也可以进行修改,但是在pipeline中定义的项目打包等等操作都是在pipeline里定义好,然后在test开头的pod中执行的,也可以映射pod的yaml文件并上传到指定的仓库中,然后在拉取仓库中的yaml文件并执行,也可以在项目中写好yaml的模版用脚本映射即可,这个根据自己的环境定义。没有了,看看其他的吧。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏