小米开源 Istio 工具 Naftis

Posted K8S中文社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小米开源 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 。

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

GitHub:

https://github.com/xiaomi/naftis/blob/master/README-CN.md

代码结构

.├── bin                         # 存放编译好的 Go 二进制文件├── config                      # 存放配置文件│   ├── in-cluster.toml         # 在 Kubernetes 集群中启动的配置│   └── in-local.toml           # 本地启动的配置├── install                     # Helm Charts│   └── helm
│       ├── mysql
│       └── naftis
├── src                         # 源码│   ├── api                     # 后端 Go API 服务源码│   │   ├── bootstrap           # 启动 Go API 服务相关参数包│   │   ├── executor            # task 队列执行器│   │   ├── handler             # HTTP handlers│   │   ├── log                 # 基于 zap 封装的 log 包│   │   ├── middleware          # HTTP 中间件│   │   ├── model               # 全局通用 model│   │   ├── router              # HTTP 路由│   │   ├── service             # 封装好的服务│   │   ├── storer              # db storer│   │   ├── util                # 工具类包│   │   ├── version             # 提供运行时的版本信息等显示的支持│   │   ├── worker              # task worker│   │   └── main.go             # Go API 入口│   └── ui                      # 前端源码│       ├── build               # Webpack 打包脚本│       ├── src                 # 前端 js 源码│       ├── package.json
│       ├── package-lock.json
│       ├── postcss.config.js
│       ├── README-CN.md
│       └── README.md
├── tool                        # Makefile 可能会用到的一些编译脚本│   ├── img
│   ├── apppkg.sh
│   ├── build.sh
│   ├── cleanup.sh              # 清理 Naftis│   ├── conn.sh
│   ├── genmanifest.go          # 生成 Kubernetes 部署清单│   ├── gentmpl.go
│   ├── naftis.sql              # Naftis 数据迁移脚本│   ├── naftis.conf             # Naftis nginx 配置文件│   └── version.sh
├── vendor                      # Go 依赖├── Dockerfile.api              # 编译 Go API 镜像的 dockerfile├── Dockerfile.ui               # 编译前端 UI 镜像的 dockerfile├── Gopkg.lock                  # dep 版本锁定文件,由 dep 生成├── Gopkg.toml                  # dep 版本约束文件,用户可编辑├── LICENSE
├── Makefile                    # Makefile文件├── mysql.yaml                  # Kubernetes MySQL 部署清单,由 Helm 生成├── naftis.yaml                 # Kubernetes API 和 UI 部署清单,由 Helm 生成├── README-CN.md
├── README.md
└── run                         # 本地快速启动脚本

功能

  • 内部集成了一些常用 dashboard

  • 可定制的任务模板支持

  • 支持回滚指定任务

  • 支持指定根服务节点的服务拓扑图

  • 提供查看 Istio 的 Services 和 Pod 的支持

  • 开箱即用,通过 Kubectl 相关指令即可快速部署

  • 支持 Istio 1.0

依赖

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

  • Istio > 1.0

  • Kubernetes >= 1.9.0

  • HIUI >= 1.0.0

HIUI

Naftis 前端 UI 使用由小米前端组开源的 React 组件 HIUI 构建,参考:

https://github.com/XiaoMi/hiui

快速开始

# 下载最新 release 文件和部署清单wget -O - https://raw.githubusercontent.com/XiaoMi/naftis/master/tool/getlatest.sh | bash# 在本地 Kubernetes 集群或 Minikuber 上kubectl create namespace naftis && kubectl apply -n naftis -f mysql.yaml && kubectl apply -n naftis -f naftis.yaml# 在各云服务商提供的 Kubernetes 集群上,比如 GKE、阿里云、AWSkubectl create namespace naftis && kubectl apply -n naftis -f mysql-cloud.yaml && kubectl apply -n naftis -f naftis-cloud.yaml# 通过端口转发的方式访问 Naftiskubectl -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 集群内运行

# 下载最新 release 文件和部署清单wget -O - https://raw.githubusercontent.com/XiaoMi/naftis/master/tool/getlatest.sh | bash# 创建 Naftis 命名空间$ kubectl create namespace naftis# 确认 Naftis 命名空间已创建$ kubectl get namespace naftis
NAME           STATUS    AGE
naftis         Active    18m# 部署 Naftis MySQL 服务(本地 Kuberenetes 集群)$ kubectl apply -n naftis -f mysql.yaml# 部署 Naftis MySQL 服务(云服务商提供的 Kuberenetes 集群)$ kubectl apply -n naftis -f mysql-cloud.yaml# 确认 MySQL 已部署NAME                           READY     STATUS    RESTARTS   AGE
naftis-mysql-c78f99d6c-kblbq   0/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# 端口转发访问 Naftiskubectl -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 替换成本地 MySQL 实例的 DSN。

启动 API 服务

  • Linux

make build && ./bin/naftis-api start -c config/in-local.toml -i=false

./run
  • Mac OS

GOOS=darwin GOARCH=amd64 make build && ./bin/naftis-api start -c config/in-local.toml -i=false

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请求数量等。

小米开源 Istio 工具 Naftis

服务管理

服务详情

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

小米开源 Istio 工具 Naftis

服务 Pod 和拓扑图等

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

小米开源 Istio 工具 Naftis

任务模板管理

任务模板列表

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

小米开源 Istio 工具 Naftis

查看指定模板

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

小米开源 Istio 工具 Naftis

新增模板

点击“新增模板”可以向系统中新增自定义模板。添加模板名称、模板简述、模板内容后, 点击 "Generate rows"按钮,Naftis 会解析模板内容,提取变量列表。

用户可以自行修改变量属性,包括变量注释、变量的表单元素类型、变量的数据元等。

注:默认提供了 HostNamespace 两个数据源,如果用户对某个变量指定了这两个数据源,则需要同时将变量的表单元素类型设置为 SELECT 

小米开源 Istio 工具 Naftis

创建任务

初始化变量值。 

小米开源 Istio 工具 Naftis

确认变量值。 

小米开源 Istio 工具 Naftis

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

小米开源 Istio 工具 Naftis

Istio 诊断

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

Docker 镜像

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

开发者指南

获取源码

go get github.com/xiaomi/naftis

配置环境变量

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

# Change GOOS and GOARCH with your environment.export GOOS="linux"   # or replace with "darwin", etc.export GOARCH="amd64" # or replace with "386", etc.# Change USER with your Docker Hub account for pulling and pushing custom docker container builds.export USER="sevennt"export HUB="docker.io/$USER"

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

Go 依赖

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

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

代码风格

  • Go

  • React

其他指令

make                # 编译所有 targetsmake 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 # 显示版本信息helm template install/helm/naftis --name naftis --namespace naftis > naftis.yaml # 本地渲染 Kubernetes 清单./tool/cleanup.sh # 清理已部署的 Naftis

架构


参考:

https://www.oschina.net/news/101170/xiaomi-opensource-naftis

https://github.com/xiaomi/naftis/blob/master/README-CN.md

---END---

K8S培训推荐

Kubernetes线下实战培训,采用3+1新的培训模式(3天线下实战培训,1年内可免费再次参加),资深一线讲师,实操环境实践,现场答疑互动,培训内容覆盖:Docker架构、镜像、数据存储、网络、以及最佳实践。Kubernetes实战内容,Kubernetes设计、Pod、常用对象操作,Kuberentes调度系统、QoS、Helm、网络、存储、CI/CD、日志监控等。<>

北京站:12月30-31日,1月1日(元旦3天),深圳:12月21-23日;上海:1月4-6日; 咨询/报名:曹辉/15999647409

以上是关于小米开源 Istio 工具 Naftis的主要内容,如果未能解决你的问题,请参考以下文章

GoogleIBM和Lyft开源其大型微服务系统管理工具Istio

生日快乐 Istio!

massCode 一款优秀的开源代码片段管理器

Istio Service Mesh 教程——一文了解 Istio 全部功能,示例见 GitHub

收藏篇!Istio全部功能,知否知否?

分享一个基于小米 soar 的开源 sql 分析与优化的 WEB 图形化工具