使用k8s部署弹性伸缩golang服务
在项目部署的过程中我们会用到k8s, 所以让我们用他从0到1部署一个golang服务
- 简单实现一个服务
import (
"github.com/gin-contrib/pprof"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
router := gin.New()
pprof.Register(router)
router.GET("/healthCheck", func(ctx *gin.Context) {
ctx.String(http.StatusOK, "hello,k8s")
})
router.Run(":18081")
}
- 接下来将该服务进行镜像打包,dockerfile内容为
ARG REPO=k8sdemo
FROM golang:alpine3.15 as builder
MAINTAINER liuzhiqiang "liuzhiqiang@geek.com"
# docker中的工作目录
WORKDIR $GOPATH/src
# 将当前目录同步到docker工作目录下,也可以只配置需要的目录和文件(配置目录、编译后的程序等)
ADD . ./
# 由于所周知的原因,某些包会出现下载超时。这里在docker里也使用go module的代理服务
ENV GO111MODULE=on GOPROXY="https://goproxy.cn" CGO_ENABLED="0"
# 指定编译完成后的文件名,可以不设置使用默认的,最后一步要执行该文件名
RUN go build -o main .
EXPOSE 18081
ENTRYPOINT ["./main"]
-
使用打包命令构建镜像 docker build -t liuqiangdocker/k8sdemo:v1 ./ 如图所示
1. -t 表示给镜像打标签 2. liuqiangdocker 表示docker的用户名,记得替换你的 3. ./表示dockerfile的所在目录
-
将镜像推到远程仓库 docker push liuqiangdocker/k8sdemo:v1
-
有了镜像地址之后我们就可以部署k8s了,首先创建一个deployment.yaml,具体内容如下
apiVersion: v1 kind: Service metadata: namespace: mssiot name: k8sdemo labels: app: k8sdemo spec: ports: - port: 18081 name: tcp-18081 protocol: TCP targetPort: 18081 nodePort: 30001 selector: app: k8sdemo type: NodePort
-
查看我们创建的pod: kubectl get pods -n mssiot
-
再创建一个service,该service允许我们从外部访问该服务 service.yaml
apiVersion: v1 kind: Service metadata: namespace: mssiot name: k8sdemo labels: app: k8sdemo spec: ports: - port: 18081 name: tcp-18081 protocol: TCP targetPort: 18081 nodePort: 30001 selector: app: k8sdemo type: NodePort
-
查看我们创建的service: kubectl get svc -n mssiot
-
此时我们通过局域网IP地址:nodeport端口访问 http://192.168.31.55:30001/healthCheck
大功告成!
-
如果我们发现服务器的流量突然增大,那么此时我们应该动态增加pod来降低服务器的响应时间,所以我们可以让pod 弹性伸缩,我们定义一个autoscaling.yaml
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: k8sdemo namespace: mssiot spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: k8sdemo minReplicas: 1 maxReplicas: 3 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 80
kubectl create -f autoscaling.yaml
-
现在我们用wrk进行压测一下,看看该配置起作用了没有,如果对wrk不熟悉的同学可以用其他压测工具,或者直接代码实现。
使用命令行 wrk -t8 -c2000 -d 10s --latency http://192.168.31.55:30001/healthCheck
我们发现此时多了一个pod,说明配置起作用了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)