小米正式开源 Istio 管理面板 Naftis

近年来服务网格(Service Mesh)已成为各大公司关注重点,各大公司纷纷开始调研 Service Mesh 相关架构。作为 Service Mesh 中的佼佼者,Istio 诞生之初就已吸引众多目光。

作为基础设施层,Istio 有优秀的服务治理能力。但使用 Istio 进行服务治理时,开发者需通过 istioctl 或 kubectl 工具在终端中进行操作,这种方式目前存在一些问题,举例如下:

  1. Istio 要求用户熟练掌握 istioctl 工具的数百种指令,有较高的学习成本。
  2. Istio 进行服务治理时需要的 yaml 配置文件的数量非常庞大,如何配置和管理这些配置文件,也是个难题。
  3. Istio 的 istioctl 工具没有用户权限的约束,存在一定安全隐患,无法适应大公司严格的权限管理需求。
  4. Istio 的 istioctl 工具不支持任务回滚等需求,在执行任务出错的情况下,无法快速回滚到上一个正确版本。

为了解决这些问题,小米信息部武汉研发中心为 Istio 研发出了一套友好易用的 dashboard —— Naftis 。

Naftis 意为水手,和 Istio (帆船)意境契合。作为 dashboard , Naftis 能使用户像水手一样熟练掌控和管理 Istio 。

https://github.com/xiaomi/naftis

Naftis 通过任务模板的方式来帮助用户更轻松地执行 Istio 任务。用户可以在 Naftis 中定义自己的任务模板,并通过填充变量来构造单个或多个任务实例,从而完成各种服务治理功能。

Naftis 提供了如下特性:

  • 集成了一些常用的监控指标,包括 40X、50X 错误趋势等。
  • 提供了可定制的任务模板的支持。
  • 支持回滚指定某一任务。
  • 提供了 Istio 状态诊断功能,可实时查看 Istio 的 Services 和 Pod 状态。
  • 开箱即用,通过 kubectl 指令一键部署。

依赖

目前 Naftis 仅支持 Kubernetes,不支持其他容器调度平台。

  • Istio > 1.0
  • Kubernetes>= 1.9.0Jf
  • HIUI >= 1.0.0

Naftis 后端采用 Go 编写,通过 Kubernetes 和 Istio 的 CRD 接口对 Istio 资源进行操作;
前端则采用了同样由小米开源的基于 React 的前端组件 HIUI,HIUI 简洁优雅,有一定 React 基础的前端开发者能迅速上手:

https://github.com/xiaomi/hiui

快速开始

kubectl create namespace naftis && kubectl apply -n naftis -f mysql.yaml && kubectl apply -n naftis -f naftis.yaml

# 通过端口转发的方式访问 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,默认用户名和密码分别为 admin、admin。

详细的部署流程

Kubernetes 集群内运行

# 创建 Naftis 命名空间
$ kubectl create namespace  naftis

# 确认 Naftis 命名空间已创建
$ kubectl get namespace  naftis
NAME           STATUS    AGE
naftis          Active    18m

# 部署 Naftis MySQL 服务
$ kubectl apply -n  naftis  -f mysql.yaml

# 确认 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 服务
$ kubectl apply -n naftis -f naftis.yaml

# 确认 Naftis 所有的服务已经正确定义并正常运行中
$ 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

# 端口转发访问 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 即可。默认用户名和密码分别为 admin、admin。

本地运行

数据移植

# 执行 sql语句
mysql> source ./tool/naftis.sql;

# 将 in-local.toml 中的数据库的 DSN 配置替换成本地数据库实例的 DSN。

启动 API 服务

  • 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

启动前端 Node 代理

cd src/ui
npm install
npm run dev

# 打开浏览器访问 http://localhost:5200。

预览

dashboard

dashboard 页面集成了一些常用的图表,比如请求成功率、4XX 请求数量等。


集成了一些常用的图表,比如请求成功率、4XX请求数量等

服务管理

服务详情

服务详情页面可以查看查看已部署到 Kubernetes 中服务信息。


查看已部署到k8s中服务信息

服务 Pod 和拓扑图等

服务详情页面可以查看指定服务 Pod 和拓扑图等信息。


Services - Pod

任务模板管理

任务模板列表

任务模板列表也可以查看已经添加好的任务模板卡片列表。


任务模板列表

查看指定模板

点击“查看模板”可以查看指定模板信息。


查看指定模板

新增模板

点击“新增模板”可以向系统中新增自定义模板。


新增模板

创建任务

初始化变量值。


创建任务-第一步

确认变量值。


创建任务-第二步

提交创建任务的分步表单。


创建任务-第三步

Istio 诊断

Istio 诊断页面可以查看 Istio Service 和 Pod 状态。


查看 Istio 状态

Docker 镜像

Naftis 的 API 和 UI 镜像已经发布到 Docker Hub 上,见 apiui

开发者指南

获取源码

go get github.com/xiaomi/naftis

配置环境变量

将下述环境变量添加到 ~/.profile 。我们强烈推荐通过 autoenv 来配置环境变量。

# 根据环境改变 GOOS 和 GOARCH 变量
export GOOS="linux"   # 或替换成 "darwin"
export GOARCH="amd64" # 或替换成 "386"

# 把 USER 修改成你自己的 DockerHub 用户名
export USER="sevennt"
export HUB="docker.io/$USER"

如果你使用 autoenv,则输入 cd . 来使环境变量生效。

Go 依赖

我们目前使用 dep 管理依赖。

# 安装 dep
go get -u github.com/golang/dep
dep ensure -v # 安装 Go 依赖

代码风格

其他指令

make                 # 编译所有 targets

make build           # 编译 Go 二进制文件、前端静态资源、Kubernetes清单
make build.api       # 编译 Go 二进制文件
make build.ui        # 编译前端静态资源
make build.manifest  # 编译Kubernetes清单

make fmt   # 格式化 Go 代码
make lint  # lint Go 代码
make vet   # vet Go 代码
make test  # 运行测试用例
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 开源 ,目前功能还比较薄弱,希望更多志同道合的朋友一起参与进来共同完善落地 Istio 生态。

https://github.com/xiaomi/naftis

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容