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 ...

  10. .Net Core 使用jenkins 部署到远程服务器docker

    最近一直在研究docker和kubernetes,小型的项目其实也用不到k8s,本文就是描述如何用jenkins 进行构建asp.net core 3.1项目并且发布到远程服务器docker容器中.本 ...

随机推荐

  1. 最完整的Elasticsearch 基础教程

    翻译:潘飞(tinylambda@gmail.com) 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT)        Ela ...

  2. 【BZOJ 2038】【2009 国家集训队】小Z的袜子(hose) 分块+莫队

    $SDOI2016Day-1$临时抱佛脚学习一下莫队算法$233$ 我预感到自己省选要爆0hhh #include<cmath> #include<cstdio> #inclu ...

  3. 编译caffe报错:_ZN5boost16exception_detail10bad_alloc_D2Ev

    具体报错信息很长的. text._ZN5boost16exception_detail10bad_alloc_D2Ev[_ZN5boost16exception_detail10bad_alloc_D ...

  4. c#md5与SHA1验证函数

    /// <summary> /// MD5验证函数 /// </summary> /// <param name="fileName">文件的路 ...

  5. Super Jumping! Jumping! Jumping!杭电1087

    Description Problem Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumpi ...

  6. C++对文件进行加密解密

    1. 起因: 需要对游戏资源进行加密 2. 解决方案: 通过网络查询,xxtea是一款轻量级的加密工具,使用简单方便 3. 加密解密 xxtea只有两个函数,加密:xxtea_encrypt 解密:x ...

  7. setInterval的用法

    function show1(){    console.log("每隔1秒显示一次");}function show2(str){    console.log(str);}se ...

  8. jvm层面锁优化+一般锁的优化策略

    偏向锁: 首先了解对象头MARK指针(对象头标记,32位): 存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID) 大部分情况是没有竞争的,所以可以通过偏向来提高性能 所谓的 ...

  9. [LOJ#6033]. 「雅礼集训 2017 Day2」棋盘游戏[二分图博弈、匈牙利算法]

    题意 题目链接 分析 二分图博弈经典模型,首先将棋盘二分图染色. 考虑在某个最大匹配中: 如果存在完美匹配则先手必败,因为先手选定的任何一个起点都在完美匹配中,而后手则只需要走这个点的匹配点,然后先手 ...

  10. word2003设置页码不从第一页开始的方法

    问题描述:如果你想设置页码从第三四页开始,前边不要页码,或者前边的页码是不同类型的.那么这个时候就要用到:插入->分隔符模式. 如果你的页面中的各个标题是从样式和格式中选择的,既是你先设置好各种 ...