在TKE集群搭建jenkins

时间:2022-06-21
本文章向大家介绍在TKE集群搭建jenkins,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、什么是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

# 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 默认创建一个云硬盘,这里可根据个人需求进行调整。

根据实际情况,修改成了如下:

#修改后的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

$ 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

查看创建的实例

$ 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中

$ 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

填写密码点击下一步

  1. 配置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/