使用jenkins动态slave的优势:

  • 服务高可用,当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master 容器,并且将 Volume 分配给新创建的容器,保证数据不丢失,从而达到集群服务高可用。
  • 动态伸缩,合理使用资源,每次运行 Job 时,会自动创建一个 Jenkins Slave,Job 完成后,Slave 自动注销并删除容器,资源自动释放,而且 Kubernetes 会根据每个资源的使用情况,动态分配 Slave 到空闲的节点上创建,降低出现因某节点资源利用率高,还排队等待在该节点的情况。
  • 扩展性好,当 Kubernetes 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一个 Kubernetes Node 到集群中,从而实现扩展。

架构图如下:

1、创建namespace

  1. kubectl create ns kube-ops

2、设置rba授权

  1. [root@node1 mingyang]# cat rbac.yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: jenkins
  6. namespace: kube-ops
  7.  
  8. ---
  9. kind: ClusterRole
  10. apiVersion: rbac.authorization.k8s.io/v1beta1
  11. metadata:
  12. name: jenkins
  13. rules:
  14. - apiGroups: ["extensions", "apps"]
  15. resources: ["deployments"]
  16. verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  17. - apiGroups: [""]
  18. resources: ["services"]
  19. verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  20. - apiGroups: [""]
  21. resources: ["pods"]
  22. verbs: ["create","delete","get","list","patch","update","watch"]
  23. - apiGroups: [""]
  24. resources: ["pods/exec"]
  25. verbs: ["create","delete","get","list","patch","update","watch"]
  26. - apiGroups: [""]
  27. resources: ["pods/log"]
  28. verbs: ["get","list","watch"]
  29. - apiGroups: [""]
  30. resources: ["secrets"]
  31. verbs: ["get"]
  32.  
  33. ---
  34. apiVersion: rbac.authorization.k8s.io/v1beta1
  35. kind: ClusterRoleBinding
  36. metadata:
  37. name: jenkins
  38. namespace: kube-ops
  39. roleRef:
  40. apiGroup: rbac.authorization.k8s.io
  41. kind: ClusterRole
  42. name: jenkins
  43. subjects:
  44. - kind: ServiceAccount
  45. name: jenkins
  46. namespace: kube-ops

3、创建jenkins deployment文件

  1. [root@node1 mingyang]# cat jenkins.yaml
  2. ---
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6. name: jenkins
  7. namespace: kube-ops
  8. spec:
  9. selector:
  10. matchLabels:
  11. app: jenkins
  12. template:
  13. metadata:
  14. labels:
  15. app: jenkins
  16. spec:
  17. terminationGracePeriodSeconds: 10
  18. serviceAccount: jenkins
  19. containers:
  20. - name: jenkins
  21. image: jenkins/jenkins:lts
  22. imagePullPolicy: IfNotPresent
  23. ports:
  24. - containerPort: 8080
  25. name: web
  26. protocol: TCP
  27. - containerPort: 50000
  28. name: agent
  29. protocol: TCP
  30. resources:
  31. limits:
  32. cpu: 1000m
  33. memory: 1Gi
  34. requests:
  35. cpu: 500m
  36. memory: 512Mi
  37. livenessProbe:
  38. httpGet:
  39. path: /login
  40. port: 8080
  41. initialDelaySeconds: 60
  42. timeoutSeconds: 5
  43. failureThreshold: 12
  44. readinessProbe:
  45. httpGet:
  46. path: /login
  47. port: 8080
  48. initialDelaySeconds: 60
  49. timeoutSeconds: 5
  50. failureThreshold: 12
  51. volumeMounts:
  52. - name: jenkinshome
  53. subPath: jenkins
  54. mountPath: /var/jenkins_home
  55. env:
  56. - name: LIMITS_MEMORY
  57. valueFrom:
  58. resourceFieldRef:
  59. resource: limits.memory
  60. divisor: 1Mi
  61. - name: JAVA_OPTS
  62. value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85 -Duser.timezone=Asia/Shanghai
  63. securityContext:
  64. fsGroup: 1000
  65. volumes:
  66. - name: jenkinshome
  67. hostPath:
  68. path: /data/jenkins_home
  69. type: DirectoryOrCreate
  70.  
  71. ---
  72. apiVersion: v1
  73. kind: Service
  74. metadata:
  75. name: jenkins
  76. namespace: kube-ops
  77. labels:
  78. app: jenkins
  79. spec:
  80. selector:
  81. app: jenkins
  82. type: NodePort
  83. ports:
  84. - name: web
  85. port: 8080
  86. targetPort: web
  87. nodePort: 30002
  88. - name: agent
  89. port: 50000
  90. targetPort: agent

4、给jenkins家目录授权

  1. chown -R 1000 /data/jenkins_home/

5、运行情况

6、安装kubernetes插件Kubernetes plugin。

7、配置kubernetes

8、这一步是核心,添加pod templates。标签列表是到时编写pipeline要关联的。

9、添加两个挂载卷 分别是docker及kubectl 工具

10、测试pipeline

  1. node('hejianlai') {
  2. stage('Clone') {
  3. echo "1.Clone Stage"
  4. }
  5. stage('Test') {
  6. echo "2.Test Stage"
  7. }
  8. stage('Build') {
  9. echo "3.Build Docker Image Stage"
  10. }
  11. stage('Push') {
  12. echo "4.Push Docker Image Stage"
  13. }
  14. stage('YAML') {
  15. echo "5. Change YAML File Stage"
  16. }
  17. stage('Deploy') {
  18. echo "6. Deploy Stage"
  19. }
  20. }

11、运行结果,slave执行完任务之后自动销毁。

kubernetes跑jenkins动态slave的更多相关文章

  1. Kubernetes Jenkins动态创建Slave

    目录 0.前言 1.Jenkins部署 2.配置jenkins动态slave 3.dubbo服务构建 3.1.制作dubbo镜像底包 3.2.制作slave基础镜像 3.2.1.Maven镜像 3.2 ...

  2. 基于Kubernetes构建企业Jenkins master/slave CI/CD平台

    搭建平台目的: k8s中搭建jenkins master/slave架构,解决单jenkins执行效率低,资源不足等问题(jenkins master 调度任务到 slave上,并发执行任务,提升任务 ...

  3. Kubernetes DevOps: Jenkins Pipeline (流水线)

    要实现在 Jenkins 中的构建工作,可以有多种方式,我们这里采用比较常用的 Pipeline 这种方式.Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于 ...

  4. Kubernetes DevOps: Jenkins

    提到基于 Kubernete 的CI/CD,可以使用的工具有很多,比如 Jenkins.Gitlab CI 以及新兴的 drone 之类的,我们这里会使用大家最为熟悉的 Jenkins 来做 CI/C ...

  5. [系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源

    基于kubernetes 部署 jenkins master 比较简单,难点是为 jenkins 动态分配资源.基于kubernetes 为 jenkins 动态分配资源需要实现下述功能: 资源分配: ...

  6. jenkins中slave节点连接的两种常用方式

    我们在使用jenkins的时候,一般来说肯定是有slave节点的,本来网上也有好多关于jenkins节点配置的教程,我也就不写了.简单说明一下:任务一般是在slave上面运行的.当然不是讲master ...

  7. kubernetes部署jenkins(Docker in Docker)及认证

    引言 Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. 本文将Jenkins的master与slave置于Pod中,部署在namespace:jenk ...

  8. Jenkins Master/Slave架构

    原文:http://www.cnblogs.com/itech/archive/2011/11/11/2245849.html 一 Jenkins Master/Slave架构 Master/Slav ...

  9. jenkins windows slave 报错ERROR: Error cloning remote repo 'origin'

    在slave上是git clone ssh是可以成功的,但是jenkins调用slave节点就报如下错误: ERROR: Error cloning remote repo 'origin' huds ...

随机推荐

  1. ctfhub技能树—文件上传—MIME绕过

    什么是MIME MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访 ...

  2. CTFhub刷题记录

    一 [WesternCTF2018]shrine 没什么好说的,SSTI模版注入类问题,过滤了()但是我们不慌.开始注入,{{29*3}}测试通过. 发现是jinjia2的模版注入.关键点在于没有() ...

  3. Python3.9的http.client.py下的HTTPMessage类中的方法getallmatchingheaders的bug修复建议

    在官方网站已经提交相关issue,不过目前看好像还没有修复.具体的bug位置为: http文件夹下的client.py文件,代码位置为:类HTTPMessage下的方法getallmatchinghe ...

  4. layui表格数据统计

    //执行一个 table 实例 table.render({ elem: '#demo' ,height: 420 ,url: '/demo/table/user/' //数据接口 ,title: ' ...

  5. Redis-第五章节-8种数据类型

    目录 一.Redis对key的操作 二.五种数据类型 String类型 List(集合) Set(集合) Hash(哈希) Zset(有序集合) 三.三种特殊数据类型 geospatial(地理位置) ...

  6. Redis 实战 —— 05. Redis 其他命令简介

    发布与订阅 P52 Redis 实现了发布与订阅(publish/subscribe)模式,又称 pub/sub 模式(与设计模式中的观察者模式类似).订阅者负责订阅频道,发送者负责向频道发送二进制字 ...

  7. JavaScript中函数的定义!

    JavaScript中函数的定义! 1 自定义函数(命名函数) function fun() {}; 2 函数表达式(匿名函数) var fun = function () {}; 3 利用 new ...

  8. etcd 与 Zookeeper、Consul 等其它 kv 组件的对比

    基于etcd的分布式配置中心 etcd docs | etcd versus other key-value stores https://etcd.io/docs/v3.4.0/learning/w ...

  9. Linux centos7编译源码安装redis

    1.安装准备 ① 由于redis底层用c语言编写的,安装redis需要先将官网下载的源码进行编译,编译依赖make和gcc环境,如果没有则需要安装(一般系统中已经装了了make和gcc,无须再装) 安 ...

  10. LOJ2130软件包

    题目描述Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软 ...