微服务从代码到k8s部署应有尽有大结局(k8s部署)

Posted 微服务实践

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务从代码到k8s部署应有尽有大结局(k8s部署)相关的知识,希望对你有一定的参考价值。

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

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

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

上一节,我们已经把gitlab、jenkins、harbor、k8s都已经搭建好了,这一节我们来编写jenkins的pipline将我们的服务通过jenkins完整的发布到k8s中。

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

将每个服务的配置都独立出来,统一放在一个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的配置方式。

授权服务的流水线

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

然后编写内容如下

直接保存。

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. k8s在默认情况下,只能拉取harbor镜像仓库的公有镜像,如果拉取私有仓库镜像,则是会报 ErrImagePullImagePullBackOff 的错误

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

    我们进入首页,点击idenity进入详情页

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

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

    部署成功

    同样道理,去构建identity-api,再去配置usercenter服务 构建usercenter-rpc、构建usercenter-api,接着配置其他服务、构建即可,本次我们先只构建identity-api、identity-rpc、usercenter-rpc、usercenter-api给大家演示。

    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前面在有防火墙等这些。

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

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

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

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

    微服务从代码到k8s部署应有尽有系列全集

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

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

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

    系统介绍:https://zhuanlan.zhihu.com/p/464544668

    网关:https://zhuanlan.zhihu.com/p/464810481

    鉴权:https://zhuanlan.zhihu.com/p/465690784

    用户中心:https://zhuanlan.zhihu.com/p/465720564

    民宿服务:https://zhuanlan.zhihu.com/p/466923244

    订单服务:https://zhuanlan.zhihu.com/p/467200888

    支付服务:https://zhuanlan.zhihu.com/p/467805751

    各种队列:https://zhuanlan.zhihu.com/p/468061200

    事务精讲:https://zhuanlan.zhihu.com/p/468513367

    错误处理:https://zhuanlan.zhihu.com/p/468992801

    日志收集:https://zhuanlan.zhihu.com/p/470472858

    链路追踪:https://zhuanlan.zhihu.com/p/470686081

    服务监控:https://zhuanlan.zhihu.com/p/471273291

    部署环境:https://zhuanlan.zhihu.com/p/471742493

    k8s部署:https://zhuanlan.zhihu.com/p/472182788

    为了帮助大家更好的掌握微服务开发和 go-zero 的相关知识,我们后续会推出更多的微服务实践相关系列文章。

    同时也热烈欢迎广大 go-zero 用户投稿本公众号,文章的推广也会给文章作者带来人气、同时也可以帮助项目的推广,一般经过本公众号审核通过并推广的项目会有几百 stars。

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

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

    关注我的知乎,所有「微服务实践」公众号的文章勘误都在这里。

    以上是关于微服务从代码到k8s部署应有尽有大结局(k8s部署)的主要内容,如果未能解决你的问题,请参考以下文章

    微服务从代码到k8s部署应有尽有系列(十一日志收集)

    十三,部署微服务到K8S

    k8s+SpringCloud全栈技术:在k8s平台部署亿级高并发的SpringCloud项目

    如何在k8s上部署mongodb微服务

    k8s部署微服务springcloud从0-1(微服务各个组件镜像构建)

    Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务