Jenkins管理动态节点

上文介绍Jenkins增加静态agent的步骤,除了静态增加外,还有动态管理的功能,两者最大的差异在于动态可以在有job运行时,临时加入一个agent到jenkins master,然后等job执行完毕之后,所加入的agent再自动删除掉,达到一个动态的增删节点效果,使所有的job都在远端的某个集群中执行。

目前执行动态扩缩节点的方式有docker cloud和k8s cloud。

docker cloud配置

  1. 首先需要安装docker插件,系统管理—>插件管理—>可选插件—>搜索docker,主要的有Docker 、docker pipeline插件,其他插件可以酌情下载。

  2. 配置docker守护进程,使其可以通过主机ip+端口的形式访问:

    vi /etc/systemd/system/docker.service

    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:8376

    添加此配置后,重新启动docker,主机便会暴露8376端口,供客户端访问,需要注意安全问题,可以通过防火墙等安全设备对端口进行限制,也可以为此端口指定证书,必须有此端口证书和私钥才可以访问成功。

  3. 在Jenkins端配置docker cloud,系统管理—>节点管理—>Configure Clouds—>Add a new cloud—>Docker

  4. 配置Docker Cloud details,主要是配置地址+端口,如果有证书则也配置上证书。

    配置完成后,点击后边的Test Connection,显示出docker version 和 Api version后,表示连接成功。

  5. 配置Docker Agent templates,要修改的主要配置为以下几点:

    • Labels:agent的label,用于指定匹配该cloud
    • Name:用于加入Jenkins slave的名字前缀
    • Docker Image:用于创建临时节点的镜像,相当于有job要执行时,会docker run此镜像,然后以slave节点的方式加入到Jenkins Master,并将job在此slave节点执行,执行完毕后,会直接docker rm掉
    • Remote File System Root:临时节点的家目录
    • Connect method:节点的加入方式,一般选用Attach Docker container即可,jenkins master会直接将slave所需的代码复制到此节点中,并用容器内的java启动,所以使用此方式要满足两条硬条件:必须有java环境和container的CMD必须是/bin/bash或者为空

    其他一些不是特别重要的参数,例如:Pull timeout拉取超时时间、Pull strategy拉取策略等可以进行相应的调整。

测试使用docker cloud运行一个Pipeline

以上步骤全部完成之后,docker cloud就可以正常使用,下边创建一个测试流水线:

pipeline {
agent {
label 'java-maven-app'
}
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
}
tools {
maven 'apache-maven-3.8.6'
}
stages {
stage('mvn version') {
steps {
sh 'mvn -v'
}
}
stage('java version') {
steps {
sh 'java -version'
}
post {
always {
sh 'echo "test complete"'
}
}
}
}
}

开始执行流水线:

可见此流水线在名称为 java-maven-app-001ocj3t66f69 的节点中运行,再去查看节点列表,发现多了一个叫这个名字的节点:

再查看docker容器,发现刚刚运行了一个jenkins/agent的容器:

Pipeline执行完毕后,容器被摧毁,节点也被剔除,实现了动态的docker cloud管理。

Kubernetes Cloud配置

  1. 系统管理->插件管理->可选插件,搜索kubernetes直接安装

  2. k8s插件安装完毕后,开始添加云节点:系统管理—>节点管理—>Configure Clouds—>Add a new cloud—>Kubernetes

  3. 配置Kubernetes Cloud details,主要配置名称、k8s apiserver地址、jenkins地址、k8s服务证书以及加密成.pfx类型的证书key:

    apiserver地址和jenkins地址不用强调,都知道怎么填,重点需要强调两个证书:

    • Kubernetes 服务证书 key:这个实际就是你k8s集群的ca.crt证书,一般在/etc/kubernetes/pki/ca.crt,直接copy过来即可
    • 第二个主要是因为k8s apiserver是https的通信方式,所以要将其集群证书的公私钥打包成.pfx类型,然后提供给jenkins来访问

    这里需要手动生成第二个.pfx类型的证书

    (1)首先需要安装证书生成工具:

    # curl -s -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    # curl -s -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    # curl -s -L -o /usr/local/bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 # chmod +x /usr/local/bin/cfssl*

    (2)然后准备证书签名请求

    vi jenkins-csr.json

    {
    "CN": "admin",
    "hosts": [],
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
    "C": "CN",
    "ST": "BeiJing",
    "L": "XS",
    "O": "system:masters",
    "OU": "System"
    }
    ]
    }

    证书请求中的O 指定该证书的 Group 为 system:masters,而 RBAC 预定义的 ClusterRoleBinding 将 Group system:masters 与 ClusterRole cluster-admin 绑定,这就赋予了该证书具有所有集群权限 。

    (3)创建admin证书和私钥

    # cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key --profile=kubernetes jenkins-csr.json | cfssljson -bare admin
    
    # ls
    admin-key.pem admin.pem jenkins-csr.json

    生成证书与key

    (4)生成.pfx类型证书

    # openssl pkcs12 -export -out ./jenkins-admin.pfx -inkey ./admin-key.pem -in ./admin.pem -passout pass:jenkins
    # ls
    jenkins-admin.pfx

    指定admin的公钥私钥生成jenkins-admin.pfx,并设置密码为jenkins

    (5)将证书添加至jenkins凭证中

    (6)最终再应用到k8s cloud中

    测试连接出现版本号即连接成功

  4. 配置Pod Templates

    主要配置标签和用法以及pod的出事YAML,其他像volume、network或secret等都可以再yaml中提前编写

    有kubernetes-agent标签的job会匹配到此agent

    定义的一个基础YAML模板,可以在里边定义更多的配置

    再就是要定义一下workspace采取什么形式,分别有这几种:

    根据自己需求,需不需要持久化来决定使用哪种方式

  5. 至此基本配置已经完成,还有一点需要注意,当有job要执行时,生成的pod中会有自己定义的一个容器和jenkins用于提供agent连接的容器,共两个,默认情况jenkins agent生成的容器会拉取jenkins/inbound-agent:4.11-1-jdk11这个镜像,可以提前下载下来,或者重新指定一个镜像:

编辑流水线测试使用Kubernetes cloud

新建任务—>pipeline—>拉到最下边选择Pipeline script form SCM—>SCM选择Git—>填写项目的URL及认证

—>指定分支—>指定脚本的路径

这个就表示会直接从你指定的代码仓库中去拉取代码,并根据仓库中指定的Jenkinsfile进行构建,代码仓库结构如下:

指定的Jenkinsfile文件内容如下:

pipeline {
agent {
kubernetes {
cloud 'kubernetes-internal' //指定k8s cloud的名称
label 'kubernetes-agent' //指定label
defaultContainer 'example.com:5000/jenkins/agent:latest' //可以指定运行的镜像,不指定会默认使用配置k8s cloud时的默认镜像
inheritFrom 'jenkins-agent' //指定所用的podTemplate,其实是多余的,因为就算不指定,也会用配置k8s cloud时,配置的pod Template
namespace 'default'
}
tools {
maven 'apache-maven-3.8.6'
}
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
}
}
}
}

执行结果:

以k8s pod为agent的临时节点已经加入:

k8s中pod也已经启动,Pipeline执行结束后,自动摧毁。

devops-4:Jenkins基于k8s cloud和docker cloud动态增减节点的更多相关文章

  1. 阿里云-容器服务之集群服务 k8s(Jenkins+gitlab+k8s的devops)- 01

    由于docker官方停止更新Swarm,另外swarm在使用期间出现了很多bug,所以阿里云也在2019年7月发布公告:于2019年12月31日起停止技术支持,请您尽快迁移至容器服务Kubernete ...

  2. 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践

    由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ...

  3. 几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm

    微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...

  4. Jenkins - 基于 Docker 的 Jenkins 安装

    概述 安装 Jenkins 基于 Docker 这个有点 水一发 的性质... 场景 学习 Jenkins 第一步, 当然是安装 但是 安装的方法 很多 Jenkins 是基于 Java 的 所以是个 ...

  5. node项目自动化部署--基于Jenkins,Docker,Github(2)配置节点

    上一篇文章中准备工作已经完成的差不多了 这一篇主要讲解 Jenkins 上面的相关配置 为了让代码部署到所有的子节点上 所以我们首先需要在 Jenkins 中添加我们希望代码部署到的节点 配置节点 首 ...

  6. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  7. 基于 K8S 构建数据中心操作系统

    在 12 月 22 日 ECUG 的下午场 ,七牛云容器计算部技术总监袁晓沛为大家带来了主题为<基于 K8S 的 DCOS 之路>的精彩分享,向大家介绍了七牛容器云目前 K8S 的状况和产 ...

  8. Spring Cloud和Docker搭建微服务平台

    用Spring Cloud和Docker搭建微服务平台 This blog series will introduce you to some of the foundational concepts ...

  9. Jenkins把GitHub项目做成Docker镜像

    本文是<Jenkins流水线(pipeline)实战>系列的第三篇,前面已对Jenkins流水线有了基本认识,也试过从GitHub下载pipeline脚本并执行,今天的实战是编写一段pip ...

随机推荐

  1. 129_Power Pivot&Power BI DAX不同维度动态展示&动态坐标轴

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 某天在和那还是叫我大铁吧 交流关于季度&月度同时展示的问题,感概中国式报表真的需求很微妙. 下面来看看到 ...

  2. Java实现飞机大战游戏

    飞机大战详细文档 文末有源代码,以及本游戏使用的所有素材,将plane2文件复制在src文件下可以直接运行. 实现效果: 结构设计 角色设计 飞行对象类 FlyObject 战机类 我的飞机 MyPl ...

  3. socket套接字补充、操作系统发展史、进程

    目录 socket套接字之UDP协议 操作系统的发展史 手工操作 批处理系统 联机批处理系统 脱机批处理系统 多道技术 进程理论 并发与并行 同步与异步 阻塞与非阻塞 同步异步与阻塞非阻塞总结 soc ...

  4. 每天一个 HTTP 状态码 206

    206 Partial Content 206 Partial Content 是当客户端请求时使用了 Range 头部,服务器端回复的响应,表示只响应一部分内容. 实例 请求: GET /favor ...

  5. map计算

    map理解 参考1: https://github.com/rafaelpadilla/Object-Detection-Metrics 参考2:https://github.com/rafaelpa ...

  6. Python模块Ⅱ

    Python模块2 part3 模块的分类: 内置模块200种左右:python自带的模块,time os sys hashlib等 第三方模块6000种左右:需要pip install beauti ...

  7. 对抗噪音,一键清晰,HMS Core音频编辑服务给你“录音棚”般的体验

    短视频时代来临,一部手机就可以玩转多种花样,所以越来越多的自由创作者加入这个行业,平时生活中用手机拍短视频.街头唱歌的非专业从业者随处可见.离开了录音棚,没有专业.统一的录音设备,无论在家里还是在路边 ...

  8. Three.js 打造缤纷夏日3D梦中情岛 🌊

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 深居内陆的人们,大概每个人都有过大海之梦吧.夏日傍晚在沙滩漫步奔跑:或是在 ...

  9. Mybatisi和Spring整合源码分析

    一.MybatisSpring的使用 1.创建 Maven 工程. 2.添加依赖,代码如下 <dependency> <groupId>org.mybatis</grou ...

  10. 使用html2canvas,由html转换canvas时,出现图片丢失问题解决方案

    在img标签上加上crossorigin="anonymous":如果是图片地址是跨域网址,请将图片转换为base64格式: 源码如下: <!DOCTYPE html> ...