2017年3月10日注:

这篇文章发布在去年8月,现在,jenkins kubernetes 插件已经由0.8更新到了0.11,jnlp-slave 也更新到了2.62,新版本与老版本在运行方式和功能上均发生了一些变化,请您注意参考相关文档。

2017年4月7日注:

新版本的 kubernetes plugin (0.11) 以及 jnlp-slave(2.62) 仍然是可用的,有两点需要注意:

1)建议基于官方的 jnlp-slave:2.62 构建自己的 jnlp 镜像,然后在jenkins kubernetes 插件的 template 中设置单容器,并且将容器的名称设置为 jnlp,否则 jenkins 会从外网下载默认的 jnlp 镜像,耗时而且存在问题。

2)下述参数不要采用默认值,用图中的值替换默认值

Command to run slave agent: (留空)

Arguments to pass to the command: ${computer.jnlpmac} ${computer.name}

Allocate pseudo-TTY: 不选

---- 截图 ----

----------- 原文 -----------

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

  1. 资源分配:jenkins 根据任务属性自动创建临时 docker 容器,并作为 slave 节点加入 jenkins 集群,实现资源的分配;
  2. 资源释放:任务执行结束后,jenkins 自动删除相关节点,并销毁相关 docker 容器,实现资源的释放;

整个资源分配和资源释放过程对用户来说是透明的,用户只需要创建好任务就可以了,不需要操作节点;对于jenkins来说,slave 节点(容器)是临时的,任务一结束就会销毁。

为了实现数据持久化,建议把需要持久化的数据挂载到 NFS 或 glusterfs卷上。

1. 准备 docker 镜像

#jenkins master

jenkins:2.7.2

#jenkins slave

jenkinsci/jnlp-slave:2.52

2. 部署 jenkins master

分别部署 controller, service, ingress,controller 控制 master 容器,ingress 提供用户访问入口。

 kind: Deployment
metadata:
name: jenkins
spec:
replicas:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge:
maxUnavailable:
template:
metadata:
labels:
app: jenkins
spec:
imagePullSecrets:
- name: myregistrykey
containers:
- name: jenkins
image: registry.xxxxx.com/jenkins:2.7.
imagePullPolicy: IfNotPresent
ports:
- containerPort:
name: web
protocol: TCP
- containerPort:
name: agent
protocol: TCP
volumeMounts:
- name: jenkinshome
mountPath: /var/jenkins_home
env:
- name: JAVA_OPTS
value: "-Duser.timezone=Asia/Shanghai"
volumes:
- name: jenkinshome
nfs:
server: 172.31.17.74
path: "/var/nfsshare/k8s/jenkins/home"
 kind: Service
apiVersion: v1
metadata:
labels:
app: jenkins
name: jenkins
spec:
ports:
- port:
targetPort:
name: web
- port:
targetPort:
name: agent
selector:
app: jenkins
 kind: Ingress
metadata:
name: jenkins
spec:
tls:
- hosts:
- jenkins.xxxxx.com
secretName: jenkins-secret
rules:
- host: jenkins.xxxxx.com
http:
paths:
- backend:
serviceName: jenkins
servicePort:
path: /

3. 安装 jenkins Kubernetes 插件

登录 jenkins master,根据页面提示,输入 /home/jenkins_home/下的密钥文件里的密钥,进入插件安装界面,选择 Kubernetes Plugin 安装。

4. 创建 jenkins Kubernetes 云

jenkins-系统管理-系统设置-云-Kubernetes:

Name: k8s_cluster
Kubernetes URL: https://kubernetes.default
Kubernetes Namespace: default
Jenkins URL: http://jenkins.default:8080

images - Kubernetes Pod Template:
Name: jnlp-slave
Labels: jnlp-slave
Docker image: registry.xxxxx.com/jenkinsci/jnlp-slave:2.52
Jenkins slave root directory: /home/jenkins

5. 查看无任务状态

5.1 jenkins

节点中只有一个master,没有 slave节点

5.2 kubernetes

只有 jenkins master pod

6. 创建测试任务

该任务选择标签为 jnlp-slave 的镜像作为执行任务的容器的镜像,构建动作是 ping www.baidu.com

建好后执行该任务

7. 查看任务执行状态

7.1 jenkins

jenkins 自动创建了一个slave节点

7.2 kubernetes

kubernetes pod中多出一个jnlp-slave-开头的pod

8. 结束任务

结束任务后,刚才看到的slave 节点被自动删除,kubernetes 中 jnlp-slave 开头的 pod 也消失了。

[系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源的更多相关文章

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

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

  2. Ubuntu系统下基于docker部署Jenkins环境

    本文是在ubuntu环境下安装jenkins,jenkins运行在docker容器中, 至于docker如何安装,请参考https://www.cnblogs.com/xingyunqiu/p/115 ...

  3. 基于docker部署jenkins

    1. 拉镜像 和其他的部署的镜像的方式一样,通常是直接使用docker search jenkins 然后直接docker pull jenkins 此时,在安装插件的时候发现插件都安装失败,提示je ...

  4. Kubernetes DevOps: Jenkins

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

  5. 基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2

    基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2 Kubernetes实现Master-Slave分布式构建方案 传统Jenkins的Master-Slave方案的缺陷 Mas ...

  6. 解读与部署(三):基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

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

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

  8. 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)

    部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序   在下载的Istio安装包的samples目录中包含了示例应用程序. ...

  9. kubernetes(14):k8s基于NFS部署storageclass实现pv自动供给

    k8s基于NFS部署storageclass实现pv自动供给 https://www.cnblogs.com/Smbands/p/11059843.html https://www.jianshu.c ...

随机推荐

  1. REVERSE-极客大挑战-geek2.apk

    嗯 一道apk的题目,题目本身并不是很难,但是我用的python却坑了我小半天...不过在纠错的过程中我也学到了不少东西 链接:http://pan.baidu.com/s/1i5LkJDr  密码: ...

  2. Ruby中字符串与正则表达式的问题

    Ruby的正则表达式为Regexp类的对象 主要的元语言字符 記号 意味 例 説明 ^ 行頭 /^abc/ abcで始まる行 $ 行末 /abc$/ abcで終わる行 . 任意の1文字 /a.b/ a ...

  3. SQL Server如何编辑超过前200行的数据

    从SQL Server 2008开始,微软为了提高查询效率等原因,右键点击表时弹出菜单中默认没有"显示所有行",而以"选择前1000行"替代.这有时会为我们带来 ...

  4. Python 基礎 - 字符串常用操作

    字符串常用操作 今天就介紹一下常用的字符串操作,都是以 Python3撰寫的 首字母變大寫 #!/usr/bin/env python3 # -*- coding:utf-8 -*- name = & ...

  5. Redis的简介与安装(windows)

    1.简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串). list(链表).set(集合).zset(sorte ...

  6. 技海拾贝 - Android

    1. 前台Service - 介绍: http://blog.csdn.net/think_soft/article/details/7299438 - 代码实例:  http://blog.csdn ...

  7. 如何关闭emacs开启时自己打开的欢迎界面

    EMACS在开启后,会自动打开一个欢迎界面.如果要去除他,可以在用emacs或其实编辑工具编辑~/.emacs文件. 在最下面一行加上,保存退出即可. (setq inhibit-startup-me ...

  8. DEDECMS 留言薄模块的使用方法

    一.留言薄的安装 留言薄的安装过程和其他插件一样,首先我们进入后台模块管理列表,点击其对应的“安装”: 以上步骤,我们完成了留言薄插件的安装. 二.留言薄的卸载 留言薄的卸载,同样首先我们要进入模块管 ...

  9. AOP 手动,半自动,全自动

    dao层 package com.yaorange.dao; public interface StudentDao { public void saveStudent(); public void ...

  10. AppStore遭遇大BUG

    用AppLoader上传,提示这个 The u option must have a non-empty value.The password must have a non-empty value. ...