前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在TKE集群搭建jenkins

在TKE集群搭建jenkins

原创
作者头像
马凌鑫
修改2019-11-26 12:01:58
1.4K0
修改2019-11-26 12:01:58
举报
文章被收录于专栏:云知识学习

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

填写密码点击下一步

  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/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是jenkins
  • 二、什么是CI & CD
  • 三、搭建jenkins
  • 四、访问jenkins
  • 五、安装Jenkins Kubernetes插件
  • 六、测试流水线
相关产品与服务
持续集成
CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档