Podinfo,迷你的 Go 微服務模板

為少發表於2021-01-23

​專案介紹

Podinfo 是一個用 Go 製作的小型 web 應用程式,它展示了在 Kubernetes 中執行微服務的最佳實踐。

它已實現的技術指標(截選自官方 README.md ):

裡面每一項技術指標的實現方式,其實都可以拿出來單獨講好久,相關理論也有好多。

這裡我只是講針對這個專案,我們該如何使用 Docker 去試玩它。

構建容器除錯環境

IDE

VSCode + golang/vscode-go

Go 國內加速映象

https://learnku.com/go/wikis/38122

編寫 Dockerfile.dev 檔案

FROM golang:1.14

WORKDIR /workspace

# copy modules manifests
COPY go.mod go.mod
COPY go.sum go.sum

# 阿里雲
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

# cache modules
RUN go mod download
RUN go get github.com/go-delve/delve/cmd/dlv

構建 Image

docker build -f Dockerfile.dev -t podinfo:dev .

編寫 docker-compose.yaml

version: "3.4"
services:
golang:
image: podinfo:dev
command: >
bash -c "ls -la
&& dlv debug /workspace/cmd/podinfo --headless --log -l 0.0.0.0:2345 --api-version=2"
volumes:
- ./:/workspace
ports:
- 9898:9898
- 2345:2345
security_opt:
- "seccomp:unconfined"

配置 .vscode 的 launch.json

{
"version": "0.2.0",
"configurations": [
{
"name": "Remote Docker",
"type": "go",
"request": "launch",
"mode": "remote",
"remotePath":"/workspace",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceFolder}",
"args": [],
"trace" : "verbose",
"env" : {}
}
]
}

開始試玩

docker compose 一鍵啟動

docker-compose up

Run Remote Docker

檢視首頁

http://localhost:9898

檢視給 Prometheus 的 metrics API

http://localhost:9898/metrics

下斷點,發請求除錯

curl http://localhost:9898/api/info

Helm Charts 

Podinfo/Charts

  • https://github.com/stefanprodan/podinfo/tree/master/charts/podinfo

因為 Podinfo 是一個雲原生專案,所以它的 Helm Charts 的編寫還是值得借鑑和學習的。

當然這裡需要你有一些 K8S 的經驗。

Helm 安裝 Podinfo

$ helm repo add podinfo https://stefanprodan.github.io/podinfo

$ helm upgrade -i my-release podinfo/podinfo

Helm 解除安裝 Podinfo

$ helm delete my-release

看配置,瞭解 PodInfo 是如何上雲的?

非常值得借鑑

引數預設值描述
replicaCount 1 期望的 K8S Pods(也就是程式碼在叢集中部署幾個例項)
logLevel info

日誌級別:

 debuginfowarnerrorflat 

or panic

backend None 需要呼叫的後端或者是第三方的 URL(如 Java 後端)
backends [] 需要呼叫的後端或者是第三方的 URLs(如 Java 後端)
cache None Redis 地址 <host>:<port>
redis.enabled false 是否開啟 Redis 快取
ui.color #34577c UI 顏色
ui.message None UI 問候訊息
ui.logo None UI logo
faults.delay false 隨機 HTTP 響應延遲 0 到 5 秒
faults.error false 1/3 概率的隨機 HTTP 響應錯誤
faults.unhealthy false 設定後,永遠不會達到健康狀態
faults.unready false 當設定時,永遠不會達到就緒狀態
faults.testFail false 當設定時,helm 測試總是失敗
faults.testTimeout false 當設定時,helm 測試總是包括超時
h2c.enabled false 允許升級到 h2c
image.repository stefanprodan/podinfo 映象庫(地址)
image.tag <VERSION> 映象 tag
image.pullPolicy IfNotPresent Image 拉取策略
service.enabled true 建立 Kubernetes 服務,使用 Flagger 時應禁用
service.type ClusterIP Kubernetes Service 型別
service.metricsPort 9797 Prometheus 指標端點埠
service.httpPort 9898 Container HTTP 埠
service.externalPort 9898 ClusterIP HTTP 埠
service.grpcPort 9999 ClusterIP gPRC 埠
service.grpcService podinfo gPRC service 名稱
service.nodePort 31198 HTTP 端點的 NodePort
hpa.enabled false

啟用 Kubernetes HPA

(Pod 水平自動伸縮)

hpa.maxReplicas 10 Pods 最大數量
hpa.cpu None 每個 Pod 的目標CPU使用率
hpa.memory None 每個 Pod 的目標記憶體使用量
hpa.requests None 每個 Pod 每秒目標 HTTP 請求
serviceAccount.enabled false 是否應建立 service account
serviceAccount.name None 要使用的 service account 的名稱,如果未設定且 enabled 為true,則使用 fullname 生成名稱
linkerd.profile.enabled false 建立 Linkerd 服務配置檔案
serviceMonitor.enabled false 是否應建立 Prometheus Operator 服務監視器
serviceMonitor.interval 15s Prometheus 抓取間隔
ingress.enabled false 啟用 Ingress
ingress.annotations {} Ingress 註解
ingress.path /* Ingress 路徑
ingress.hosts [] Ingress 接受的 hosts
ingress.tls [] Ingress TLS 配置
resources.requests.cpu 1m Pod CPU 請求
resources.requests.memory 16Mi Pod 記憶體 請求
resources.limits.cpu None Pod CPU 限制
resources.limits.memory None Pod memory 限制
nodeSelector {} Pod 分配的叢集節點標籤(說白了就是固定部署到你指定的機器)
tolerations [] 可容忍的節點汙點列表
affinity None Node/pod 親和力
podAnnotations {} Pod 註解

Refs

筆者修改過的 Podinfo 專案地址

  • https://github.com/Hacker-Linner/podinfo

官方 Podinfo

  • https://github.com/stefanprodan/podinfo

 

相關文章