kubernetes系列之《构建企业级CICD平台(三)》

前言:本文是构建企业级CICD的第三篇文章,主要介绍Jenkins在k8s集群中的应用,以及如何构建Jenkins-slave镜像、Jenkins Pipeline插件使用等。

四、Jenkins在K8s中动态创建代理
4.1、Jenkins Master/Slave架构
Slave的主要作用在于帮助Master分担Job任务,多用于一个Master节点不够使用时,考虑增加Slave节点。
在这里插入图片描述

4.2、在K8S中Jenkins Master/Slave架构
在这里插入图片描述
在K8s集群中,将通过插件来实现将Jenkins Slave节点动态添加到Master节点上。

4.3、配置Jenkins在K8s中动态创建代理
上面说了,要想实现动态创建功能,需借助Jenkins的插件:kubernetes插件(Jenkins在kubernetes集群中运行动态代理)
插件介绍:https://github.com/jenkinsci/kubernetes-plugin

1、Jenkins安装kubernetes插件
点击:系统管理–>插件管理–>可选插件–>搜索kubernetes–>选择插件并安装

2、配置插件
点击:系统管理–>系统配置–>将页面拉到底下–>新增一个云–>选择kubernetes
这一块是配置Jenkins如何连接kubernetes集群
在这里插入图片描述

选项填写说明:

名称
可自定义,这里填写kubernetes
Kubernetes地址
如果Jenkins部署在K8s集群之外的话,kubernetes地址应当填写k8s对外的api-server地址,示例:https://172.16.194.128:6443
如果Jenkins部署在K8s集群之内,则写Service暴露出来的集群地址名称即可,示例:https://kubernetes.default,(需要指定命名空间)
Kubernetes服务证书key
如果是在集群之外部署Jenkins的话,需要填写此项,填写api-server CA的证书
Kubernetes命名空间
填写default
Jenkins地址
如果在k8s集群外部署,则需要填写Jenkins访问地址,反之填写:https://jenkins.default
五、构建Jenkins-Slave镜像
构建Slave镜像,主要用于加入Master节点,为Master节点的Job分担任务;
该镜像根据需求而定,如果你是编译打包java包,则镜像里需要安装maven编译环境等,如果是编译golang代码,则需要在镜像里安装golang相关的环境;其他环境原理上同。

5.1、构建镜像
构建镜像的Dockerfile文件:

[[email protected] jenkins-slave]# tree
.
├── Dockerfile
├── jenkins-slave
├── settings.xml
└── slave.jar

0 directories, 4 files
[[email protected] jenkins-slave]# cat Dockerfile
FROM centos:7
LABEL maintainer nicksors

RUN yum install -y java-1.8.0-openjdk maven curl git libtool-ltdl-devel &&
yum clean all &&
rm -rf /var/cache/yum/* &&
mkdir -p /usr/share/jenkins

COPY slave.jar /usr/share/jenkins/slave.jar
COPY jenkins-slave /usr/bin/jenkins-slave
COPY settings.xml /etc/maven/settings.xml
RUN chmod +x /usr/bin/jenkins-slave

ENTRYPOINT [“jenkins-slave”]
文件内容说明:

基于CentOS7系统,通过yum安装所需的编译打包环境;
slave.jar文件
作用:Jenkins slave启动的jar包
来源:slave.jar下载地址:http://yourserver:port/jnlpJars/slave.jar
jenkins-slave文件
作用:启动jenkins slave的脚本
来源:https://github.com/jenkinsci/docker-jnlp-slave/blob/master/jenkins-slave
settings.xml
作用:此文件是maven的配置文件
来源:安装maven后在/etc/maven/里能获取到,这里主要是将该文件配置了aliyun源,方便编译时下载国内资源
执行构建镜像:

[[email protected] jenkins-slave]# docker build -t 172.16.194.130/library/jenkins-slave-jdk:1.8 .
···略···
Successfully built a2dc6ce3b159
Successfully tagged 172.16.194.130/library/jenkins-slave-jdk:1.8
在构建镜像的时候,指定tag为私有仓库地址,稍后将镜像提交到Harbor私有仓库中。

5.2、推送镜像
[[email protected] jenkins-slave]# docker images|grep jenkins-slave
172.16.194.130/library/jenkins-slave-jdk 1.8 a2dc6ce3b159 7 minutes ago 531MB

需登录harbor仓库后,才有权限推送镜像

[[email protected] jenkins-slave]# docker login 172.16.194.130
Username: admin
Password: # 这里输入密码123123(之前部署harbor时更改过的密码)
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

推送镜像

[[email protected] jenkins-slave]# docker push 172.16.194.130/library/jenkins-slave-jdk
The push refers to repository [172.16.194.130/library/jenkins-slave-jdk]
e54ce55b7c51: Pushed
bd8e910d0b92: Pushed
46b55a546a66: Pushed
2babb9ea4fc7: Pushed
d69483a6face: Pushed
1.8: digest: sha256:f94a13c59dfa0ab6ec227105d3b26296f247436ff93e27fc31cb8e732c4ef060 size: 1574
[[email protected] jenkins-slave]#
Harbor上的镜像:

六、Jenkins Pipeline构建流水线发布
Jenkins Pipeline是一套插件,支持在Jenkins中实现继承和持续交付管道;
Pipeline通过特定语法对简单到复杂的传输管道进行建模;
声明式:遵循与Groovy相同语法。pipeline{}
脚本式:支持Groovy大部分功能,也是非常表达和灵活的工具。node{}
Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。
在这里插入图片描述
6.1、提交代码到Git仓库
在部署Git时我们创建了一个名为app的代码仓库,现在将仓库clone下来:

[[email protected] jenkins]# git clone [email protected]:/home/git/app.git
正克隆到 ‘app’…
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.
这里我有个java的demo项目,将这个项目提交到app仓库中:

[[email protected] app]# tree -L 4
.
├── db
│ └── tables_ly_tomcat.sql
├── LICENSE
├── pom.xml
├── README.md
└── src
└── main
├── java
│ └── com
└── resources
├── application.yml
├── log4j.properties
├── static
└── templates

8 directories, 6 files

提交代码

$ git add .
$ git commit -m ‘提交demo项目’
$ git push
这里的步骤就如同开发将项目提交到Gitlab一样,接下来就是发布环节了。

6.2、Jenkins保存拉取Git仓库凭据
Pipeline插件需要依赖免秘钥拉取我们上面提交的代码,就必须得配置Jenkins拥有私钥凭证。
在前面安装Git时生成过一次秘钥,这里就将生成的私钥配置在Jenkins中即可。
访问Jenkins,点击:凭据–>系统–>全局凭据–添加凭据

选择类型为:SSh Username with private key

点击确定,然后查看自动生成的ID:a3672571-97ed-4088-b407-43a9c54d3f5a

6.3、Jenkins保存Harbor访问凭据
因为需要去我们搭建的Harbor私有仓库拉取镜像来部署,因此需要配置凭据运行Jenkins有权限;
选择类型为:Username with password

点击确定,然后查看自动生成的ID:9df0c22e-9cce-4f54-b7d4-ede2a7755fc7

6.4、Jenkins安装Git和Pipeline插件
我在初始化Jenkins的时候已经将这两个插件安装好,如果之前没有安装,在此步骤一定需要装上,后面马上用到
在这里插入图片描述

6.5、创建一个Pipeline示例
主要用于测试Pipeline是否能动态在K8s中创建Jenkins slave;

配置一个通过Pipeline拉取代码的示例:

podTemplate(label: ‘jenkins-slave’, cloud: ‘kubernetes’, containers: [
containerTemplate(
name: ‘jnlp’,
image: “172.16.194.130/library/jenkins-slave-jdk:1.8”
),
],
)
{
node(“jenkins-slave”){
stage(‘拉取代码’){
checkout([$class: ‘GitSCM’, branches: [[name: ‘master’]], userRemoteConfigs: [[credentialsId: “a3672571-97ed-4088-b407-43a9c54d3f5a”, url: “[email protected]:/home/git/app.git”]]])
}
}
}
代码字段说明:

label # 设置一个标签名称,后面node会引用这个标签从而进行stage步骤
cloud # 是我们之前定义的云名称
image # 是我们提交到harbor仓库的Jenkins-slave镜像
stage # 定义动作步骤
credentialsId # 填写创建Git凭据的ID
url # 填写代码仓库地址

保存,点击立即构建:

在构建过程中,会在K8s集群中动态生成一个java-slave Pod:(当Job任务构建完成就会删除这个Pod)

[[email protected] jenkins]# kubectl get pod
NAME READY STATUS RESTARTS AGE
jenkins-slave-9lppw-jlpd5 1/1 Running 0 30s
点击控制台输出:

构建成功,这就测试出了通过Jenkins动态的在Kubernetes中创建代理没有问题,那就可以配置一个完整的持续部署过程了。