我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。

整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero全家桶了。

实战项目地址:https://github.com/Mikaelemmmm/go-zero-looklook

1、概述

上一节,我们已经把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

$ mkdir data && cd data && vim docker-compose.yml
$ docker-compose up -d
$ docker-compose ps #查看确认

3、独立配置

将每个服务的配置都独立出来,统一放在一个git仓库,这样只给一个人线上仓库的权限,如果线上配置有变直接修改这个仓库的文件,在jenkins做cd的时候,会先拉取代码再拉取对应服务的配置自动构建,具体可以看后面的pipline。

【问】为什么不用配置中心?

1)修改db、redis等需要重启服务,但是有一些配置又不需要重启服务,运维又要去记,记混了比较容易造成线上事故

2)方便回滚。我们发新版本到线上,并且又改了新版本配置。这时候线上用户反馈有问题,线上需要快速回滚的话,如果我们使用将文件构建到镜像中,直接使用k8s一行命令就可以将上一个版本代码加配置直接回滚回来。如果使用了配置中心,回滚了代码,还要将上个版本的配置去配置中心改回来,很麻烦。

独立线上仓库目录结构如下(这个结构是跟pipline中写法相关的)

仓库地址 : https://github.com/Mikaelemmmm/go-zero-looklook-pro-conf , 直接下载就好

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,填写脚本内容

pipeline {
agent any
parameters {
gitParameter name: 'branch',
type: 'PT_BRANCH',
branchFilter: 'origin/(.*)',
defaultValue: 'master',
selectedValue: 'DEFAULT',
sortMode: 'ASCENDING_SMART',
description: '选择需要构建的分支'
} stages {
stage('服务信息') {
steps {
sh 'echo 分支:$branch'
sh 'echo 构建服务类型:${JOB_NAME}-$type'
}
} stage('拉取代码') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: '$branch']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'gitlab-cert', url: 'ssh://git@192.168.1.180:2222/root/go-zero-looklook.git']]])
}
} stage('获取commit_id') {
steps {
echo '获取commit_id'
git credentialsId: 'gitlab-cert', url: 'ssh://git@192.168.1.180:2222/root/go-zero-looklook.git'
script {
env.commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
}
} stage('拉取配置文件') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: '$branch']],
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'conf']],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'gitlab-cert', url: 'ssh://git@192.168.1.180:2222/root/go-zero-looklook-pro-conf.git']]])
}
} stage('goctl版本检测') {
steps{
sh '/usr/local/bin/goctl -v'
}
} stage('Dockerfile Build') {
steps{
sh 'yes | cp -rf conf/${JOB_NAME}/${type}/${JOB_NAME}.yaml app/${JOB_NAME}/cmd/${type}/etc' //线上配置文件
sh 'cd app/${JOB_NAME}/cmd/${type} && /usr/local/bin/goctl docker -go ${JOB_NAME}.go && ls -l'
script{
env.image = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}:${commit_id}').trim()
}
sh 'echo 镜像名称:${image} && cp app/${JOB_NAME}/cmd/${type}/Dockerfile ./ && ls -l && docker build -t ${image} .'
}
} stage('上传到镜像仓库') {
steps{
//docker login 这里要注意,会把账号密码输出到jenkins页面,可以通过port.sh类似方式处理,官网文档有这里我就不详细写了
sh 'docker login --username=${docker_username} --password=${docker_pwd} http://${docker_repo}'
sh 'docker tag ${image} ${docker_repo}/go-zero-looklook/${image}'
sh 'docker push ${docker_repo}/go-zero-looklook/${image}'
}
} stage('部署到k8s') {
steps{
script{
env.deployYaml = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}-deploy.yaml').trim()
env.port=sh(returnStdout: true, script: '/root/port.sh ${JOB_NAME}-${type}').trim()
} sh 'echo ${port}' sh 'rm -f ${deployYaml}'
sh '/usr/local/bin/goctl kube deploy -secret docker-login -replicas 2 -nodePort 3${port} -requestCpu 200 -requestMem 50 -limitCpu 300 -limitMem 100 -name ${JOB_NAME}-${type} -namespace go-zero-looklook -image ${docker_repo}/${image} -o ${deployYaml} -port ${port} --home /root/template'
sh '/usr/local/bin/kubectl apply -f ${deployYaml}'
}
} stage('Clean') {
steps{
sh 'docker rmi -f ${image}'
sh 'docker rmi -f ${docker_repo}/${image}'
cleanWs notFailBuild: true
}
}
}
}

非常重要!!!

  1. 构建优化:pipline中生成dockerfile的时候,我们是使用k8s方式部署不需要etcd,但是这种方式部署需要指定账号(有去k8s的endpoints中get的权限,使用默认default就好了,每次创建一个新的命名空间k8s会自动帮我们创建好一个default),但是使用goctl 生成的 k8s yml没有添加指定账号选项,这个已经反馈了,可能后续版本会加上,这里我们也用模版做了,同样模版是在项目目录下https://github.com/Mikaelemmmm/go-zero-looklook/tree/main/deploy/goctl,pipline中构建指定这个模版即可

  2. ${credentialsId}要替换为你的具体凭据值,即【添加凭据】模块中的一串字符串,我们之前配置的是gitlab-cert所以这里就填写gitlab-cert,如果你不是这个自己要更换,${gitUrl}需要替换为你代码的git仓库地址,其他的${xxx}形式的变量无需修改,保持原样即可。

  3. 这里跟官方文档有一点点不一样,由于我项目文件夹目录不同,goctl生成的dockerfile文件我手动做了点调整,在一个我不是在构建时候生成的dockerfile,是在创建项目时候就把dockerfile一起放在目录下,这样构建镜像时候不需要goctl了

5、配置k8s拉取私有仓库镜像

k8s在默认情况下,只能拉取harbor镜像仓库的公有镜像,如果拉取私有仓库镜像,则是会报 ErrImagePullImagePullBackOff 的错误

1、先在jenkins发布机器登陆harbor

$ docker login 192.168.1.180:8077
$ Username: admin
$ Password:
Login Succeeded

2、在k8s中生成登陆harbor配置文件

#查看上一步登陆harbor生成的凭证
$ cat /root/.docker/config.json
{
"auths": {
"192.168.1.180:8077": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
}

3、对秘钥文件进行base64加密

$ cat /root/.docker/config.json  | base64 -w 0

ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTgwOjgwNzciOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=

4、创建docker-secret.yaml

apiVersion: v1
kind: Secret
metadata:
name: docker-login
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTgwOjgwNzciOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=
$ kubectl create -f docker-secret.yaml -n go-zero-looklook

secret "docker-login" created

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的配置

server{
listen 8081;
access_log /var/log/nginx/looklook.com_access.log;
error_log /var/log/nginx//looklook.com_error.log; location /auth {
internal;
proxy_set_header X-Original-URI $request_uri;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_pass http://192.168.1.182:31001/identity/v1/verify/token;
} location ~ /usercenter/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user; proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.182:31002;
} location ~ /travel/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user; proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.182:31003;
} location ~ /order/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user; proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.182:31004;
} location ~ /payment/ {
auth_request /auth;
auth_request_set $user $upstream_http_x_user;
proxy_set_header x-user $user; proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.182:31005;
}
}

如果是线上的话,应该配置多台nignx保持高可用,在nignx前面还会有一个slb,你的域名包括https配置都应该解析到slb,在slb前面在有防火墙等这些。

8、结束语

至此,整个系列就结束了,整体架构图应该如第一篇所展示,本系列希望能给你带来帮助。

项目地址

https://github.com/zeromicro/go-zero

欢迎使用 go-zerostar 支持我们!

微信交流群

关注『微服务实践』公众号并点击 交流群 获取社区群二维码。

微服务从代码到k8s部署应有尽有大结局(k8s部署)的更多相关文章

  1. 微服务低代码Serverless平台(星链)的应用实践

    导读 星链是京东科技消金基础研发部研发的一款研发效能提升的工具平台,面向后端服务研发需求,尤其是集成性.场景化.定制化等难度不太高.但比较繁琐的需求,如服务前端的后端(BFF).服务流程编排.异步消息 ...

  2. 庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署

    庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署 一.简介      我们在上一篇文章<庐山真面目之八微服务架构 NetCore 基于 Dockerfile ...

  3. 微服务从代码到k8s部署应有尽有系列(一)

    从本篇文章开始,我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 实战项目地址:https://github.com/Mikaelemmmm/go-zer ...

  4. 微服务从代码到k8s部署应有尽有系列(二、网关)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  5. 微服务从代码到k8s部署应有尽有系列(三、鉴权)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  6. 微服务从代码到k8s部署应有尽有系列(四、用户中心)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  7. 微服务从代码到k8s部署应有尽有系列(五、民宿服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  8. 微服务从代码到k8s部署应有尽有系列(六、订单服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  9. 微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

随机推荐

  1. SharedPreferences介绍

    sharedPreferences是通过xml文件来做数据存储的.         一般用来存放一些标记性的数据,一些设置信息.        使用sharedPreferences存储数据      ...

  2. AttributeText创建多彩文字Label --- hl

    一般用富文本实现多种花样的Label文字,下图是利用UILabel分类快速创建的多彩多样lable文字,快速简单,自定义性强,更重要的是无代码污染,特别适合轻量级使用 https://github.c ...

  3. JavaScript中this的绑定规则

    JavaScript中this的绑定规则 前言 我们知道浏览器运行环境下在全局作用域下的this是指向window的,但是开发中却很少在全局作用域下去使用this,通常都是在函数中进行使用,而函数使用 ...

  4. Pandas常用操作 - 新增数据列

    初始化测试数据 df = pd.DataFrame({'stu_name': ['Nancy', 'Tony', 'Tim', 'Jack', 'Lucy'], 'stu_age': [17, 16, ...

  5. ios真机弱网测试

    一.开启苹果手机开发者选项 首先你需要将iPhone和一台Mac电脑相连接,然后在Mac上打开Xcode开发工具,此时你iPhone的设置里就会出现"开发者"这个选项了. 二.进入 ...

  6. java+selenium自动化脚本编写

    实训项目:创盟后台管理,页面自动化脚本编写 使用工具:java+selenium 1)java+selenium环境搭建文档 2)创盟项目后台管理系统链接 java+selenium环境搭建 一.Se ...

  7. Solution -「WF2011」「BZOJ #3963」MachineWorks

    \(\mathcal{Description}\)   Link.   给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...

  8. CentOS7搭建ntp时钟服务器

    文章目录 服务器配置 远程客户端配置 服务器配置 # 关闭防火墙,selinux=disabled 1.# 服务器部署 [root@localhost ~]# yum -y install ntp n ...

  9. VMware vSphere,ESXi和vCenter的关系和区别

    VMware Inc.是一家软件公司.它开发了很多产品,尤其是各种云解决方案 .他的云解决方案包括云产品,数据中心产品和桌面产品等. vSphere是在数据中心产品下的一套软件.vSphere类似微软 ...

  10. [Golang]一些书城项目中出现错误的原因和解决办法(三)

    跟着B站尚硅谷的GoWeb教程写书城项目,整理一下自己写的时候出现的错误和解决办法. 错误五:订单管理界面无法显示订单内容. 解决办法:我是直接把 day06 里的 order 文件夹粘贴过来了,or ...