一、什么是jenkins
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能
本文主要是讲述 jenkins 的master slave模式,
Master:Jenkins服务器
Slave:执行机(奴隶机)。执行Master分配的任务,并返回任务的进度和结果
鉴于这种情况,把jenkins放在kubernetes集群就有天然的优势:
持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程,然而传统的 Jenkins Slave 一主多从方式会存在一些痛点,比如:主 Master 发生单点故障时,整个流程都不可用了;每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲;资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态;最后资源有浪费,每台 Slave 可能是实体机或者 VM,当 Slave 处于空闲状态时,也不会完全释放掉资源。
下图是基于 Kubernetes 搭建 Jenkins 集群的简单示意图。
二、什么是CI & CD
CI&CD简单来说就是持续集成(CI)、持续部署(CD)
持续部署是建立在持续集成之上的,持续部署就是开发人员在开发和测试代码的时候,同时也在其他环境进行测试这段代码。通常将不同的环境下的部署,叫做部署流水线。我们公司的部署流水线:开发环境,测试环境,准生产环境,生产环境。根据不同的公司,不同的产品,不同的团队而变化,所有的代码会经过前一个测试,才会进入下一个流水线中。通过这种方式,开发人员提交代码后,都是自动的完成的。这个过程叫持续部署。
三、搭建jenkins
1.下载jenkins yaml文件
github仓库:https://github.com/jenkinsci/kubernetes-plugin
代码语言:txt复制# yaml文件在/src/main/kubernetes下
$ git clone https://github.com/jenkinsci/kubernetes-plugin.git
$ cd kubernetes-plugin/src/main/kubernetes/
$ ls
jenkins.yml service-account.yml
2.修改jenkins.yml
jenkins.yml中声明了StatefulSet、Service、Ingress,由于我们是在TKE上创建,所以ingress不要也行。把service的type申明为loadbalancer创建公网负载均衡即可提供公网入口,并且statefulset中声明了volumeClaimTemplates,若在TKE集群中创建,会调用storageclass cbs 默认创建一个云硬盘,这里可根据个人需求进行调整。
根据实际情况,修改成了如下:
代码语言:txt复制#修改后的yaml仅供参考,具体还是以官方文件为准。
#https://github.com/jenkinsci/kubernetes-plugin/blob/master/src/main/kubernetes/jenkins.yml
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: jenkins
labels:
name: jenkins
k8s-app: jenkins
qcloud-app: jenkins
spec:
serviceName: jenkins
replicas: 1
updateStrategy:
type: RollingUpdate
template:
metadata:
name: jenkins
labels:
name: jenkins
spec:
terminationGracePeriodSeconds: 10
serviceAccountName: jenkins
containers:
- name: jenkins
image: jenkins/jenkins:lts-alpine
imagePullPolicy: Always
ports:
- containerPort: 8080
- containerPort: 50000
resources:
limits:
cpu: 1
memory: 1Gi
requests:
cpu: 0.5
memory: 500Mi
env:
- name: LIMITS_MEMORY
valueFrom:
resourceFieldRef:
resource: limits.memory
divisor: 1Mi
- name: JAVA_OPTS
value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slave
s.NodeProvisioner.MARGIN0=0.85
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
livenessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
readinessProbe:
httpGet:
path: /login
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
failureThreshold: 12
securityContext:
fsGroup: 1000
volumeClaimTemplates:
- metadata:
name: jenkins-home
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
externalTrafficPolicy: Cluster
ports:
-
name: http
port: 80
targetPort: 8080
protocol: TCP
-
name: agent
port: 50000
protocol: TCP
selector:
name: jenkins
type: LoadBalancer
sessionAffinity: None
也可以在控制台找到jenkins的service直接修改为公网访问:
3.创建jenkins.yml service-account.yml
代码语言:txt复制$ kubectl create -f kubernetes-plugin/src/main/kubernetes/.
statefulset.apps "jenkins" created
service "jenkins" created
serviceaccount "jenkins" created
role.rbac.authorization.k8s.io "jenkins" created
rolebinding.rbac.authorization.k8s.io "jenkins" created
查看创建的实例
代码语言:txt复制$ kubectl get pod
NAME READY STATUS RESTARTS AGE
jenkins-0 1/1 Running 0 2m
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins LoadBalancer 172.16.255.163 129.211.152.238 80:31507/TCP,50000:31726/TCP 1m
kubernetes ClusterIP 172.16.255.1 <none> 443/TCP 1d
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
jenkins-home-jenkins-0 Bound pvc-1f31214b-7acc-11e9-920b-cee280f87370 10Gi RWO cbs 1d
四、访问jenkins
首次访问需填写密码,此时去pod中获取
第一种方式:通过exec进入jenkins-0中
代码语言:txt复制$ kubectl exec -it jenkins-0 /bin/bash
bash-4.4$ cd /var/jenkins_home/secrets/
bash-4.4$ ls
filepath-filters.d jenkins.model.Jenkins.crumbSalt org.jenkinsci.main.modules.instance_identity.InstanceIdentity.KEY whitelisted-callables.d
initialAdminPassword master.key slave-to-master-security-kill-switch
bash-4.4$ cat initialAdminPassword
e8637c9718394306bbf65ee249eebaab
第二种方式:通过控制台进入jenkins-0
填写密码点击下一步
- 配置jenkins
选择安装推荐的插件,如有个性需求请自行选择
创建管理员账户
配置URL,后续可修改,由于这里是测试环境,所以不配置域名了。
点击一下一步就进入jenkins的界面了。
五、安装Jenkins Kubernetes插件
Manage Jenkins-->Manage Plugins-->Available
搜索Kubernetes,勾选对应的选项,直接安装。
五、添加kubernetes 云
安装完毕插件后后,点击 Manage Jenkins --> Configure System --> (拖到最下方)Add a new cloud —> 选择 Kubernetes
接下来只需直接点下连接测试即可,出现 Connection test successful 说明jenkins与kubernetes通信正常。
只要jenkins是部署在集群内的,就不用填写信息。若jenkins是部署在kubernetes外,则需要填写相关的信息。
六、测试流水线
创建一个 Pipeline 类型 Job 并命名为 my-k8s-jenkins-pipeline,然后在 Pipeline 脚本处填写一个简单的测试脚本如下
配置执行构建,此时去构建队列里面,可以看到有一个构建任务暂时还没有执行中的构建
等构建任务执行完毕后,容器就会退出
到此测试完毕,jenkins构建完毕,功能可正常使用
参考:
https://github.com/jenkinsci/kubernetes-plugin/blob/master/README.md
https://blog.csdn.net/aixiaoyang168/article/details/79767649
https://jenkins.io/zh/doc/