发布流程设计

- 拉取代码
 - 编译
 - 把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. 重新部署镜像  | 
