在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
填写密码点击下一步
- 配置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
- 如何自定义微服务的Instance ID
- 怎样做情感分析
- Python|编写自己的类
- 碎片化 | 第四阶段-45-session为空问题解决-视频
- 以后有机会写框架用得着的
- 合并两个不相关的Git仓库
- 用 Tensorflow 建立 CNN
- 碎片化 | 第四阶段-36-struts-spring结合jdbc实现删除功能-视频
- 跨域访问支持(Spring Boot、Nginx、浏览器)
- 自己动手写个聊天机器人吧
- 碎片化 | 第四阶段-37-sturts2-登录功能实现-视频
- Spring Cloud Edgware新特性之六:Artifact ID变更
- 用 RNN 训练语言模型生成文本
- 碎片化 | 第四阶段-38-Struts2登录session对象封装-视频
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- prometheus学习笔记(2)-利用java client写入数据
- Vue入门系列(一)Vue技术栈
- Openwrt智能路由系统开发--内容总结
- 干爆红队-爆破CS Teamserver 密码
- 使用Golang免杀Tips
- centos7卸载自带jdk并安装新的jdk
- 即使不懂单元测试,会用这个工具也够了~
- 统计分布讲解
- 使用PyTorch Lightning自动训练你的深度神经网络
- linux防火墙相关配置命令及操作(centos和ubuntu)
- 带你吃透Spring事务7种传播行为 | Spring第45篇
- Linux如何查看端口被占用情况?Windows如何查看端口被占用情况?
- centos7安装Docker详细步骤(无坑版教程)
- Java的Object类详解(入门必备)
- Java的包机制以及import、static import的用法详解(看这篇就够了)