在上一节《一套适用于 CI 的 Go项目容器化构建方案》中我们介绍了怎么能把Go项目按 Git Tag 打包成 Docker 镜像,这也是让项目能在K8s上运行的基础。这一节我们通过实践操作演示一下怎么把我们的项目部署到K8s上运行。
本文节选自我的专栏《Go项目搭建和整洁开发实战》欢迎扫码订阅解锁更多内容。

订阅后除了加入实战项目外,还可加入专属读者群一起学习。
K8s 基础
K8s现在在各家公司的普及度已经很高,网上介绍它的资料也有很多,那什么是K8s呢?它的本名叫Kubernetes(单词太长,后面还是用 K8s 代替 )是一个基于容器技术的分布式架构方案。
它具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和线上扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
总结一句话:是一套结合了容器编排和集群调度管理的大规模分布式系统解决方案。
在K8s 中会把各种资源抽象成对象--简而言之就是面向对象,大到集群的节点(Node)、小到配置项 (ConfigMap) 都是对象,常用的有以下对象。

Pod是K8s 里的最小调度单元,Pod里面则是容器(一个Pod里可以有多个容器,但只有一个主容器,其他都是辅助它的)。
控制器则是管理 Pod 用的,对于我们来说常用的控制器只有Deployment,它能够控制Pod的滚动更新。

Deployment 是一个复合型的控制器,它包装了一个叫做 ReplicaSet -- 副本集的控制器。ReplicaSet 管理正在运行的Pod数量,Deployment 在其之上实现 Pod 滚动更新,对Pod的运行状况进行健康检查以及回滚更新的能力。他们三者之间的关系可以用下面这张图表示。

这里我就不再过多介绍K8s的一些基础知识啦,如果你对这些内容有兴趣,可以阅读以下我之前写过的一些K8s的文章,里面还引用了很多我学K8s时记录的一些比较基础的内容,推荐大家仔细阅读一下:
另外还有就是K8s的操作都是通过kubectl 把指令提交给集群的,这里汇总了一些比较常用的kubectl命令
kubectl apply -f xxx.yaml 让K8s 创建在集群里按配置文件创建/更新资源对象
kubectl get pod | deploy | svc | ingress 查看集群中的pod、Deployment、Service、Ingress 资源的状态
kubectl describe pod | deploy | svc | ingress {$objectName} 查看具体资源对象当前的详细信息
kubectl delete pod | deploy | svc | ingress {$objectName} 删除指定对象
Go Mall 项目部署到 K8s
接下来我们演示一下怎么把我们专栏的项目部署到K8s上,首先说明一点,因为我们项目依赖的MySQL和Redis都是在本地电脑上安装的,把项目部署到容器后就没办法再用本地电脑上的MySQL和Redis了,所以在演示项目的K8s部署和运行时还需要把MySQL在Redis都部署到K8s上,这样他们才能在集群内部通信。
所以我们首先把项目中 application.test.yaml 的数据库和Redis的连接配置做一个更改:
app:
......
database:
master:
type:mysql
#通过k8s service name连接, 在k8s集群内的管理 mysql pod的service名是mysql
dsn:root:superpass@tcp(mysql:3306)/go_mall?charset=utf8&parseTime=True&loc=Asia%2FShanghai
maxopen:100
maxidle:10
maxlifetime:300000000000
redis:
addr:redis:6379#通过k8s service name连接, 在k8s集群内的管理 redis pod的service名是redis
password:123456
pool_size:
这也就意味着我们把项目部署到K8s时,还需要给它指定ENV环境变量为test,这样才能应用上这个配置文件。
接下来我们就看一下go-mall项目的 Deployment 文件的定义
apiVersion: apps/v1
kind:Deployment
metadata:
name:go-mall
spec:
replicas:2
selector:
matchLabels:
app:go-mall-app
template:
metadata:
labels:
app:go-mall-app
spec:
containers:
-name:go-mall-container
image:go-mall:v202501111557
env:
-name:ENV
value:test
resources:
limits:
memory:"200Mi"
cpu:"50m"
ports:
-containerPort:8080
volumeMounts:
-name:app-log
mountPath:/home/applog
volumes:
-name:app-log
hostPath:
path:/tmp/applog
type:DirectoryOrCreate
Deployment中template下的配置是关于Pod的定义,其中容器镜像指定的是 go-mall:v202501111557,我们每次发版本部署的时候都会给这个镜像版本,然后再提交给K8s集群让他们负责滚动更新。
env选项中我们指定了ENV=test的环境变量,此外我们还把容器中的日志文件目录/home/applog 挂载到了电脑上的/tmp/applog目录。
把项目部署到K8s上去后,如果不做任何操作它只能在K8s的集群内部访问,如果想要在集群外部能访问就需要用Service把它们暴露出来。
apiVersion: v1
kind:Service
metadata:
name:go-mall-svc
spec:
type:NodePort
selector:
app:go-mall-app
ports:
-name:http
protocol:TCP
nodePort:32080
port:8080
targetPort:8080
这个Service服务管理标签为 app: go-mall-app 的Pod,并把它们通过端口32080暴露到集群外部。
好了关于项目的K8s配置介绍的差不多了,但是我们现在还不能把它们提交给K8s,需要先把依赖的MySQL和Redis部署上去。这里我给大家准备好了运行整个项目需要的全套K8s配置,点下面的链接即可下载:https://github.com/user-attachments/files/18385362/go-mall-k8s.zip
需订阅专栏后联系我开通项目权限才能访问
下载解压后,项目的目录如下:

部署到K8s后怎么调试
把我们的项目部署到K8s后,因为在容器中运行,想要调试就没有在本地IDE里那么方便了,这里介绍几个必要的命令帮助大家调试。
首先是kubctl get pods | grep go-mall 来查看现在正运行着go-mall项目的Pod,上面我们讲解过,我们给项目分配了两个复制集,所以这个命令会显示出两个Pod。
如果我们想要要登录到其中一个Pod中,那么需要我们执行以下命令(注意下面的Pod名称 go-mall- 后面是随机的,执行时记得换成自己当时查看到的Pod名称)
kubectl exec -it go-mall-6459549b69-cmwsb -- /bin/sh
假如说我们通过kubectl get pods 查看Pod时发现 go-mall-6459549b69-cmwsb 这个Pod 启动失败了,大概率是项目启动时有问题,那么这个时候需要我们查看Pod当时写到标准输出中的日志,怎么查看呢?用下面这个命令。
kubectl logs go-mall-6459549b69-cmwsb
执行的时候也是记得要换成自己的Pod名哦,不要直接抄过去。
本文节选自我的专栏《Go项目搭建和整洁开发实战》欢迎扫码订阅

订阅后除了加入实战项目外,还可加入专属读者群一起学习。
《Go项目搭建和整洁开发实战》专栏分为五大部分,重点章节如下

第一部分介绍让框架变得好用的诸多实战技巧,比如通过自定义日志门面让项目日志更简单易用、支持自动记录请求的追踪信息和程序位置信息、通过自定义Error在实现Go error接口的同时支持给给错误添加错误链,方便追溯错误源头。
第二部分:讲解项目分层架构的设计和划分业务模块的方法和标准,让你以后无论遇到什么项目都能按这套标准自己划分出模块和逻辑分层。后面几个部分均是该部分所讲内容的实践。
第三部分:设计实现一个套支持多平台登录,Token泄露检测、同平台多设备登录互踢功能的用户认证体系,这套用户认证体系既可以在你未来开发产品时直接应用
第四部分:商城app C端接口功能的实现,强化分层架构实现的讲解,这里还会讲解用责任链、策略和模版等设计模式去解决订单结算促销、支付方式支付场景等多种多样的实际问题。
第五部分:单元测试、项目Docker镜像、K8s部署和服务保障相关的一些基础内容和注意事项。
扫描上方二维码或者访问 https://xiaobot.net/p/golang 即刻订阅
此外想更详细地了解专栏内容,咨询专栏优惠,都可以添加下面我的微信