基于 Golang 實現 Kubernetes 邊車模式
在這篇文章中,我們會介紹 Sidecar 模式,并創建兩個基于 Go 的容器化微服務,然后部署到 Kubernetes 上。

什么是 Sidecar 模式?
Sidecar 模式是一種軟件架構設計模式,尤其適用于構建和部署微服務。其主要表現為在主應用容器旁部署附加服務,稱為"邊車(Sidecar)",在不改變主應用程序功能的情況下增強其功能,這種模式常用于容器化應用程序。
服務
- Sidecar 認證服務(Go)
- 主服務(Go)

1.主服務
主服務非常簡單,只有一個 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",
})
}2.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 .3.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)
}4.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

1.Kubernetes 控制面板
包含兩個容器的 Pod。

2.發送 HTTP 請求
(1) 訪問 Minikube 服務:
minikube service go-container-sidecar --url
生成了兩個 URL,第一個 URL 是主服務,第二個 URL 是 Sidecar 服務。
主服務 => http://127.0.0.1:57496 Sidecar 服務 => http://127.0.0.1:57497
(2) 用 Curl 命令發送請求。

(3) API 返回了 JSON 消息,我們看一下容器日志。


Sidecar 服務將這些傳入的 HTTP 請求轉發給主服務。
參考資料:
- Kubernetes Sidecar Container - Best Practices and Examples[2]
- Sidecar Container: What is it and How to use it (Examples)[3]
參考資料:
- [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


































