Fork me on GitHub

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地址
  • Kubernetes服务证书key
    • 如果是在集群之外部署Jenkins的话,需要填写此项,填写api-server CA的证书
  • Kubernetes命名空间
    • 填写default
  • Jenkins地址

五、构建Jenkins-Slave镜像

构建Slave镜像,主要用于加入Master节点,为Master节点的Job分担任务;
该镜像根据需求而定,如果你是编译打包java包,则镜像里需要安装maven编译环境等,如果是编译golang代码,则需要在镜像里安装golang相关的环境;其他环境原理上同。

5.1、构建镜像

构建镜像的Dockerfile文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@k8s-node-129 jenkins-slave]# tree
.
├── Dockerfile
├── jenkins-slave
├── settings.xml
└── slave.jar

0 directories, 4 files
[root@k8s-node-129 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"]

文件内容说明:

执行构建镜像:

1
2
3
4
[root@k8s-node-129 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、推送镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@k8s-node-129 jenkins-slave]# docker images|grep jenkins-slave
172.16.194.130/library/jenkins-slave-jdk 1.8 a2dc6ce3b159 7 minutes ago 531MB

# 需登录harbor仓库后,才有权限推送镜像
[root@k8s-node-129 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

# 推送镜像
[root@k8s-node-129 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
[root@k8s-node-129 jenkins-slave]#

Harbor上的镜像:

六、Jenkins Pipeline构建流水线发布

  • Jenkins Pipeline是一套插件,支持在Jenkins中实现继承和持续交付管道;
  • Pipeline通过特定语法对简单到复杂的传输管道进行建模;
    • 声明式:遵循与Groovy相同语法。pipeline{}
    • 脚本式:支持Groovy大部分功能,也是非常表达和灵活的工具。node{}
  • Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。

6.1、提交代码到Git仓库

在部署Git时我们创建了一个名为app的代码仓库,现在将仓库clone下来:

1
2
3
4
5
[root@k8s-master-128 jenkins]# git clone git@172.16.194.130:/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仓库中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@k8s-master-128 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拉取代码的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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: "git@172.16.194.130:/home/git/app.git"]]])
}
}
}

代码字段说明:

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

保存,点击立即构建:

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

1
2
3
[root@k8s-master-128 jenkins]# kubectl get pod
NAME READY STATUS RESTARTS AGE
jenkins-slave-9lppw-jlpd5 1/1 Running 0 30s

点击控制台输出:

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

-------------本文结束感谢您的阅读-------------