如何基于Golang實(shí)現(xiàn)Kubernetes邊車模式
本文介紹了如何基于 Go 語(yǔ)言實(shí)現(xiàn) Kubernetes Sidecar 模式,并通過實(shí)際示例演示創(chuàng)建 Golang 實(shí)現(xiàn)的微服務(wù)服務(wù)、Docker 容器化以及在 Kubernetes 上的部署和管理。原文: Sidecar Pattern with Kubernetes and Go
在這篇文章中,我們會(huì)介紹 Sidecar 模式,并創(chuàng)建兩個(gè)基于 Go 的容器化微服務(wù),然后部署到 Kubernetes 上。
什么是 Sidecar 模式?
Sidecar 模式是一種軟件架構(gòu)設(shè)計(jì)模式,尤其適用于構(gòu)建和部署微服務(wù)。其主要表現(xiàn)為在主應(yīng)用容器旁部署附加服務(wù),稱為"邊車(Sidecar)",在不改變主應(yīng)用程序功能的情況下增強(qiáng)其功能,這種模式常用于容器化應(yīng)用程序。
服務(wù)
- Sidecar 認(rèn)證服務(wù)(Go)
- 主服務(wù)(Go)
主服務(wù)
主服務(wù)非常簡(jiǎn)單,只有一個(gè) API 端點(diǎn),該端點(diǎn)以 HTTP 響應(yīng)的形式返回 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"]
運(yùn)行以下命令編譯 Docker 鏡像。
docker build -t mertcakmak2/go-container .
Sidecar 服務(wù)
Sidecar 服務(wù)會(huì)將傳入的 HTTP 請(qǐng)求轉(zhuǎn)發(fā)給主服務(wù)。
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"]
運(yùn)行以下命令編譯 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
創(chuàng)建部署文件,在不同端口上公開兩個(gè)服務(wù)。
主服務(wù) => 8080 Sidecar 服務(wù) => 8081
運(yùn)行以下命令進(jìn)行部署。???????
kubectl apply -f k8s-deployment.yaml
Kubernetes 控制面板
包含兩個(gè)容器的 Pod。
發(fā)送 HTTP 請(qǐng)求
訪問 Minikube 服務(wù)???????
minikube service go-container-sidecar --url
生成了兩個(gè) URL,第一個(gè) URL 是主服務(wù),第二個(gè) URL 是 Sidecar 服務(wù)。
主服務(wù) => http://127.0.0.1:57496 Sidecar 服務(wù) => http://127.0.0.1:57497
用 Curl 命令發(fā)送請(qǐng)求。
API 返回了 JSON 消息,我們看一下容器日志。
Sidecar 服務(wù)將這些傳入的 HTTP 請(qǐng)求轉(zhuǎn)發(fā)給主服務(wù)。
參考資料
Kubernetes Sidecar Container - Best Practices and Examples[2]
Sidecar Container: What is it and How to use it (Examples)[3]
你好,我是俞凡,在Motorola做過研發(fā),現(xiàn)在在Mavenir做技術(shù)工作,對(duì)通信、網(wǎng)絡(luò)、后端架構(gòu)、云原生、DevOps、CICD、區(qū)塊鏈、AI等技術(shù)始終保持著濃厚的興趣,平時(shí)喜歡閱讀、思考,相信持續(xù)學(xué)習(xí)、終身成長(zhǎng),歡迎一起交流學(xué)習(xí)。為了方便大家以后能第一時(shí)間看到文章,請(qǐng)朋友們關(guān)注公眾號(hào)"DeepNoMind",并設(shè)個(gè)星標(biāo)吧,如果能一鍵三連(轉(zhuǎn)發(fā)、點(diǎn)贊、在看),則能給我?guī)砀嗟闹С趾蛣?dòng)力,激勵(lì)我持續(xù)寫下去,和大家共同成長(zhǎng)進(jìn)步!
參考資料
[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
到此這篇關(guān)于基于Golang實(shí)現(xiàn)Kubernetes邊車模式的文章就介紹到這了,更多相關(guān)Golang Kubernetes邊車模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總
這篇文章主要8為大家介紹了夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-10-10對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解
今天小編就為大家分享一篇對(duì)Golang import 導(dǎo)入包語(yǔ)法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06GoLang string與strings.Builder使用對(duì)比詳解
這篇文章主要介紹了GoLang string與strings.Builder使用對(duì)比,Builder 用于使用 Write 方法有效地構(gòu)建字符串。它最大限度地減少了內(nèi)存復(fù)制。零值可以使用了。不要復(fù)制非零生成器2023-03-03Go語(yǔ)言編程中判斷文件是否存在是創(chuàng)建目錄的方法
這篇文章主要介紹了Go語(yǔ)言編程中判斷文件是否存在是創(chuàng)建目錄的方法,示例都是使用os包下的函數(shù),需要的朋友可以參考下2015-10-10Golang?range?slice?與range?array?之間的區(qū)別
這篇文章主要介紹了Golang?range?slice?與range?array?之間的區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07