Emoji.voto,Linkerd 服務網(wǎng)格(service mesh)的示例應用程序
一個微服務應用程序,允許用戶為他們最喜歡的表情符號(emoji)投票,并跟蹤排行榜上收到的投票。愿最好的 emoji 獲勝。
該應用程序由以下 3 個服務組成:
emojivoto-web:Web 前端和 REST API
- https://github.com/BuoyantIO/emojivoto/tree/main/emojivoto-web
emojivoto-emoji-svc:用于查找和列出 emoji 的 gRPC API
- https://github.com/BuoyantIO/emojivoto/tree/main/emojivoto-emoji-svc
emojivoto-voting-svc:用于投票和排行榜的 gRPC API
- https://github.com/BuoyantIO/emojivoto/blob/main/emojivoto-voting-svc
實戰(zhàn)
騰訊云 K8S 集群實戰(zhàn) Service Mesh—Linkerd2 & Traefik2 部署 emojivoto 應用
運行
在 Minikube 中
使用 Linkerd2 服務網(wǎng)格將應用程序部署到 Minikube。
1.安裝 linkerd CLI
- curl https://run.linkerd.io/install | sh
2.安裝 Linkerd2
- linkerd install | kubectl apply -f -
3.查看儀表盤!
- linkerd dashboard
4.Inject, Deploy, and Enjoy
- kubectl kustomize kustomize/deployment | \
- linkerd inject - | \
- kubectl apply -f -
5.使用應用程序!
- minikube -n emojivoto service web-svc
在 docker-compose 中
也可以使用 docker-compose(不帶 Linkerd2)運行應用程序。
構(gòu)建并運行:
- make deploy-to-docker-compose
Web 應用程序?qū)⒃?docker 主機的端口 8080 上運行。
通過 URL
獨立部署到現(xiàn)有集群:
- kubectl apply -k github.com/BuoyantIO/emojivoto/kustomize/deployment
生成一些流量
VoteBot 服務可以為你帶來一些流量。它對表情符號“隨機”投票如下:
- 15% 的選票投給 🍩
- 不給 🍩 投票時,它會隨機選擇一個表情符號
如果您使用上述 instructions(部署說明) 運行應用程序,則 VoteBot 將已部署,并將開始向投票端點發(fā)送流量。
如果您想手動運行機器人:
- export WEB_HOST=localhost:8080 # replace with your web location
- go run emojivoto-web/cmd/vote-bot/main.go
發(fā)布新版本
要構(gòu)建和推送 multi-arch docker 鏡像:
1.更新 common.mk 中的標簽名稱
2.創(chuàng)建 Buildx 構(gòu)建器實例
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- docker buildx create --name=multiarch-builder --driver=docker-container --use
- docker buildx inspect multiarch-builder --bootstrap
3.構(gòu)建 & 推送 multi-arch docker 鏡像到 hub.docker.com
- docker login
- make multi-arch
4.更新:
- docker-compose.yml
- kustomize/deployment/emoji.yml
- kustomize/deployment/vote-bot.yml
- kustomize/deployment/voting.yml
- kustomize/deployment/web.yml
5.分發(fā)到 Linkerd website repo
- kubectl kustomize kustomize/deployment > ../website/run.linkerd.io/public/emojivoto.yml
- kubectl kustomize kustomize/daemonset > ../website/run.linkerd.io/public/emojivoto-daemonset.yml
- kubectl kustomize kustomize/statefulset > ../website/run.linkerd.io/public/emojivoto-statefulset.yml
Prometheus 指標
默認情況下,投票服務在端口 8801 上公開有關(guān)當前投票計數(shù)的 Prometheus 指標。
這可以通過取消設置 PROM_PORT 環(huán)境變量來禁用。
本地開發(fā)
Emojivoto webapp
這個應用程序是用 React 編寫的,并使用 webpack 打包。使用以下命令運行 emojivoto go services 并在前端進行開發(fā)。
設置 proto 文件,構(gòu)建應用程序
- make build
啟動投票服務
- GRPC_PORT=8081 go run emojivoto-voting-svc/cmd/server.go
[在單獨的終端窗口中] 啟動 emoji 服務
- GRPC_PORT=8082 go run emojivoto-emoji-svc/cmd/server.go
[在單獨的終端窗口中] 捆綁前端資源
- cd emojivoto-web/webapp
- yarn install
- yarn webpack # one time asset-bundling OR
- yarn webpack-dev-server --port 8083 # bundle/serve reloading assets
[在單獨的終端窗口中] 啟動 Web 服務
- export WEB_PORT=8080
- export VOTINGSVC_HOST=localhost:8081
- export EMOJISVC_HOST=localhost:8082
- # if you ran yarn webpack
- export INDEX_BUNDLE=emojivoto-web/webapp/dist/index_bundle.js
- # if you ran yarn webpack-dev-server
- export WEBPACK_DEV_SERVER=http://localhost:8083
- # start the webserver
- go run emojivoto-web/cmd/server.go
[可選] 啟動投票機器人以自動生成流量。
- export WEB_HOST=localhost:8080
- go run emojivoto-web/cmd/vote-bot/main.go
查看 emojivoto
- open http://localhost:8080
測試 Linkerd 服務配置文件
Service Profiles 是 Linkerd 的一個特性, 它提供了每條路由的功能,如遙測(telemetry)、超時(timeouts)和重試(retries)。 Emojivoto 應用程序旨在通過以下說明展示服務配置文件。
Service Profiles:https://linkerd.io/2/features/service-profiles
從 .proto 文件生成 ServiceProfile 定義
emoji 和 voting 服務是具有 Protocol Buffers (protobuf) definition 文件的 gRPC 應用程序。這些 .proto 文件可用作 linkerd profile 命令的輸入, 以創(chuàng)建 ServiceProfile definition yaml 文件。Linkerd Service Profile 文檔 概述了創(chuàng)建 yaml 文件所需的步驟,這些是您可以從該存儲庫的根目錄使用的命令:
- linkerd profile --proto proto/Emoji.proto emoji-svc -n emojivoto
- linkerd profile --proto proto/Voting.proto voting-svc -n emojivoto
Protocol Buffers (protobuf):https://developers.google.com/protocol-buffers
gRPC:https://grpc.io
Linkerd Service Profile 文檔:https://linkerd.io/2/tasks/setting-up-service-profiles/#protobuf
這些命令中的每一個都會輸出 yaml,您可以將其寫入文件或管道, 直接將其寫入 kubectl apply。例如:
- 寫入文件:
- linkerd profile --proto proto/Emoji.proto emoji-svc -n emojivoto > emoji
- -sp.yaml
- 直接 apply:
- linkerd profile --proto proto/Voting.proto voting-svc -n emojivoto | \
- kubectl apply -f -
為 Web 部署生成 ServiceProfile 定義
emojivoto 的 web-svc 部署是一個由 Go server 托管的 React 應用程序。我們可以使用 linkerd profile auto creation,使用以下命令為 web-svc 生成 ServiceProfile 資源:
- linkerd profile -n emojivoto web-svc --tap deploy/web --tap-duration 10s | \
- kubectl apply -f -
現(xiàn)在為所有服務生成了服務配置文件,您可以在 Linkerd Dashboard 上或使用 linkerd routes 命令觀察每個服務的每條路由指標
- linkerd -n emojivoto routes deploy/web-svc --to svc/emoji-svc
linkerd profile auto creation
- https://linkerd.io/2/tasks/setting-up-service-profiles/#auto-creation
Linkerd Dashboard
- https://linkerd.io/2/features/dashboard