Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Jenkins+Gitlab+Harbor+Rancher+k8s CI/CD实现

基于Jenkins+Gitlab+Harbor+Rancher+k8s CI/CD实现

作者头像
py3study
发布于 2020-06-18 02:48:02
发布于 2020-06-18 02:48:02
4.3K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、概述

讲正文开始前先回顾一下以往传统的代码部署方式。

     通常运维人员在接到代码(新项目)上线的任务前都要做大量的准备工作,包括:物理主机、虚拟机、代码运行环境、数据库安装配置、各种帐号创建,、运行后期的系统监控、应用的日志收集,性能优化等一系列的工作。

想一想这个流程不是很复杂但是很繁琐,效率低下,如需要调试还需要给开发人员提供线上系统权限等等,细节没有注意的话,还会造成解决问题的难度等各种问题。

OK,说完以上的问题,那接下来就有相对应的解决方案。

方案大概的架构组成:

Jenkins+Gitlab+Harbor+Rancher+k8s 

各个组件的功能描述

Jenkins

(1)下载gitlab中项目代码

(2)负载执行镜像的构建、上传下载

(3)部署到k8s集群

Gitlab

(1)项目代码以及配置

(2)Dockerfile文件

Harbor

这个是vmware公司开源的docker镜像仓库管理系统,比较方便管理维护镜像

(1)负责构建后镜像的存储

Rancher

容器编排管理工具

(1)更新stack/service

(2)实现服务的扩容缩容

k8s

(1)简化应用部署 (2)提高硬件资源利用率 (3)健康检查和自修复 (4)自动扩容缩容 (5)服务发现和负载均衡

架构图

架构图说明

项目开发语言是java,使用了比较流行的spring boot框架,manven更新源采用阿里云,编译生成jar文件

① 开发人员提交代码到gitlab

② 手动执行jenkins构建(或者gitlab钩子触发jenkins执行构建),下载最新版本的代码,代码里面包含Dockerfile

③ jenkins执行shell脚本:mvn编译生成jar文件。通过docker build 指令打包成镜像

④ 上传构建好的镜像push到harbor镜像仓库

⑤ jenkins远程到k8s master节点,更新service镜像地址,达到更升级容器的目的(也就是更新代码版本)。

以上流程完整的实现了CI/CD,这里主要是jenkins部分是关键位置之一。

二、准备环境

环境说明

系统

ip

主机名

配置

版本

CentOS 7.6

10.212.20.94

k8s-master

2核4g

Kubernetes1.18.1

CentOS 7.6

10.212.20.240

k8s-node01

2核4g

Kubernetes1.18.1

CentOS 7.6

10.212.82.89

jenkins

2核4g

2.222.4

CentOS 7.6

10.212.82.90

gitlab

2核4g

10.5.1

CentOS 7.6

10.212.82.86

harbor

2核4g

v2.0.0

CentOS 7.6

10.212.82.87

rancher

2核4g

v2.4.3

关于k8s 1.18.1安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/12696740.html

关于jenkins安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/13032339.html

关于Gitlab和Harbor安装,请自行百度

关于rancher安装以及导入现有k8s集群,请参考链接:

https://www.cnblogs.com/xiao987334176/p/12965945.html

项目说明

基于Spring Boot/Spring Security/thymeleaf的通用后台管理系统

项目地址:

https://github.com/jonsychen/admin

此项目依赖于mysql,因此需要提前在Rancher里面部署mysql才行。

三、Rancher操作

mysql部署

登录k8s-node01主机,创建数据目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /data/mysql/data

访问Harbor后台,点击部署服务

端口映射

设置环境变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TZ=Asia/Shanghai
MYSQL_ROOT_PASSWORD=abcd@1234

数据卷映射

 点击启动

代码配置

下载代码:https://github.com/jonsychen/admin

解压之后,进入目录admin-master\src\main\resources

修改application-default.yaml,修改红色部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 8088
  compression:
    enabled: true
  connection-timeout: 3000

debug: false

##登录记住我的token加密key
remember:
  key: yintong
##actuator config,actuator运行在一个独立的webappcontext中,see AnnotationConfigEmbeddedWebApplicationContext
management:
  context-path: /management
  security:
    enabled: false

spring:
  application:
    name: admin
  datasource:
    url: jdbc:mysql://db-mysql.default.svc.cluster.local:3306/admin?characterEncoding=utf-8
    username: root
    password: abcd@1234

说明:

port: 8088 项目运行的端口号

db-mysql.default.svc.cluster.local 表示db-mysql服务的svc地址。

格式说明:服务名.命令空间.default.svc.cluster.local ,其中服务名和命名空间是根据实际情况来的,后半部分是固定的。这一长串域名,会解析为svc地址。

password: abcd@1234 mysql的root用户密码

application-prod.yaml的配置修改同上。

在此项目的根目录创建dockerfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
ADD admin-0.1.0.jar /

EXPOSE 8088
ENTRYPOINT [ "java","-jar","/admin-0.1.0.jar"]

此时顶层目录结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# tree -L 1
.
├── dockerfile
├── etc
├── pom.xml
├── README.md
└── src

将此项目代码,提交到gitlab中。

sql导入

登录k8s-master节点,查看svc映射端口。因为使用Rancher部署mysql时,nodeport端口是随机的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# kubectl get svc
NAME                    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
db-mysql                ClusterIP   10.1.116.0    <none>        3306/TCP         61s
db-mysql-nodeport       NodePort    10.1.86.36    <none>        3306:31959/TCP   61s
kubernetes              ClusterIP   10.1.0.1      <none>        443/TCP          20d

可以看到随机映射的端口是31959

使用navicat软件连接mysql

新建数据库book

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create database admin default character set utf8mb4 collate utf8mb4_unicode_ci;

进入book,执行项目中的sql文件,路径为:etc/ddl.sql

执行成功后,表如下:

Harbor配置

新建一个项目java,访问级别是公开。注意:设置公开后,下载镜像不需要认证。

推送镜像

进入jenkins主机,下载gitlab代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone ssh://git@10.212.20.94:/home/git/git_storage/admin-master

修改docker配置,增加Harbor库地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/docker/daemon.json

增加insecure-registries

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"insecure-registries": ["192.168.10.122"]}

重启服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl restart docker

登录Harbor,否则无法推送镜像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker login 10.212.82.86:1180

进入项目目录,使用mvn编译代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn -f pom.xml clean package

推送镜像,执行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp dockerfile target/cd target
docker build -t 10.212.82.86:1180/java/admin-master:1 .
docker push 10.212.82.86:1180/java/admin-master:1docker rmi 10.212.82.86:1180/java/admin-master:1

admin-master部署

登录k8s-node01节点

修改docker配置,增加Harbor库地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/docker/daemon.json

增加insecure-registries

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"insecure-registries": ["192.168.10.122"]}

重启服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl restart docker

访问Rancher后台,点击部署服务

 端口映射

 点击启动

 等待几分钟,Running表示运行正常。

登录k8s-master节点,查看svc映射端口。因为使用Rancher部署时,nodeport端口是随机的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# kubectl get svc
NAME                    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
admin-master            ClusterIP   10.1.10.23    <none>        8088/TCP         10m
admin-master-nodeport   NodePort    10.1.238.46   <none>        8088:31581/TCP   10m
db-mysql                ClusterIP   10.1.116.0    <none>        3306/TCP         61s
db-mysql-nodeport       NodePort    10.1.86.36    <none>        3306:31959/TCP   61s
kubernetes              ClusterIP   10.1.0.1      <none>        443/TCP          20d

可以看到nodeport映射的随机端口是31581

访问admin-master

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://10.212.20.94:31581/

 输入用户名和密码,都是root

首页效果如下:

四、jenkins操作

前面已经通过Rancher部署了mysql和admin-master,接下来演示一下,如何通过jenkins实现基于Pipeline,实现发布和回滚。

安装插件Git Parameter 

新建一个job,名称为:test_admin,选择流水线。

通用设置

参数化构建

Pipeline脚本

完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
env.CREDENTIALSID = '7a294fc5-2b2b-4d2d-92ff-54324e1b032a'
env.BRANCHES = 'master'
env.GIT_URL = 'ssh://git@10.212.20.94:/home/git/git_storage/admin-master'
env.HARBOR_PROJECT = '10.212.82.86:1180/java/admin-master'
env.PROJECT = 'admin-master'
env.K8S_MASTER = '10.212.20.94'
env.NAMESPACE = 'default'
node {
   if (env.Status == 'Deploy'){
       stage('code pull') {
           checkout([$class: 'GitSCM', branches: [[name: env.BRANCHES]],
           doGenerateSubmoduleConfigurations: false,
           userRemoteConfigs: [[credentialsId: env.CREDENTIALSID, url: env.GIT_URL]]])
       }
       stage('code Build') {
         sh 'mvn -f pom.xml clean package'
       }
       stage('docker push') {
         sh 'cd ${WORKSPACE} && cp dockerfile target'
         sh 'cd ${WORKSPACE}/target && docker build -t ${HARBOR_PROJECT}:${BUILD_NUMBER} .'
         sh 'docker push ${HARBOR_PROJECT}:${BUILD_NUMBER}'
         sh 'docker rmi ${HARBOR_PROJECT}:${BUILD_NUMBER}'
       }
       stage('k8s deploy') {
         sh 'ssh ${K8S_MASTER} "kubectl -n ${NAMESPACE} set image deploy ${PROJECT} *=${HARBOR_PROJECT}:${BUILD_NUMBER}"'
       }
   }else{
       stage('k8s rollback') {
           sh 'ssh ${K8S_MASTER} "kubectl -n ${NAMESPACE} set image deploy ${PROJECT}*=${HARBOR_PROJECT}:${BUILD_ID}"'
       }
   }
}

根据实际情况,修改红色文字参数,也就是全局变量。

说明:

7a294fc5-2b2b-4d2d-92ff-54324e1b032a 这个是jenkins全局凭据,针对gitlab设置的。

点击构建

直接点击构建

构建成功后,效果如下:

如果需要回滚到上一个版本,输入BUILD_ID。

由于最近成功一次的BUILD_ID是10,所以输入9

效果如下:

本文参考链接:

https://blog.51cto.com/andylhz2009/2053741

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jenkins Redeploy Rancher2.x Workload插件实现CI/CD
https://www.cnblogs.com/xiao987334176/p/13074198.html
py3study
2020/07/07
1.8K0
Jenkins+harbor+gitlab+k8s 部署maven项目
由于资源紧张,Jenkins+harbor合并为一台了。实际上,应该是要单独部署的。
py3study
2020/03/06
3.4K2
三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/12/24
6.2K2
三万字无坑搭建基于Docker+K8S+GitLab/SVN+Jenkins+Harbor持续集成交付环境!!
Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台(持续集成部署Hexo博客Demo)
如果你讨厌一个人,你实际讨厌的是你自己的某些部分。我们自身没有的东西,是不会干扰到我们的。仁者见仁,智者见智。——德尔曼 黑塞《德米安》
山河已无恙
2023/03/02
2.6K0
基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD
我们利用 Kubernetes 来动态运行 Jenkins 的 Slave 节点,可以和好的来解决传统的 Jenkins Slave 浪费大量资源的缺点。之前的示例中我们是将项目放置在 Github 仓库上的,将 Docker 镜像推送到了 Docker Hub,这节课我们来结合我们前面学习的知识点来综合运用下,使用 Jenkins、Gitlab、Harbor、Helm、Kubernetes 来实现一个完整的持续集成和持续部署的流水线作业。
jwangkun
2021/12/23
2.7K0
基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD
Gitlab+Jenkins+k8s+Helm 的自动化部署实践
本文从实践角度介绍如何结合我们常用的 Gitlab 与 Jenkins,通过 K8s 来实现项目的自动化部署,示例将包括基于 SpringBoot 的服务端项目与基于 Vue.js 的 Web 项目。
kubernetes中文社区
2021/11/12
3.8K0
下篇:使用jenkins发布go项目到k8s,接上篇的手工体验改造为自动化发布
本篇在 《上篇:带你手工体验从写代码、编译、打包镜像、部署到K8S的全过程》 的基础上,将手动的过程通过jenkins工具将其改造成自动化。
不背锅运维
2023/05/10
9270
下篇:使用jenkins发布go项目到k8s,接上篇的手工体验改造为自动化发布
CI/CD: 基于 Jenkins + Gitlab 持续部署
通常运维人员在接到代码(新项目)上线的任务前都要做大量的准备工作,包括:物理主机、虚拟机、代码运行环境、数据库安装配置、各种帐号创建,运行后期的系统监控、应用的日志收集,性能优化等一系列的工作。
DevOps时代
2019/10/24
2.4K0
CI/CD: 基于 Jenkins + Gitlab 持续部署
Kubernetes配合Jenkins实现轻量自动持续集成
之前写的Spinnaker自动化部署,部署复杂,依赖环境多,所以才有这一篇比较轻量级的自动化持续集成,需要用到的环境有Kubernetes-1.23、harbor、Jenkins、Helm、gitlab都是devops常见组件。
王先森sec
2023/04/24
3K0
Kubernetes配合Jenkins实现轻量自动持续集成
K8S容器环境下GitLab-CI和GItLab Runner 部署记录
注意:本示例部署所涉及到的image镜像均导入到Harbor私有私仓(172.16.60.230) 。
洗尽了浮华
2021/04/01
7.8K0
K8S容器环境下GitLab-CI和GItLab Runner 部署记录
kubernetes 基于jenkins spinnaker的ci/cd实践一增加制品镜像扫描
早期jenkins承担了kubernetes中的ci/cd全部功能Jenkins Pipeline演进,这里准备将cd持续集成拆分出来到spinnaker!
对你无可奈何
2021/11/20
1.1K0
Gitlab CI 集成 Kubernetes
首先将本节所用到的代码库从 Github 上获得:cnych/gitlab-ci-k8s-demo,可以在 Gitlab 上新建一个项目导入该仓库,当然也可以新建一个空白的仓库,然后将 Github 上面的项目 Clone 到本地后,更改远程仓库地址即可:
jwangkun
2021/12/23
1.7K0
Gitlab CI 集成 Kubernetes
kubernetes(二十一) 微服务链路监控& 自动发布
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。这些服务可能不同编程语言开发,不同团队开发,可能部署很多副本。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。全链路监控组件就在这样的问题背景下产生了。 全链路性能监控 从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便找到故障产生的源头,生产上可极大缩短故障排除时间。
alexhuiwang
2020/09/23
3K1
kubernetes(二十一) 微服务链路监控& 自动发布
Jinkens+gitlab针对k8s集群实现CI/CD
Jenkins采用war包的方式部署,需要用到tomcat环境,自行参考博文,进行部署;
小手冰凉
2020/09/21
1.1K0
通过jenkins交付微服务到kubernetes
随着Kubernetes的遍地开花,Kubernetes的优势可以说是深入人心,很多企业也是利用Kubernetes,来实现更高效的交付和更好地提高我们的资源使用率,推动标准化,适应云原生。
星哥玩云
2022/08/08
2.1K0
通过jenkins交付微服务到kubernetes
【Kubernetes系列】第9篇 CI/CD之全流程实践
注: 本次示例使用的gitlab项目地址为:http://gitlab.hanker.com/colynn/hanker-hello.git
HankerCloud
2019/10/28
1.3K0
【Kubernetes系列】第9篇 CI/CD之全流程实践
基于 Kubernetes/Jenkins/Harbor/SonarQube 搭建微服务CI/CD系统
https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
DevOps时代
2019/07/05
1.8K0
基于 Kubernetes/Jenkins/Harbor/SonarQube 搭建微服务CI/CD系统
Springcloud +Gitlab+ Rancher2.0+Kubernetes微服务持续集成
环境 Centos7.0 准备工作 序号 IP地址 主机名称 角色 A 192.168.100.10 gitlab gitlab、gitlab-runner、docker本地仓库、(K8S-Master) B 192.168.100.11 rancher rancher、k8s节点服务器1 C 192.168.100.12 node1 k8s节点服务器2 D 192.168.100.13 node2 k8s节点服务器3 E 192.168.100.14 node3 k8s节点服务器4 01
江冬勤
2020/03/02
1.2K0
DevOps整合Jenkins+k8s+CICD
基于现在的互联网现状,更推崇敏捷式开发,这样就导致项目的迭代速度更快,但是由于开发团队与运维团队的沟通问题,会导致新版本上线的时间成本很高。这又违背的敏捷式开发的最初的目的。 那么如果让开发团队和运维团队整合到成一个团队,协同应对一套软件呢?这就被称为DevOps。 DevOps,字面意思是Development &Operations的缩写,也就是开发&运维。 然字面意思只涉及到了开发团队和运维团队,其实QA测试团队也是参与其中的。 网上可以查看到DevOps的符号类似于一个无穷大的符号
IT运维技术圈
2022/10/24
3K1
前后端分离架构+k8s+ingress
https://www.cnblogs.com/xiao987334176/p/12195722.html
py3study
2020/03/25
2K0
前后端分离架构+k8s+ingress
推荐阅读
相关推荐
jenkins Redeploy Rancher2.x Workload插件实现CI/CD
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验