无题

基于Kubernetes构建持续集成

2.1案例目标

(1)了解Jenkins的离线安装步骤。

(2)掌握GitLab的使用和管理。

(3)了解CICD的配置步骤和方法。

2.2案例分析

1. 规划节点

集群系统的节点规划(IP由平台自动下发),见表2-1。

表2-1节点规划

节点角色 主机名 IP地址 硬盘 内存/CPU
Master、Harbor master 10.24.2.37 100 GB 4G + / 4核+
Node node 10.24.2.24 100 GB 4G + / 4核+
VNC图形化 10.24.32.87

2. 基础准备

(1)实验平台提供双节点镜像操作系统以及VNC图形化界面

(2)FTP服务器地址为http://10.24.1.82/ (实验所需软件包到此下载)

(3)登录实训平台,使用提供的系统登录云主机,并使用提供的软件包chinaskills_cloud_paas.iso部署好双节点Kubernetes集群。

2.3 案例实施

1. 安装Jenkins环境安装Jenkins环境-实操.mp4

(1)基础环境准备

查看Kubernetes集群状态和节点信息:

1
2
3
4
5
6
7
8
9
[root@master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 37m v1.18.1
node Ready <none> 3m59s v1.18.1

将提供的离线包jenkins_offline.tar解压:

1
# tar -zxvf jenkins_offline.tar -C /opt/

导入镜像并上传至Harbor仓库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# cd /opt/
# ll
total 2895432
-rw-r--r-- 1 root root 9506321 Nov 19 2019 apache-maven-3.6.3-bin.tar.gz
dr-xr-xr-x 5 root root 4096 Feb 18 01:49 ChinaskillMall
dr-xr-xr-x 13 root root 4096 Nov 4 09:23 ChinaskillProject
drwxr-xr-x 3 root root 17 Feb 18 02:22 cni
drwx--x--x 4 root root 28 Feb 18 01:56 containerd
drwxr-xr-x 2 root root 69 Feb 18 02:24 dashboard-certs
dr-xr-xr-x 2 root root 6 Feb 18 01:56 docker-compose
dr-xr-xr-x 3 root root 63 Feb 18 02:01 harbor
dr-xr-xr-x 2 root root 4096 Feb 18 01:51 images
-rw------- 1 root root 2955348480 Nov 4 08:59 jenkins.tar
-r-xr-xr-x 1 root root 3049 Feb 18 01:51 k8s_harbor_install.sh
-r-xr-xr-x 1 root root 5244 Feb 18 01:51 k8s_image_push.sh
-r-xr-xr-x 1 root root 1940 Feb 18 01:51 k8s_master_install.sh
-r-xr-xr-x 1 root root 3055 Feb 18 01:51 k8s_node_install.sh
dr-xr-xr-x 4 root root 12288 Feb 18 01:51 kubernetes-repo
drwxr-xr-x 109 root root 8192 Nov 4 09:01 plugins
drwxr-xr-x 32 root root 4096 Nov 4 07:35 repository
dr-xr-xr-x 4 root root 38 Feb 18 01:52 yaml
[root@master opt]# docker load -i jenkins.tar
[root@master opt]# docker images | grep jenkins
10.24.2.37/library/jenkins 2.262-centos f04839b3e211 4 months ago 638MB
jenkins/jenkins 2.262-centos f04839b3e211 4 months ago 638MB
[root@master opt]# docker images | grep gitlab
gitlab/gitlab-ce 12.9.2-ce.0 e6b464b98aff 10 months ago 1.92GB
(2)安装Jenkins

安装Jenkins:

1
2
3
4
5
6
7
8
9
10
11
[root@master ~]# docker run -d --name jenkins -p 8080:8080 -u root \
-v /home/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
-v /usr/bin/kubectl:/usr/local/bin/kubectl \
-v /root/.kube:/root/.kube \
jenkins/jenkins:2.262-centos
//显出容器ID号如下
7d188da4dfd10ccfc21974d78b1ce5abcec11e7814e1bf0124bfb7ed0576f901
[root@master opt]# docker ps | grep jenkins
7d188da4dfd1 jenkins/jenkins:2.262-centos "/sbin/tini -- /usr/…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins

安装插件:

1
2
3
4
5
6
7
8
[root@master ~]# cp -rfv /opt/plugins/ /home/jenkins_home/
[root@master opt]# ll /home/jenkins_home/plugins/
total 229460
……
[root@master opt]# docker restart jenkins
Jenkins
[root@master opt]# docker ps | grep jenkins
9196420bbc91 jenkins/jenkins:2.262-centos "/sbin/tini -- /usr/…" About a minute ago Up 15 seconds 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins

通过实验平台提供的VNC-web端输入http://master-IP:8080访问Jenkins,如图2-1所示:
21.png
图2-1访问Jenkins

查看密码法1:

1
2
[root@master ~]# docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
1de8db07641945e4890558f21cb8e0d3

查看密码法2:

1
2
[root@master ~]# cat /home/jenkins_home/secrets/initialAdminPassword
1de8db07641945e4890558f21cb8e0d3

输入密码并单击“继续”按钮,跳转如图2-2所示:

22.pngimg

图2-2 Jenkins欢迎页面

单击“系统管理→管理用户→新建用户”命令,输入新建用户的信息如图2-3所示:
23.png
图2-3 新建用户

创建完成后用户列表,如图2-4所示:

24.png

图2-4 用户列表

退出admin管理员账户登入,单击“注销”按钮,重新登陆新建的chinaskill普通用户,如图2-5所示:

25.png
图2-5 登录chinaskill用户

2. 部署GitLab部署GitLab-实操.mp4

GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与GitHub类似,GitLab能够浏览源代码,管理缺陷和注释,可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库,团队成员可以利用内置的简单聊天程序(Wall)进行交流。GitLab还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

本项目GitLab与Harbor共用一台服务器。

(1)启动GitLab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 [root@master ~]# docker run -d -h gitlab -p 1022:22 -p 81:80 -p 443:443 \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/gitlab/data:/var/opt/gitlab \
--restart always --name mygitlab gitlab/gitlab-ce:12.9.2-ce.0
//显示如下ID号
1786701a2cb0b6d324a2d9d5142c4304ac291213f2770ecdbb74982a87d28e49
[root@master opt]# docker ps | grep gitlab
1786701a2cb0 gitlab/gitlab-ce:12.9.2-ce.0 "/assets/wrapper" 49 seconds ago Up 48 seconds (health: starting) 0.0.0.0:443->443/tcp, 0.0.0.0:1022->22/tcp, 0.0.0.0:81->80/tcp mygitlab
//看到gitlab服务目前的状态是starting,正在启动中
[root@master opt]# docker logs 063986c0f997
[root@master ~]# docker logs -f 063986c0f997
[root@master opt]# docker ps | grep gitlab
1786701a2cb0 gitlab/gitlab-ce:12.9.2-ce.0 "/assets/wrapper" 11 minutes ago Up 11 minutes (healthy) 0.0.0.0:443->443/tcp, 0.0.0.0:1022->22/tcp, 0.0.0.0:81->80/tcp mygitlab
//如果状态变为healthy,则表示GitLab搭建完成

GitLab启动较慢,差不多需要等待8~10分钟左右,可以通过docker logs容器ID号查看启动状态。启动完成后,在Web端访问GitLab(http://IP:81),如图2-11所示:

211.png

图2-11 Web端访问GitLab

设置root用户密码,最少8位。设置完成后等待跳转页面后使用root用户登录GitLab,如图2-12所示:

212.png
图2-12 登录GitLab

输入登录信息后,等待登录成功,如图2-13所示:

213.png
图2-13 登录跳转

(2)创建项目

单击“Create a project”按钮,创建项目名称为ChinaskillProject,可见等级选择“Public”,如图2-14所示:

214.png
图2-14 创建项目

单击“Create project”按钮,进入项目,如图2-15所示:

215.png
图2-15 进入项目

push源代码到GitLab的ChinaskillProject项目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@master ~]# yum install -y git
[root@master ~]# cd /opt/ChinaskillProject/
[root@master ChinaskillProject]# git config --global user.name "Administrator"
[root@master ChinaskillProject]# git config --global user.email "admin@example.com"
[root@master ChinaskillProject]# git remote remove origin
[root@master ChinaskillProject]# git remote add origin http://10.24.2.37:81/root/chinaskillproject.git
//注意修改此处IP
[root@master ChinaskillProject]# git add .
[root@master ChinaskillProject]# git commit -m "Initial commit"
# On branch master
nothing to commit, working directory clean
[root@master ChinaskillProject]# git push -u origin master
Username for 'http://10.24.2.37:81': root //输入用户名root
Password for 'http://root@10.24.2.37:81': //输入自己设置的root密码,密码看不见
Counting objects: 3192, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1428/1428), done.
Writing objects: 100% (3192/3192), 1.40 MiB | 0 bytes/s, done.
Total 3192 (delta 1233), reused 3010 (delta 1207)
remote: Resolving deltas: 100% (1233/1233), done.
To http://10.24.2.37:81/root/chinaskillproject.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.

刷新网页,ChinaskillProject项目中文件已经更新了,如图2-16所示:

216.png
图2-16 项目文件更新

3. 配置Jenkins连接GitLab配置Jenkins连接GitLab-实操.mp4

(1)设置Outbound requests

登录GitLab首页,单击导航菜单栏中的扳手图标,如图2-17所示:

217.png

图2-17 登录GitLab首页

发什么击“Projects:1”项目名称,如图2-18所示:

218.png
图2-18 Projects:1

再单击左侧导航栏的“Settings→Network”命令,设置“Outbound requests”,勾选“Allow requests to the local network from web hooks and services”,如图2-19所示:

219.png

图2-19设置Outbound requests

配置完成后保存。

(2)创建Gitlab API Token

单击GitLab用户头像图标,在下拉菜单中选择“Settings”命令,如图2-20所示:

220.png
图2-20 设置

跳转如图2-21所示:

221.png
图2-21 用户设置

单击左侧导航栏的“Access Tokens”添加Token,如图2-22所示配置:

222.png
图2-22添加Token

单击“Create personal access token”生成Token,如图2-23所示:

223.png
图2-23 生成Token

复制Token并保存好(GUZ_xJJh9T7DRNXi5phZ),后面配置Jenkins时会用到。

(3)设置Jenkins

登录Jenkins首页,单击“系统管理→全局安全配置→授权策略→任何用户可以做任何事”,单击“应用→保存”按钮,如图2-24所示:

224.png
图2-24授权策略

注意:若单击Jenkins后无法进入指定界面,则因为容器down掉,此时需要重新启动一下相关容器,可选相关操作如下:

1
2
3
4
5
6
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
//一键启动down掉的所有容器
docker update --restart=always $(docker ps -aq)
//批量设置容器自启
docker start jenkins
//保险起见,再次单一启动Jenkins容器,启动比较慢,需要等待5分左右

登录Jenkins首页,单击“系统管理→系统配置”,配置GitLab信息,并取消勾选“Enable authentication for ‘/project’ end-point”复选框,如图2-25所示:

225.png

图2-25系统配置

单击“添加→Jenkins”添加认证信息,类型选择“GitLab API token”,将复制的Gitlab API Token填入,最后单击“添加”按钮,如图2-26所示:

226.png
图2-26 添加认证信息

由Credentials原先的“无”改为“GitLab API token”,如图2-27所示:

227.png
图2-27 Credentials更改

单击“Test Connection”按钮,结果如图2-28所示:

228.png
图2-28 测试连接

测试连接成功后,单击“应用→保存”按钮。

4. 配置Jenkins连接Maven配置Jenkins连接Maven.mp4

(1)安装Maven

由于Jenkins是采用docker in docker的方式启动的,所以需要在Jenkins容器内安装maven:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@master ~]# cp -rf /opt/apache-maven-3.6.3-bin.tar.gz /home/jenkins_home/
[root@master ~]# docker exec -it jenkins bash
[root@344d4fa5b8ea:/]# tar -zxvf /var/jenkins_home/apache-maven-3.6.3-bin.tar.gz -C .
[root@344d4fa5b8ea:/]# mv apache-maven-3.6.3/ /usr/local/maven
[root@344d4fa5b8ea:/]# vi /etc/profile
export M2_HOME=/usr/local/maven # 行末添加两行
export PATH=$PATH:$M2_HOME/bin
[root@344d4fa5b8ea /]# vi /root/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
source /etc/profile # 在此处添加本行
fi

退出容器重新进入:

1
2
3
4
5
6
7
8
9
[root@9196420bbc91 /]# exit 
exit
[root@master ChinaskillProject]# docker exec -it jenkins bash
[root@344d4fa5b8ea /]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_265, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.265.b01-0.el8_2.x86_64/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "3.10.0-862.2.3.el7.x86_64", arch: "amd64", family: "unix"
(2)连接Maven

切换至Jenkins首页,单击“系统管理→全局工具配置”,如图2-29所示:

229.png

图2-29 全局工具配置

单击“新增Maven”按钮,如图2-30所示。取消勾选“自动安装”复选框,填入maven名称和安装路径,配置完成后单击“应用→保存”按钮。

230.png

图2-30 新增Maven

5. 配置CI/CD配置CICD-实操.mp4

(1)新建任务

登录Jenkins首页,单击左侧导航栏“新建任务”,单击“流水线”按钮并输入名称,如图2-31所示,选择构建一个流水线,最后单击“确定”按钮。

231.png

图2-31 新建任务

配置构建触发器,如图2-32所示:

232.png
图2-32 构建触发器

记录下GitLab webhook URL的地址(http://10.24.2.37:8080/project/ChinaskillProject),后期配置Webhook需要使用。

配置流水线,下拉页面至末尾,如图2-33所示:

233.png

图2-33 配置流水线

单击“流水线语法”按钮,如图2-34所示,示例步骤选择“git:Git”,将springcloud项目地址(http://gitlab/root/chinaskillproject.git)修改为(http://10.24.2.37:81/root/chinaskillproject.git)填入仓库URL。

234.png
图2-34 生成流水线脚本

单击“添加→Jenkins”添加凭据,如图2-35所示。类型选择“Username with password”,用户名和密码为GitLab仓库的用户名和密码。

235.png
图2-35添加凭据

添加凭据后选择凭据,然后单击“生成流水线脚本”按钮,如图2-36所示:

236.png

图2-36 生成流水线脚本

生成流水线脚本如图2-37所示:

237.png
图2-37 流水线脚本生成

springcloud项目地址按如图2-38、图2-39、图2-40所示的路径查找:
238.png
图2-38 选择Projects:1

239.png
图2-39 导航栏中选择项目

240.png

图2-40 ChinaskillProject详细信息

记录生成的值,并将其写入流水线脚本中,完整的流水线脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
node{

stage('git clone'){
//check CODE
git credentialsId: 'ad561b3b-5252-43d5-b9c4-ec9bece0134c', url: 'http://10.24.2.10:81/root/ChinaskillProject.git'
}
stage('maven build'){
sh '''/usr/local/maven/bin/mvn package -DskipTests -f /var/jenkins_home/workspace/ChinaskillProject'''
}
stage('image build'){
sh '''
echo $BUILD_ID
docker build -t 10.24.2.10/chinaskillproject/gateway:$BUILD_ID -f /var/jenkins_home/workspace/ChinaskillProject/gateway/Dockerfile /var/jenkins_home/workspace/ChinaskillProject/gateway
docker build -t 10.24.2.10/chinaskillproject/config:$BUILD_ID -f /var/jenkins_home/workspace/ChinaskillProject/config/Dockerfile /var/jenkins_home/workspace/ChinaskillProject/config'''
}
stage('test'){
sh '''docker run -itd --name gateway 10.24.2.10/chinaskillproject/gateway:$BUILD_ID
docker ps -a|grep chinaskillproject|grep Up
if [ $? -eq 0 ];then
echo "Success!"
docker rm -f gateway
else
docker rm -f gateway
exit 1
fi

'''
}
stage('upload registry'){
sh '''docker login 10.24.2.10 -u=admin -p=Harbor12345
docker push 10.24.2.10/chinaskillproject/gateway:$BUILD_ID
docker push 10.24.2.10/chinaskillproject/config:$BUILD_ID'''
}
stage('deploy Rancher'){
//执行部署脚本
sh 'sed -i "s/sqshq\\/piggymetrics-gateway/10.24.2.10\\/chinaskillproject\\/gateway:$BUILD_ID/g" /var/jenkins_home/workspace/ChinaskillProject/yaml/deployment/gateway-deployment.yaml'
sh 'sed -i "s/sqshq\\/piggymetrics-config/10.24.2.10\\/chinaskillproject\\/config:$BUILD_ID/g" /var/jenkins_home/workspace/ChinaskillProject/yaml/deployment/config-deployment.yaml'
sh 'kubectl create ns springcloud'
sh 'kubectl apply -f /var/jenkins_home/workspace/ChinaskillProject/yaml/deployment/gateway-deployment.yaml --kubeconfig=/root/.kube/config'
sh 'kubectl apply -f /var/jenkins_home/workspace/ChinaskillProject/yaml/deployment/config-deployment.yaml --kubeconfig=/root/.kube/config'
sh 'kubectl apply -f /var/jenkins_home/workspace/ChinaskillProject/yaml/svc/gateway-svc.yaml --kubeconfig=/root/.kube/config'
sh 'kubectl apply -f /var/jenkins_home/workspace/ChinaskillProject/yaml/svc/config-svc.yaml --kubeconfig=/root/.kube/config'

}
}

脚本中所有IP均为Harbor仓库的地址,需要根据实际修改。

复制脚本内容至流水线脚本中,删除上述代码中斜体字的内容,并将上述代码中加粗的内容修改为生成的流水线脚本中的内容。

240A.png

240B.png

在网页写入完整的流水线脚本,如图2-41所示,完成后单击“应用→保存”按钮。

241.png
图2-41 保存流水线语法

(2)配置Webhook

登录GitLab,进入springcloud项目,选择“Projects→Your projects”,再单击左侧导航栏“SettingsWebhooks”,将前面记录的GitLab webhook URL地址填入URL处,禁用SSL认证(取消勾选Enable SSL verification),如图2-42、图2-43所示。
242.png

图2-42 进入项目设置

243.png
图2-43配置Webhooks

在上图中单击“Add webhook”按钮添加webhook,完成后如图2-44所示:

244.png

图2-44 添加webhook

在上图中在“Test”下拉菜单中选择“Push events”命令进行测试,如图2-45所示,结果返回HTTP 200则表明Webhook配置成功。

245.png

图2-45 测试成功

(3)创建仓库项目

登录Harbor,新建项目chinaskillproject,访问级别设置为公开,创建完成后如图2-46所示:

246.png
图2-46 登录Harbor仓库

进入项目查看镜像列表,如图2-47所示,此时为空,无任何镜像:

247.png

图2-47进入项目查看镜像列表

6. 触发CI/CD触发CICD-实操.mp4

(1)触发构建

上传代码触发自动构建:

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~]# docker cp /opt/repository/ jenkins:/root/.m2/
[root@master ~]# cd /opt/ChinaskillProject/
[root@master ChinaskillProject]# git add .
[root@master ChinaskillProject]# git commit -m "Initial commit"
[master ec88bf4] Initial commit
1 file changed, 33 insertions(+)
create mode 100644 test
[root@master ChinaskillProject]# git push -u origin master
Username for 'http://10.24.2.37:81': root
Password for 'http://root@10.24.2.37:81':
Branch master set up to track remote branch master from origin.
Everything up-to-date
(2)Jenkins查看

登录Jenkins,可以看到springcloud项目已经开始构建,如图2-48所示:

248.png

图2-48 springcloud项目开始构建

单击项目名称查看流水线阶段视图,如图2-49所示:

249.png
图2-49 查看流水线阶段视图

单击右侧“#1”可查看控制台输出,此处会显示构建的详细进程,如图2-50所示:

250.png

图2-50 显示构建的详细进程

构建完成后控制台输出如图2-51所示:

251.png
图2-51 控制台输出

返回项目查看流水线阶段视图,如图2-52所示:

252.png

图2-52返回项目查看流水线阶段视图

(3)Harbor查看

进入Harbor仓库springcloud项目查看镜像列表,可以看到已自动上传了一个镜像,如图2-53所示:

253.png

图2-53 上传了一个镜像

(4)Kubernetes查看

Pod的启动较慢,需等待3~5分钟。在命令行查看Pod:

1
2
3
4
[root@master ~]# kubectl -n springcloud get pods
NAME READY STATUS RESTARTS AGE
config-897bdd79d-bx8lv 1/1 Running 0 5m18s
gateway-746fbc79b8-sdjjd 1/1 Running 2 5m19s

查看service:

1
2
3
4
[root@master ~]# kubectl -n springcloud get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
config NodePort 10.101.42.47 <none> 8888:30015/TCP 22m
gateway NodePort 10.100.62.39 <none> 4000:30010/TCP 22m

通过端口30010访问服务,如图2-54所示:

254.png

图2-54 端口30010访问服务

至此,完整的CI/CD流程就完成了。