近年來服務(wù)網(wǎng)格(Service Mesh)已成為各大公司關(guān)注重點(diǎn),各大公司紛紛開始調(diào)研 Service Mesh 相關(guān)架構(gòu)鹅髓。作為 Service Mesh 中的佼佼者芹务,Istio 誕生之初就已吸引眾多目光证杭。
作為基礎(chǔ)設(shè)施層腋妙,Istio 有優(yōu)秀的服務(wù)治理能力。但使用 Istio 進(jìn)行服務(wù)治理時(shí)幕庐,開發(fā)者需通過 istioctl 或 kubectl 工具在終端中進(jìn)行操作久锥,這種方式目前存在一些問題,舉例如下:
- Istio 要求用戶熟練掌握 istioctl 工具的數(shù)百種指令异剥,有較高的學(xué)習(xí)成本瑟由。
- Istio 進(jìn)行服務(wù)治理時(shí)需要的 yaml 配置文件的數(shù)量非常龐大,如何配置和管理這些配置文件冤寿,也是個(gè)難題歹苦。
- Istio 的 istioctl 工具沒有用戶權(quán)限的約束,存在一定安全隱患督怜,無法適應(yīng)大公司嚴(yán)格的權(quán)限管理需求殴瘦。
- Istio 的 istioctl 工具不支持任務(wù)回滾等需求,在執(zhí)行任務(wù)出錯(cuò)的情況下号杠,無法快速回滾到上一個(gè)正確版本蚪腋。
為了解決這些問題,小米信息部武漢研發(fā)中心為 Istio 研發(fā)出了一套友好易用的 dashboard —— Naftis 姨蟋。
Naftis 意為水手屉凯,和 Istio (帆船)意境契合。作為 dashboard 眼溶, Naftis 能使用戶像水手一樣熟練掌控和管理 Istio 悠砚。
https://github.com/xiaomi/naftis
Naftis 通過任務(wù)模板的方式來幫助用戶更輕松地執(zhí)行 Istio 任務(wù)。用戶可以在 Naftis 中定義自己的任務(wù)模板堂飞,并通過填充變量來構(gòu)造單個(gè)或多個(gè)任務(wù)實(shí)例灌旧,從而完成各種服務(wù)治理功能。
Naftis 提供了如下特性:
- 集成了一些常用的監(jiān)控指標(biāo)酝静,包括 40X节榜、50X 錯(cuò)誤趨勢等。
- 提供了可定制的任務(wù)模板的支持别智。
- 支持回滾指定某一任務(wù)。
- 提供了 Istio 狀態(tài)診斷功能稼稿,可實(shí)時(shí)查看 Istio 的 Services 和 Pod 狀態(tài)薄榛。
- 開箱即用讳窟,通過 kubectl 指令一鍵部署。
依賴
目前 Naftis 僅支持 Kubernetes敞恋,不支持其他容器調(diào)度平臺(tái)丽啡。
- Istio > 1.0
- Kubernetes>= 1.9.0Jf
- HIUI >= 1.0.0
Naftis 后端采用 Go 編寫,通過 Kubernetes 和 Istio 的 CRD 接口對(duì) Istio 資源進(jìn)行操作硬猫;
前端則采用了同樣由小米開源的基于 React 的前端組件 HIUI补箍,HIUI 簡潔優(yōu)雅,有一定 React 基礎(chǔ)的前端開發(fā)者能迅速上手:
https://github.com/xiaomi/hiui
快速開始
kubectl create namespace naftis && kubectl apply -n naftis -f mysql.yaml && kubectl apply -n naftis -f naftis.yaml
# 通過端口轉(zhuǎn)發(fā)的方式訪問 Naftis
kubectl -n naftis port-forward $(kubectl -n naftis get Pod -l app=naftis -ui -o jsonpath='{.items[0].metadata.name}') 8080:80 &
# 打開瀏覽器訪問 http://localhost:8080啸蜜,默認(rèn)用戶名和密碼分別為 admin坑雅、admin。
詳細(xì)的部署流程
Kubernetes 集群內(nèi)運(yùn)行
# 創(chuàng)建 Naftis 命名空間
$ kubectl create namespace naftis
# 確認(rèn) Naftis 命名空間已創(chuàng)建
$ kubectl get namespace naftis
NAME STATUS AGE
naftis Active 18m
# 部署 Naftis MySQL 服務(wù)
$ kubectl apply -n naftis -f mysql.yaml
# 確認(rèn) MySQL 已部署
$ kubectl get svc -n naftis
NAME READY STATUS RESTARTS AGE
naftis-mysql-c78f99d6c-kblbq 1/1 Running 0 9s
naftis-mysql-test 1/1 Running 0 10s
# 部署 Naftis API和 UI 服務(wù)
$ kubectl apply -n naftis -f naftis.yaml
# 確認(rèn) Naftis 所有的服務(wù)已經(jīng)正確定義并正常運(yùn)行中
$ kubectl get svc -n naftis
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
naftis-api ClusterIP 10.233.3.144 <none> 50000/TCP 7s
naftis-mysql ClusterIP 10.233.57.230 <none> 3306/TCP 55s
naftis-ui LoadBalancer 10.233.18.125 <pending> 80:31286/TCP 6s
$ kubectl get Pod -n naftis
NAME READY STATUS RESTARTS AGE
naftis-api-0 1/2 Running 0 19s
naftis-mysql-c78f99d6c-kblbq 1/1 Running 0 1m
naftis-mysql-test 1/1 Running 0 1m
naftis-ui-69f7d75f47-4jzwz 1/1 Running 0 19s
# 端口轉(zhuǎn)發(fā)訪問 Naftis
kubectl -n naftis port-forward $(kubectl -n naftis get Pod -l app=naftis-ui -o jsonpath='{.items[0].metadata.name}') 8080:80 &
# 打開瀏覽器衬横,訪問 http://localhost:8080 即可裹粤。默認(rèn)用戶名和密碼分別為 admin、admin蜂林。
本地運(yùn)行
數(shù)據(jù)移植
# 執(zhí)行 sql語句
mysql> source ./tool/naftis.sql;
# 將 in-local.toml 中的數(shù)據(jù)庫的 DSN 配置替換成本地?cái)?shù)據(jù)庫實(shí)例的 DSN遥诉。
啟動(dòng) API 服務(wù)
- Linux
make build && ./bin/naftis-api start -c config/in-local.toml
或
./run
- Mac OS
GOOS=darwin GOARCH=amd64 make build && ./bin/naftis-api start -c config/in-local.toml
或
GOOS=darwin GOARCH=amd64 ./run
配置 Nginx 代理
cp tool/naftis.conf <your-nginx-conf-directory>/naftis.conf
# 酌情修改 naftis.conf 文件并 reload nginx
啟動(dòng)前端 Node 代理
cd src/ui
npm install
npm run dev
# 打開瀏覽器訪問 http://localhost:5200。
預(yù)覽
dashboard
dashboard 頁面集成了一些常用的圖表噪叙,比如請(qǐng)求成功率矮锈、4XX 請(qǐng)求數(shù)量等。
服務(wù)管理
服務(wù)詳情
服務(wù)詳情頁面可以查看查看已部署到 Kubernetes 中服務(wù)信息。
服務(wù) Pod 和拓?fù)鋱D等
服務(wù)詳情頁面可以查看指定服務(wù) Pod 和拓?fù)鋱D等信息惫霸。
任務(wù)模板管理
任務(wù)模板列表
任務(wù)模板列表也可以查看已經(jīng)添加好的任務(wù)模板卡片列表猫缭。
查看指定模板
點(diǎn)擊“查看模板”可以查看指定模板信息。
新增模板
點(diǎn)擊“新增模板”可以向系統(tǒng)中新增自定義模板壹店。
創(chuàng)建任務(wù)
初始化變量值猜丹。
確認(rèn)變量值。
提交創(chuàng)建任務(wù)的分步表單硅卢。
Istio 診斷
Istio 診斷頁面可以查看 Istio Service 和 Pod 狀態(tài)射窒。
Docker 鏡像
Naftis 的 API 和 UI 鏡像已經(jīng)發(fā)布到 Docker Hub 上,見 api 和 ui将塑。
開發(fā)者指南
獲取源碼
go get github.com/xiaomi/naftis
配置環(huán)境變量
將下述環(huán)境變量添加到 ~/.profile
脉顿。我們強(qiáng)烈推薦通過 autoenv 來配置環(huán)境變量。
# 根據(jù)環(huán)境改變 GOOS 和 GOARCH 變量
export GOOS="linux" # 或替換成 "darwin"
export GOARCH="amd64" # 或替換成 "386"
# 把 USER 修改成你自己的 DockerHub 用戶名
export USER="sevennt"
export HUB="docker.io/$USER"
如果你使用 autoenv点寥,則輸入 cd .
來使環(huán)境變量生效艾疟。
Go 依賴
我們目前使用 dep 管理依賴。
# 安裝 dep
go get -u github.com/golang/dep
dep ensure -v # 安裝 Go 依賴
代碼風(fēng)格
其他指令
make # 編譯所有 targets
make build # 編譯 Go 二進(jìn)制文件、前端靜態(tài)資源蔽莱、Kubernetes清單
make build.api # 編譯 Go 二進(jìn)制文件
make build.ui # 編譯前端靜態(tài)資源
make build.manifest # 編譯Kubernetes清單
make fmt # 格式化 Go 代碼
make lint # lint Go 代碼
make vet # vet Go 代碼
make test # 運(yùn)行測試用例
make tar # 打包成壓縮文件
make docker # 編譯 docker 鏡像
make docker.api # 編譯后端 docker 鏡像
make docker.ui # 編譯前端 docker 鏡像
make push # 把鏡像推送到 Docker Hub
./bin/naftis-api -h # 顯示幫助信息
./bin/naftis-api version # 顯示版本信息
./tool/genmanifest.sh # 本地渲染Kubernetes部署清單
./tool/cleanup.sh # 清理已部署的 Naftis
其他
Naftis 目前已在 Github 開源 弟疆,目前功能還比較薄弱,希望更多志同道合的朋友一起參與進(jìn)來共同完善落地 Istio 生態(tài)盗冷。