devops-4:Jenkins基于k8s cloud和docker cloud动态增减节点 - vfanCloud
source link: https://www.cnblogs.com/v-fan/p/16548185.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Jenkins管理动态节点
上文介绍Jenkins增加静态agent的步骤,除了静态增加外,还有动态管理的功能,两者最大的差异在于动态可以在有job运行时,临时加入一个agent到jenkins master,然后等job执行完毕之后,所加入的agent再自动删除掉,达到一个动态的增删节点效果,使所有的job都在远端的某个集群中执行。
目前执行动态扩缩节点的方式有docker cloud和k8s cloud。
docker cloud配置
-
首先需要安装docker插件,系统管理—>插件管理—>可选插件—>搜索docker,主要的有Docker 、docker pipeline插件,其他插件可以酌情下载。
-
配置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端口,供客户端访问,需要注意安全问题,可以通过防火墙等安全设备对端口进行限制,也可以为此端口指定证书,必须有此端口证书和私钥才可以访问成功。
-
在Jenkins端配置docker cloud,系统管理—>节点管理—>Configure Clouds—>Add a new cloud—>Docker
-
配置Docker Cloud details,主要是配置地址+端口,如果有证书则也配置上证书。
配置完成后,点击后边的Test Connection,显示出docker version 和 Api version后,表示连接成功。
-
配置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配置
-
系统管理->插件管理->可选插件,搜索kubernetes直接安装
-
k8s插件安装完毕后,开始添加云节点:系统管理—>节点管理—>Configure Clouds—>Add a new cloud—>Kubernetes
-
配置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中
测试连接出现版本号即连接成功
-
配置Pod Templates
主要配置标签和用法以及pod的出事YAML,其他像volume、network或secret等都可以再yaml中提前编写
有kubernetes-agent标签的job会匹配到此agent
定义的一个基础YAML模板,可以在里边定义更多的配置
再就是要定义一下workspace采取什么形式,分别有这几种:
根据自己需求,需不需要持久化来决定使用哪种方式
-
至此基本配置已经完成,还有一点需要注意,当有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执行结束后,自动摧毁。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK