广告位联系
返回顶部
分享到

基于Golang实现Kubernetes边车模式

Golang 来源:互联网 作者:佚名 发布时间:2024-08-06 22:26:41 人浏览
摘要

在这篇文章中,我们会介绍 Sidecar 模式,并创建两个基于 Go 的容器化微服务,然后部署到 Kubernetes 上。 什么是 Sidecar 模式? Sidecar 模式是一种软件架构设计模式,尤其适用于构建和部署微服务

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

什么是 Sidecar 模式?

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

服务

  • Sidecar 认证服务(Go)
  • 主服务(Go)

主服务

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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 ??

1

2

3

4

5

6

7

8

FROM golang:1.22-alpine as builder

WORKDIR /go/app

COPY . .

RUN go build -v -o app cmd/api/main.go

FROM alpine

COPY --from=builder /go/app/ .

EXPOSE 8080

CMD ["/app"]

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

1

docker build -t mertcakmak2/go-container .

Sidecar 服务

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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 Auth

func 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

1

2

3

4

5

6

7

8

FROM golang:1.22-alpine as builder

WORKDIR /go/app

COPY . .

RUN go build -v -o app cmd/sidecar/main.go

FROM alpine

COPY --from=builder /go/app/ .

EXPOSE 8081

CMD ["/app"]

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

1

docker build -f Dockerfile.sidecar -t mertcakmak2/go-sidecar .

Kubernetes 部署

Kubernetes 部署文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

apiVersion: v1

kind: Service

metadata:

  name: go-container-sidecar

spec:

  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/v1

kind: Deployment

metadata:

  name: go-container-sidecar

spec:

  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

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

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

运行以下命令进行部署。

1

kubectl apply -f k8s-deployment.yaml

Kubernetes 控制面板

包含两个容器的 Pod。

发送 HTTP 请求

访问 Minikube 服务???????

1

minikube service go-container-sidecar --url

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

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

用 Curl 命令发送请求。

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

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

参考资料

Kubernetes Sidecar Container - Best Practices and Examples[2]

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

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

参考资料

[1]

Sidecar Pattern with Kubernetes and Go: https://medium.com/@mertcakmak2/sidecar-pattern-with-kubernetes-and-go-68e0278c5260

[2]

Kubernetes Sidecar Container - Best Practices and Examples: https://spacelift.io/blog/kubernetes-sidecar-container

[3]

Sidecar Container: What is it and How to use it (Examples): https://kodekloud.com/blog/kubernetes-sidecar-container


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Go语言占位符的使用介绍
    Golang的字符串占位符在fmt包的各种打印函数中使用,如fmt.Printf、fmt.Sprintf。 变量值与类型的打印 %v: 打印变量的值 %v会根据变量的类型选择
  • 基于Golang实现Kubernetes边车模式

    基于Golang实现Kubernetes边车模式
    在这篇文章中,我们会介绍 Sidecar 模式,并创建两个基于 Go 的容器化微服务,然后部署到 Kubernetes 上。 什么是 Sidecar 模式? Sidecar 模式是一
  • 使用Go语言实现基于泛型的Jaccard相似度算法

    使用Go语言实现基于泛型的Jaccard相似度算法
    基本原理 跳表: jaccard相似度: jaccard相似度的代码实现: 时间复杂度分析: 快速jaccard算法: 代码实现,这个要求两个集合都是有序的:
  • go-zero自定义中间件的几种方式
    1.通过 api 文件生成并填入具体逻辑 定义 api 首先你需要在 api 文件中定义你需要的路由位置和中间件的名字: 1 2 3 4 5 6 7 8 9 // test for ping @
  • Go中gin框架的*gin.Context参数常见实用方法
    梗概: *gin.Context是处理HTTP请求的核心。ctx代表context(上下文),它包含了处理请求所需的所有信息和方法,例如请求数据、响应构建器、
  • Python实现图像添加水印的方法
    在日常图像处理中,为图片添加水印是一项常见任务。有多种方法和工具可供选择,而今天我们将专注于使用Python语言结合PIL库批量添加水
  • go的defer和return的执行顺序介绍
    go的defer和return的执行顺序 go的defer和return是golang中的两个关键字,return用于返回函数的返回值,也可以参与一定的流程控制,比如下面代码
  • 使用go语言实现Redis持久化的代码
    redis是一个内存数据库,如果你把进程杀掉,那么里面存储的数据都会消失,那么这篇文章就是来解决redis持久化的问题 我们在redis.conf文件
  • Go中的Timer和Ticker介绍
    一:简介 在日常开发中,我们可能会遇到需要延迟执行或周期性地执行一些任务。这个时候就需要用到Go语言中的定时器。 在Go语言中,定
  • Golang在gin框架中使用JWT鉴权
    什么是JWT JWT,全称 JSON Web Token,是一种开放标准(RFC 7519),用于安全地在双方之间传递信息。尤其适用于身份验证和授权场景。JWT 的设计
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计