写点什么

基于 Golang 实现 Kubernetes 边车模式

作者:俞凡
  • 2024-08-05
    上海
  • 本文字数:2083 字

    阅读完需:约 7 分钟

本文介绍了如何基于 Go 语言实现 Kubernetes Sidecar 模式,并通过实际示例演示创建 Golang 实现的微服务服务、Docker 容器化以及在 Kubernetes 上的部署和管理。原文: Sidecar Pattern with Kubernetes and Go


在这篇文章中,我们会介绍 Sidecar 模式,并创建两个基于 Go 的容器化微服务,然后部署到 Kubernetes 上。


什么是 Sidecar 模式?

Sidecar 模式是一种软件架构设计模式,尤其适用于构建和部署微服务。其主要表现为在主应用容器旁部署附加服务,称为"边车(Sidecar)",在不改变主应用程序功能的情况下增强其功能,这种模式常用于容器化应用程序。

服务

  • Sidecar 认证服务(Go)

  • 主服务(Go)


主服务

主服务非常简单,只有一个 API 端点,该端点以 HTTP 响应的形式返回 JSON 消息。


package main
import ( "fmt" "github.com/gin-gonic/gin")
func main() { fmt.Println("Api Go!")
r := gin.Default() r.GET("/ping", ping) r.Run(":8080")
}
func ping(c *gin.Context) {
c.JSON(200, gin.H{ "message": "pong", })}
复制代码


Dockefile


FROM golang:1.22-alpine as builderWORKDIR /go/appCOPY . .RUN go build -v -o app cmd/api/main.goFROM alpineCOPY --from=builder /go/app/ .EXPOSE 8080CMD ["/app"]
复制代码


运行以下命令编译 Docker 镜像。


docker build -t mertcakmak2/go-container .
复制代码
Sidecar 服务

Sidecar 服务会将传入的 HTTP 请求转发给主服务。


package main
import ( "fmt" "github.com/gin-gonic/gin" "net/http" "net/http/httputil" "net/url")
func main() { fmt.Println("Sidecar Go!")
r := gin.Default() // Reverse Proxy r.Any("/*proxyPath", authProxy) r.Run(":8081")}
// Simulate Authfunc authProxy(c *gin.Context) {
// Bearer Token Check...
// MAIN CONTAINER URL remote, err := url.Parse("http://localhost:8080") if err != nil { panic(err) }
proxy := httputil.NewSingleHostReverseProxy(remote) proxy.Director = func(req *http.Request) { req.Header = c.Request.Header req.Host = remote.Host req.URL.Scheme = remote.Scheme req.URL.Host = remote.Host req.URL.Path = c.Param("proxyPath") }
proxy.ServeHTTP(c.Writer, c.Request)}
复制代码


Dockerfile


FROM golang:1.22-alpine as builderWORKDIR /go/appCOPY . .RUN go build -v -o app cmd/sidecar/main.goFROM alpineCOPY --from=builder /go/app/ .EXPOSE 8081CMD ["/app"]
复制代码


运行以下命令编译 Docker 镜像。


docker build -f Dockerfile.sidecar -t mertcakmak2/go-sidecar .
复制代码

Kubernetes 部署

  • Kubernetes 部署文件


apiVersion: v1kind: Servicemetadata:  name: go-container-sidecarspec:  selector:    app: go-container-sidecar  ports:    - protocol: "TCP"      name: main-container-port      port: 8080      targetPort: 8080    - protocol: "TCP"      name: sidecar-container-port      port: 8081      targetPort: 8081  type: ClusterIP---apiVersion: apps/v1kind: Deploymentmetadata:  name: go-container-sidecarspec:  selector:    matchLabels:      app: go-container-sidecar  replicas: 1  template:    metadata:      labels:        app: go-container-sidecar    spec:      containers:        - name: go-container          image: mertcakmak2/go-container:latest          imagePullPolicy: Always          ports:            - containerPort: 8080        - name: go-sidecar          image: mertcakmak2/go-sidecar:latest          imagePullPolicy: Always          ports:            - containerPort: 8081
复制代码


创建部署文件,在不同端口上公开两个服务。


主服务 => 8080Sidecar 服务 => 8081


运行以下命令进行部署。


kubectl apply -f k8s-deployment.yaml
复制代码



Kubernetes 控制面板
  • 包含两个容器的 Pod。


发送 HTTP 请求
  • 访问 Minikube 服务


minikube service go-container-sidecar --url
复制代码



生成了两个 URL,第一个 URL 是主服务,第二个 URL 是 Sidecar 服务。


主服务 => http://127.0.0.1:57496Sidecar 服务 => http://127.0.0.1:57497


  • 用 Curl 命令发送请求。



  • API 返回了 JSON 消息,我们看一下容器日志。




Sidecar 服务将这些传入的 HTTP 请求转发给主服务。

参考资料

Kubernetes Sidecar Container - Best Practices and Examples


Sidecar Container: What is it and How to use it (Examples)




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 4
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
基于Golang实现Kubernetes边车模式_golang_俞凡_InfoQ写作社区