kubernetes中部署jenkins集群

avatar 2022年12月24日18:06:06 评论 326 次浏览

在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

然后把jenkins的默认密码输入进去即可,这样jenkins就已经安装好了,下面开始配置jenkins。

我这里选择的推荐插件,可以根据自己的需求选择。

安装成功后,我们需要安装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的模版用脚本映射即可,这个根据自己的环境定义。没有了,看看其他的吧。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: