我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。
整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero全家桶了。
实战项目地址:github.com/Mikaelemmmm…

1、概述
上一节微服务从代码到k8s部署应有尽有系列 | 风起半山 (930901.xyz),我们已经把gitlab、jenkins、harbor、k8s都已经搭建好了,这一节我们来编写jenkins的pipline将我们的服务通过jenkins完整的发布到k8s中。
2、部署中间件
将mysql、redis、es等部署到k8s之外 , 模拟用作线上独立环境(至于线上你想把某些中间件部署到k8s内部这个自行处理,本次重点是如何将go-zero开发的微服务部署到k8s集群内部),这里我就直接使用项目下的docker-compose-env.yaml了,把所有依赖的第三方中间件环境直接安装在srv-data.com(192.168.1.181)这台服务器,前提是这台服务器已经安装好docker、docker-compose。
登陆到 192.168.1.181
1 | $ mkdir data && cd data && vim docker-compose.yml |
3、独立配置
将每个服务的配置都独立出来,统一放在一个git仓库,这样只给一个人线上仓库的权限,如果线上配置有变直接修改这个仓库的文件,在jenkins做cd的时候,会先拉取代码再拉取对应服务的配置自动构建,具体可以看后面的pipline。
【问】为什么不用配置中心?
1)修改db、redis等需要重启服务,但是有一些配置又不需要重启服务,运维又要去记,记混了比较容易造成线上事故
2)方便回滚。我们发新版本到线上,并且又改了新版本配置。这时候线上用户反馈有问题,线上需要快速回滚的话,如果我们使用将文件构建到镜像中,直接使用k8s一行命令就可以将上一个版本代码加配置直接回滚回来。如果使用了配置中心,回滚了代码,还要将上个版本的配置去配置中心改回来,很麻烦。
独立线上仓库目录结构如下(这个结构是跟pipline中写法相关的)

仓库地址 :github.com/Mikaelemmmm… , 直接下载就好
1、修改配置中的中间件,数据库、redis等都要改成192.168.1.181这台机器,我们把这台机器当成线上环境的中间件。
2、另外一个就是我们的服务发现,线上我们部署在k8s中,go-zero直接支持k8s服务发现,所以不需要etcd等,我们在配置zrpc client的时候,要改成target,k8s的配置方式。
4、编写 jenkins 的 pipline
4.1 配置参数
访问http://192.168.1.180:8989/ 打开jenkins,进入jenkins首页,点击左侧菜单新建Item
我们先创建identity 授权服务的流水线

然后点击“General” , 选择“This project is parameterized” , “添加参数”,“Choice Parameter”,如下图

然后编写内容如下

直接保存。
4.2 编写pipline
向下滑动找到Pipeline script,填写脚本内容
1 | pipeline { |
非常重要!!!
- 构建优化:pipline中生成dockerfile的时候,我们是使用k8s方式部署不需要etcd,但是这种方式部署需要指定账号(有去k8s的endpoints中get的权限,使用默认default就好了,每次创建一个新的命名空间k8s会自动帮我们创建好一个default),但是使用goctl 生成的 k8s yml没有添加指定账号选项,这个已经反馈了,可能后续版本会加上,这里我们也用模版做了,同样模版是在项目目录下github.com/Mikaelemmmm…
- credentialsId要替换为你的具体凭据值,即【添加凭据】模块中的一串字符串,我们之前配置的是gitlab−cert所以这里就填写gitlab−cert,如果你不是这个自己要更换,{credentialsId}要替换为你的具体凭据值,即【添加凭据】模块中的一串字符串,我们之前配置的是gitlab-cert所以这里就填写gitlab-cert,如果你不是这个自己要更换,credentialsId要替换为你的具体凭据值,即【添加凭据】模块中的一串字符串,我们之前配置的是gitlab−cert所以这里就填写gitlab−cert,如果你不是这个自己要更换,{gitUrl}需要替换为你代码的git仓库地址,其他的${xxx}形式的变量无需修改,保持原样即可。
- 这里跟官方文档有一点点不一样,由于我项目文件夹目录不同,goctl生成的dockerfile文件我手动做了点调整,在一个我不是在构建时候生成的dockerfile,是在创建项目时候就把dockerfile一起放在目录下,这样构建镜像时候不需要goctl了
5、配置k8s拉取私有仓库镜像
k8s在默认情况下,只能拉取harbor镜像仓库的公有镜像,如果拉取私有仓库镜像,则是会报ErrImagePull 和 ImagePullBackOff 的错误
1、先在jenkins发布机器登陆harbor
1 | $ docker login 192.168.1.180:8077 |
2、在k8s中生成登陆harbor配置文件
1 | #查看上一步登陆harbor生成的凭证 |
3、对秘钥文件进行base64加密
1 | $ cat /root/.docker/config.json | base64 -w 0 |
4、创建docker-secret.yaml
1 | apiVersion: v1 |
6、构建
我们进入首页,点击idenity进入详情页

然后可以看到,上面我们配置好的identity服务,如下图 ,点击“Build with Parameters”, 然后选择rpc,点击“开始构建”

第一次构建在拉代码时候都会失败,应该是初始化啥东西,再点一次就好了。
部署成功



同样道理,去构建identity-api,再去配置usercenter服务 构建usercenter-rpc、构建usercenter-api,接着配置其他服务、构建即可,本次我们先只构建identity-api、identity-rpc、usercenter-rpc、usercenter-api给大家演示。
6、添加网关
因为我们的api服务通过goctl发布在k8s中都会暴露nodeport端口,索引我们看下k8s中go-zero-looklook命名空间下的service的nodeport端口服务,然后将nodeport配置在nignx即可。
本次我们独立一台虚拟机在k8s之外,安装nginx,将k8s后端api服务通过nodeport方式把端口暴露给nginx,然后nginx在配置中配置此api服务,这样nginx就充当网关使用。
nginx的安装就不再这里多说了,记得一定要有auth_request模块,没有的话自己去安装。
nginx的配置
1 | server{ |
如果是线上的话,应该配置多台nignx保持高可用,在nignx前面还会有一个slb,你的域名包括https配置都应该解析到slb,在slb前面在有防火墙等这些。
8、结束语
至此,整个系列就结束了,整体架构图应该如第一篇所展示,本系列希望能给你带来帮助。
项目地址
欢迎使用go-zero 并 star 支持我们!
微信交流群
关注『微服务实践』公众号并点击 交流群 获取社区群二维码。
作者:万俊峰Kevin 链接:https://juejin.cn/post/7068447983783641102 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。