基于Golang实现Kubernetes边车模式

news2024/9/24 7:22:23

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

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

alt
什么是 Sidecar 模式?

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

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

主服务非常简单,只有一个 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 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 镜像。

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

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 镜像。

docker build -f Dockerfile.sidecar -t mertcakmak2/go-sidecar .
Kubernetes 部署
  • Kubernetes 部署文件
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

运行以下命令进行部署。

kubectl apply -f k8s-deployment.yaml
alt
alt
Kubernetes 控制面板
  • 包含两个容器的 Pod。
alt
发送 HTTP 请求
  • 访问 Minikube 服务
minikube service go-container-sidecar --url
alt

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

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

  • 用 Curl 命令发送请求。
alt
  • API 返回了 JSON 消息,我们看一下容器日志。
alt
alt

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

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分享】2022年291个城市的人均GDP数据,附带数据获取方式

2022年291个城市的人均GDP数据涉及全国地级及以上城市的经济发展水平。在这份详尽的数据中,包括了众多城市的经济表现,并依据国际标准对它们的经济状况进行了分类。具体如下: 人均GDP高值城市 鄂尔多斯:鄂尔多斯市位于内蒙古自治区…

单位企业邮箱有什么优势

单位企业邮箱成为了企业内外沟通的重要工具。单位企业邮箱的优势有什么呢?一、统一专业形象;二、高效沟通;三、安全保障;四、便捷管理;五、定制服务等。本文将深入探讨单位企业邮箱的独特优势,帮助您了解为…

格力美容仪售价9800元 董明珠:用一周发现变美了

近日,格力电器董事长兼总裁董明珠在格力冰洗生活电器战略发布会上透露,公司已研发了美容仪。 《时代周报》记者查询格力董明珠店官网发现,目前有一款名为“格力微电流美容仪”的产品在售卖,售价9800元,截至发稿已售出…

详解直铺防静电瓷砖的特点与优势

防静电地板分为架空防静电地板和直铺防静电地板,直铺式防静电地板是一种直接铺设在地面上的地板系统,防静电瓷砖就是常用的直铺防静电地板之一。防静电瓷砖是在瓷砖烧制过程中加入防静电功能粉体进行物理改性,规格为600*600*10mm,…

Windows使用wsl安装docker-desktop

一:修改Windows配置,启用相关功能。 1:启用硬件虚拟化VT-d 各品牌电脑的Bios设置都不一致,需要自行查找如何进入Bios开启VT-x功能,绝大部分电脑此功能默认情况下是直接开启的。 2:确定Windows系统的类别…

带动画特效、带音乐的仿真翻页电子相册制作教程

在当前数字化快速发展的时代,仿真翻页电子相册作为一种富有创意和互动性的表达形式,正受到越来越多用户的青睐。本教程将介绍如何利用带动画特效和音乐的功能,通过FLBOOK这款强大的电子相册制作工具,创作出令人印象深刻的作品。 第…

剪画小程序:录音转文字:告别会议烦恼,轻松整理文档!

在忙碌的工作中,开会是家常便饭。 每次会议上大家的讨论、决策和重要信息,都对工作的推进至关重要。 但您是否曾为会议录音的整理而感到头疼?冗长的会议录音,想要从中准确提取关键信息,费时又费力。 别担心&#xff…

文件系统 ---在硬盘中的文件

序言 在前两章的内容中,我们主要是介绍了一个文件被调度时,在内存中的存在形式以及相关的内核结构。在这一章中,我们主要介绍一磁盘是如何管理并存储文件的以及文件在磁盘上的存在形式。  大部分电脑采用硬盘驱动器(HDD&#xff…

AWS域名注册:AWS 是否可以注册HK域名?

AWS(Amazon Web Services)本身并不直接提供域名注册服务,但它通过其服务Amazon Route 53提供域名注册功能,九河云来和你详细说说域名注册的一些事项吧。通过Amazon Route 53,你可以注册各种顶级域名(TLD&am…

openai command not found (mac)

题意:mac 系统上无法识别 openai 的命令 问题背景: Im trying to follow the fine tuning guide for Openai here. 我正在尝试遵循 OpenAI 的微调指南 I ran: 我运行以下命令 pip install --upgrade openaiWhich install without any errors.…

本地安装Llama3.1与LobeChat可视化UI界面并实现远程访问大模型实战

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

著名数学教育家的精辟见解表明R有最小正数元

黄小宁 著名数学教育家余元希教授著《数的概念浅说》114页指出:数轴是连续的点集,它的元素是一个一个紧挨着的。这精辟见解说明R轴即x轴必有紧挨着原点x0的正数点xt,t显然是R的最小正数元,任何比t小的正数都是“更无理”的R外正数…

SD-WAN抢专线的饭碗?和传统WAN对比到底香在哪?

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 你们好,我的网工朋友。 广域网(WAN, Wide Area Network)是企业网络的核心组成部分之一,但是随着发…

测试GPT4o分析巴黎奥运会奖牌数据

使用GPT4o快速调用python代码,生成数据图表 测试GPT4o分析巴黎奥运会奖牌数据 测试GPT4o分析巴黎奥运会奖牌数据 1.首先我们让他给我们生成下当前奥运奖牌数 2.然后我们直接让GPT帮我们运行python代码,并生成奥运会奖牌图表 3.我们还可以让他帮我们…

初识云计算

随着科技的飞速发展,云计算作为一种新兴的信息技术架构,正在逐渐改变我们的工作方式和生活方式。 云计算是什么? 云计算是一种通过互联网提供计算资源和服务的计算模式。它通过互联网将计算和存储资源进行集中和共享,为用户提供…

mysql 各种锁归纳总结

文章目录 一、引言二、锁分类三、Mysql锁四、MyISAM表锁五、InnoDB锁六、间隙锁七、总结 一、引言 在现代应用程序中,数据库是不可或缺的组成部分之一。而MySQL作为一款开源的关系型数据库管理系统,广泛应用于各种规模的应用中。然而,在高并…

如何防止员工删除文件?10个操作让你随时找到重要文件

防止员工删除文件是确保企业数据安全的重要一环,有了这10个操作,让你不愁找不到重要的文件。 1.设置文件访问权限: 在文件服务器上或网络共享中,为不同用户或用户组设置适当的文件访问权限。确保员工只有必要的读、写权限&#…

polyglot,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - polyglot。 Github地址:https://github.com/aboSamoor/polyglot 在处理多语言文本时,解析和翻译不同语言的文本数据是一个常见…

sql注入11、17、24关

sql注入第11关 查看源码后发现注入点。 $sql"SELECT username, password FROM users WHERE username$uname and password$passwd LIMIT 0,1";$resultmysqli_query($con1, $sql);$row mysqli_fetch_array($result, MYSQLI_BOTH); 在User Name输入框中输入注入语句&…

未授权访问漏洞系列详解③!

Elasticsearch未授权访问漏洞 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引…