使用k8s部署弹性伸缩golang服务

在项目部署的过程中我们会用到k8s, 所以让我们用他从0到1部署一个golang服务

  1. 简单实现一个服务
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")
}
  1. 接下来将该服务进行镜像打包,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"]
  1. 使用打包命令构建镜像 docker build -t liuqiangdocker/k8sdemo:v1 ./ 如图所示

    1. -t 表示给镜像打标签
    2. liuqiangdocker 表示docker的用户名,记得替换你的
    3. ./表示dockerfile的所在目录
    

  2. 将镜像推到远程仓库 docker push liuqiangdocker/k8sdemo:v1

  3. 有了镜像地址之后我们就可以部署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
    
  4. 查看我们创建的pod: kubectl get pods -n mssiot

  5. 再创建一个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
    
    
  6. 查看我们创建的service: kubectl get svc -n mssiot

  7. 此时我们通过局域网IP地址:nodeport端口访问 http://192.168.31.55:30001/healthCheck

    大功告成!

  8. 如果我们发现服务器的流量突然增大,那么此时我们应该动态增加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

  9. 现在我们用wrk进行压测一下,看看该配置起作用了没有,如果对wrk不熟悉的同学可以用其他压测工具,或者直接代码实现。

    使用命令行 wrk -t8 -c2000 -d 10s --latency http://192.168.31.55:30001/healthCheck

    我们发现此时多了一个pod,说明配置起作用了

posted @   AGopher  阅读(563)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示