无题 PP要开心 2025-08-27 2022-01-07 基于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)基础环境准备 查看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所示: 图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所示:
图2-2 Jenkins欢迎页面
单击“系统管理→管理用户→新建用户”命令,输入新建用户的信息如图2-3所示: 图2-3 新建用户
创建完成后用户列表,如图2-4所示:
图2-4 用户列表
退出admin管理员账户登入,单击“注销”按钮,重新登陆新建的chinaskill普通用户,如图2-5所示:
图2-5 登录chinaskill用户
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所示:
图2-11 Web端访问GitLab
设置root用户密码,最少8位。设置完成后等待跳转页面后使用root用户登录GitLab,如图2-12所示:
图2-12 登录GitLab
输入登录信息后,等待登录成功,如图2-13所示:
图2-13 登录跳转
(2)创建项目 单击“Create a project”按钮,创建项目名称为ChinaskillProject,可见等级选择“Public”,如图2-14所示:
图2-14 创建项目
单击“Create project”按钮,进入项目,如图2-15所示:
图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所示:
图2-16 项目文件更新
(1)设置Outbound requests 登录GitLab首页,单击导航菜单栏中的扳手图标,如图2-17所示:
图2-17 登录GitLab首页
发什么击“Projects:1”项目名称,如图2-18所示:
图2-18 Projects:1
再单击左侧导航栏的“Settings→Network”命令,设置“Outbound requests”,勾选“Allow requests to the local network from web hooks and services”,如图2-19所示:
图2-19设置Outbound requests
配置完成后保存。
(2)创建Gitlab API Token 单击GitLab用户头像图标,在下拉菜单中选择“Settings”命令,如图2-20所示:
图2-20 设置
跳转如图2-21所示:
图2-21 用户设置
单击左侧导航栏的“Access Tokens”添加Token,如图2-22所示配置:
图2-22添加Token
单击“Create personal access token”生成Token,如图2-23所示:
图2-23 生成Token
复制Token并保存好(GUZ_xJJh9T7DRNXi5phZ),后面配置Jenkins时会用到。
(3)设置Jenkins 登录Jenkins首页,单击“系统管理→全局安全配置→授权策略→任何用户可以做任何事”,单击“应用→保存”按钮,如图2-24所示:
图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所示:
图2-25系统配置
单击“添加→Jenkins”添加认证信息,类型选择“GitLab API token”,将复制的Gitlab API Token填入,最后单击“添加”按钮,如图2-26所示:
图2-26 添加认证信息
由Credentials原先的“无”改为“GitLab API token”,如图2-27所示:
图2-27 Credentials更改
单击“Test Connection”按钮,结果如图2-28所示:
图2-28 测试连接
测试连接成功后,单击“应用→保存”按钮。
(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所示:
图2-29 全局工具配置
单击“新增Maven”按钮,如图2-30所示。取消勾选“自动安装”复选框,填入maven名称和安装路径,配置完成后单击“应用→保存”按钮。
图2-30 新增Maven
(1)新建任务 登录Jenkins首页,单击左侧导航栏“新建任务”,单击“流水线”按钮并输入名称,如图2-31所示,选择构建一个流水线,最后单击“确定”按钮。
图2-31 新建任务
配置构建触发器,如图2-32所示:
图2-32 构建触发器
记录下GitLab webhook URL的地址(http://10.24.2.37:8080/project/ChinaskillProject),后期配置Webhook需要使用。
配置流水线,下拉页面至末尾,如图2-33所示:
图2-33 配置流水线
单击“流水线语法”按钮,如图2-34所示,示例步骤选择“git:Git”,将springcloud项目地址(http://gitlab/root/chinaskillproject.git)修改为(http://10.24.2.37:81/root/chinaskillproject.git)填入仓库URL。
图2-34 生成流水线脚本
单击“添加→Jenkins”添加凭据,如图2-35所示。类型选择“Username with password”,用户名和密码为GitLab仓库的用户名和密码。
图2-35添加凭据
添加凭据后选择凭据,然后单击“生成流水线脚本”按钮,如图2-36所示:
图2-36 生成流水线脚本
生成流水线脚本如图2-37所示:
图2-37 流水线脚本生成
springcloud项目地址按如图2-38、图2-39、图2-40所示的路径查找: 图2-38 选择Projects:1
图2-39 导航栏中选择项目
图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仓库的地址,需要根据实际修改。
复制脚本内容至流水线脚本中,删除上述代码中斜体字的内容,并将上述代码中加粗的内容修改为生成的流水线脚本中的内容。
在网页写入完整的流水线脚本,如图2-41所示,完成后单击“应用→保存”按钮。
图2-41 保存流水线语法
(2)配置Webhook 登录GitLab,进入springcloud项目,选择“Projects→Your projects”,再单击左侧导航栏“SettingsWebhooks”,将前面记录的GitLab webhook URL地址填入URL处,禁用SSL认证(取消勾选Enable SSL verification),如图2-42、图2-43所示。
图2-42 进入项目设置
图2-43配置Webhooks
在上图中单击“Add webhook”按钮添加webhook,完成后如图2-44所示:
图2-44 添加webhook
在上图中在“Test”下拉菜单中选择“Push events”命令进行测试,如图2-45所示,结果返回HTTP 200则表明Webhook配置成功。
图2-45 测试成功
(3)创建仓库项目 登录Harbor,新建项目chinaskillproject,访问级别设置为公开,创建完成后如图2-46所示:
图2-46 登录Harbor仓库
进入项目查看镜像列表,如图2-47所示,此时为空,无任何镜像:
图2-47进入项目查看镜像列表
(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所示:
图2-48 springcloud项目开始构建
单击项目名称查看流水线阶段视图,如图2-49所示:
图2-49 查看流水线阶段视图
单击右侧“#1”可查看控制台输出,此处会显示构建的详细进程,如图2-50所示:
图2-50 显示构建的详细进程
构建完成后控制台输出如图2-51所示:
图2-51 控制台输出
返回项目查看流水线阶段视图,如图2-52所示:
图2-52返回项目查看流水线阶段视图
(3)Harbor查看 进入Harbor仓库springcloud项目查看镜像列表,可以看到已自动上传了一个镜像,如图2-53所示:
图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所示:
图2-54 端口30010访问服务
至此,完整的CI/CD流程就完成了。