发布流程设计
- 拉取代码
- 编译
- 把jar包打到镜像里
- 部署到k8s平台,写yaml文件
- 暴露你的应用
准备基础环境
- K8S(Ingress Controller,CoreDNS)
- Helm v3
- Gitlab
- Harbor 并启用Chart存储功能
- MySQL(微服务数据库)
- eureka 注册中心
K8S 环境
coredns
1 | [root@k8s-master1 ~]# kubectl get pods -n kube-system |
ingress
1 | [root@k8s-master1 ~]# kubectl get pods -n ingress-nginx |
PV自动供给 NFS
1 | # NFS服务器,每个Node上安装nfs-utils包,用于mount挂载时用 |
1 | # 由于K8S不支持NFS动态供给,还需要先安装上图中的nfs-client-provisioner插件 |
1 | # 创建 pv 动态供给 |
应用包管理器 Helm V3
1 | [root@k8s-master1 opt]# wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz |
1 | # 配置国内Chart仓库 |
1 | # 安装 push 插件 |
微服务数据库 MySQL
1 | [root@k8s-master2]# yum -y install mariadb mariadb-server |
1 | # 将微服务数据库导入 |
代码版本仓库 Gitlab
docker 部署 gitlab
1 | [root@k8s-master2 pinpoint-docker]# mkdir -p /opt/gitlab |
镜像仓库 Harbor
1 | # 之前部署的步骤,按照实际IP填写 |
在 Kubernetes 中部署 Jenkins
1 | 参考: |
- Jenkins 需要持久化存储
- K8S的pod不固定,所以需要持久化存储 pv,pvc
1 | [root@k8s-master1 opt]# unzip jenkins.zip |
1 | [root@k8s-master1 jenkins]# cat deployment.yml |
1 | [root@k8s-master1 jenkins]# cat service.yml |
1 | # 创建 |
1 | # 修改时区 |
Jenkins Pipeline
Jenkins Pipeline 及参数化构建
- Jenkins Pipeline是一套插件,支持在Jenkins中实现集成和持续交付管道;
- Pipeline通过特定语法对简单到复杂的传输管道进行建模;
- 声明式:遵循与Groovy相同语法。pipeline { }
- 脚本式:支持Groovy大部分功能,也是非常表达和灵活的工具。node { }
- Jenkins Pipeline的定义被写入一个文本文件,称为Jenkinsfile。
- 参考
1 | https://jenkins.io/doc/book/pipeline/syntax/ |
安装插件 Jenkins Pipeline
1 | # 修改国内插件源 |
1 | # 安装插件 |
创建测试 Pipeline
- Pipeline 的脚本语法为 Groovy
- 选择一个声明式的用例粘贴出来去修改
1 | # 基础语法 |
参数化构建
1 | # 多个项目部署, 套用一个pipeline,找出不同点 |
流水线生成 git 项目地址
1 | 1. 测试生成 git项目地址 选择框 |
1 | pipeline { |
流水线生成 分支名
1 | # 动态参数化构建 |
流水线生成 部署的机器
1 | pipeline { |
脚本中获取参数
1 | # 通过设置的Name 就是变量名获取值 |
1 | pipeline { |
Jenkins 在 Kubernetes 中动态创建代理
Jenkins Master/Slave架构
- 上面的例子中,所有的动态创建都是在Jenkins服务器中处理完成
- 我们的Jenkins部署在了k8s里,所以是pod里的Jenkins服务 处理的编辑构建等操作
- 如果我们的项目很多,每天都做持续继承的频率也很高,面对大批量的任务处理,1个pod是很难支持的
- 所以我们需要使用 Jenkins Master/Slave架构 , Master负责任务的分配,Slave完成job任务
- Slave 之前是作为一个虚拟机或者物理机存在,它与Master保持通信获取任务,解决 Jenkins 服务问题
1 | [root@k8s-master1 jenkins]# kubectl get pods |
架构说明
- 传统的Jenkins部署完成后, 再在其他的虚拟机上部署几个Jenkins 做为Slave ,在页面的管理节点中配置好
- 当点击job构建的时候 Master将任务分配给Slave去完成,Master 本身没有太大工作压力
- 当用k8s环境的时候,Slave也应该作为pod运行在k8s中,Master的任务交给pod中的Slave去完成
- 考虑到两种运行方式,预先启动和动态创建,预先创建也没有问题,但是会一直消耗资源
- 动态创建Slave,当执行任务的时候,master来组织创建Slave pod ,然后在把任务交给Slave去完成,完成后销毁pod 即开即用,节省资源
动态创建代理
- Kubernetes插件:Jenkins在Kubernetes集群中运行动态代理
1 | 插件介绍:https://github.com/jenkinsci/kubernetes-plugin |
安装插件
- 如果想动态的在k8s中创建Slave pod 需要配置连接参数
- 连接的k8s地址
- 连接的Jenkins地址
配置插件
1 | 1. 系统配置最下面 |
1 | [root@k8s-master1 jenkins]# kubectl get svc |
自定义构建 Jenkins Slave 镜像
1 | 1. 现在 jenkins 已经知道连接 k8s了,现在要考虑如何创建pod代理 |
1 | # 制作镜像需要考虑的事 |
1 | # java 为例 |
1 | # 镜像 如何 作为slave存在 |
1 | [root@k8s-master1 opt]# unzip jenkins-slave.zip |
1 | # docker环境,使用数据卷挂载即可,pod在node上启动,node上都有docker ,docker in docker |
1 | # 构建镜像 |
测试动态创建 slave
1 | 1. 生成创建pod |
1 | pipeline { |
Pipeline 集成 Helm 发布微服务项目
- k8s 动态创建 jenkins slave pod
- jenkins slave pod 完成 拉取代码 -> 代码编译 -> 单元测试 -> 构建镜像 -> Helm部署到k8s
需要的插件
- Git Parameter # 动态从git中后去所有分支
- Git # 拉取代码
- Pipeline # Pipeline
- Config File Provider # 将配置文件存放在 jenkins 里 让Pipeline引用,放到slave pod 中 (kubectl 配置文件 kubeconfig), 直接放到镜像中不太安全
- kubernetes # 动态创建代理
- Extended Choice Parameter # 扩展参数可选配置 (多选)
1 | # 微服务 需要选择的点 |
准备chart目录
1 | [root@k8s-master1 opt]# tar -xf ms-0.1.0.tgz |
1 | # 添加 repo |
1 | # 推送 与 安装Chart |
准备 git 项目 和 源代码
1 | gitlab创建ms项目 |
1 | # 拉取项目到本地 |
修改 Pipeline 默认变量
1 | def registry = "172.31.228.51" |
创建凭据
连接 harbor
连接 gitlab
修改 Pipeline 凭据变量
1 | 1. 这两个凭证 点击更新 复制ID |
把所有的插件 安装好
1 | 所需插件: Git Parameter/Git/Pipeline/Config File Provider/kubernetes/Extended Choice Parameter |
kubeconfig 凭据
1 | # 修改 Pipeline 凭据变量 |
创建新的流水线 ms
1 | # 别忘记修改配置文件的变量 再确认一次 |
1 | # 将文件内容粘贴进入流水线 |
1 | [root@k8s-master1 k8s]# kubectl get pods |
创建新的分支
1 | # 修改下镜像的地址 安装时间服务太慢使用老师的镜像仓库下的镜像 |
部署一个服务测试
1 | [root@k8s-master1 k8s]# kubectl get pods -n ms -o wide |
1 | [root@k8s-master1 k8s]# helm ls -n ms |
1 | # 没问题的话 把剩下的服务 一起部署 |
1 | [root@k8s-master1 templates]# kubectl get pods -n ms -o wide |
手动删除所有服务
1 | # helm 删除 |
1 | # 我修改了数据库连接地址 ms项目中的 重新Git提交 再打包一次 |
回滚思路
1 | 1. 重新部署镜像 |