31

[译] 使用 Istio 和 Envoy 实践服务网格 gRPC 度量

 5 years ago
source link: https://mp.weixin.qq.com/s/_MDu8xSngpr358-fosbCbQ?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

jU3QbeU.jpg!web

作者:Renato Stoco 译者:陈冬 原文:https://medium.com/pismolabs/istio-envoy-grpc-metrics-winning-with-service-mesh-in-practice-d67a08acd8f7

在这个令人惊奇的时代,我们可以不需要编写一行代码,便可以很智能的集成应用程序,收集应用程序指标。

在这篇文章中,我将演示使用 helm 安装 Istio mtls 环境、必要的 yamls 配置以及安装 Istio 带来的其他收获。另外,在文章最后,我还会展示路由配置的一些例子。

假设你已经安装好 Kubernetes 和 helm,并且对他们都有一定的了解。本教程将以 AWS 作为我们的运行环境。请参考官方安装文档:

https://istio.io/docs/setup/kubernetes/helm-install/

以下是 Istio 的官方拓扑图:

eE7bmaI.jpg!web

通过我们的设置,所有的容器会连同一个 istio-proxy 一起创建并部署到 istio-injected 的命名空间中。应用程序将与 istio-proxy (envoy) 进行通信,然后后者将处理所有的链接、mtls 以及其他应用程序的负载均衡。

安装以及配置

开始步骤,下载并解压 istio-1.0.0 安装包

修改 istio 目录下的 values.yaml 文件,修改环境需要的设置

以下修改将使 istio ingressgateway 的 mtls、ingress(用于监控服务)和 ssl 端口(443)重定向到 80 端口,并支持插件到安装(grafana, servicegraph, jaeger and kiali): 获取修改后到 values.yaml 文件,示例

修改完成后,安装所有的程序并查看 Istio 运行情况!

首先,如果使用 2.10.0 之前的 Helm 版本,可以通过 kubectl apply 安装 Istio 的自定义资源;如果不是这类版本,请跳过此步。

安装 Istio ( 请使用我们调整过的 values.yaml 文件 )

检查你的 istio-system 命名空间,并查看 pods 是否可以展示出来!同时为你的应用程序创建一个命名空间:

现在可以为它加上标签,让 Istio 知道在哪里注入 istio-proxies。

现在我们的环境已经运行起来,让我们思考一下应用程序是如何相互通信的。在网格中的服务通过 envoy 来处理双向通行和负载均衡以达到服务间相互通信。那些不在网格中的服务该如何处理呢?你可能想知道他们如何与我们的服务进行沟通,我们的服务如何与网格外部的服务进行通信。这就是我们配置入口的地方。下图将说明外部服务如何与网格内的应用进行联系的:

Uz2yma7.jpg!web

所有外部的流量将通过 Istio-ingressgateway 进入网格中,Istio-ingressgateway 会尝试查找网格内主机与路径匹配一致的虚拟服务。如果未查找到匹配的虚拟服务,则外部服务将访问不到网格内的应用程序。

提示:正是因为这样的虚拟服务,我们可以做到流量的管理!

对于网格中的服务需要访问外部的服务,例如:访问镜像中的存储应用,你还需要做虚拟服务的流量映射。

本教程中,我们可以使用下面的 yaml 文件(也可以指定 ips)访问网格中的所有主机:

我们需要确保 istio-ingressgateway 已经映射入 istio-apps 的命名空间中。首先,检查你的 istio-ingressgateway 服务,并指向由该服务创建的负载均衡器的域名。

使用下面的 yaml 配置映射你的域名到 istio-ingressgateway,教程中我们使用 *.yourdomain。在生产环境中需要一个个的映射你的主机(这步操作需要花费一些时间才能生效):

现在可以准备测试我们的环境了。我已经使用 http(8080)/grpc(8333) 创建了一个应用程序,在测试环境调用第二个应用程序。同时创建了一个部署服务的文件来启动测试。请复制下面的 yaml 文件并应用到你的环境中:

现在,我们将创建我们的虚拟服务来映射到我们的应用程序,已便 istio-ingressgateway 可以将流量路由到我们的应用程序中( 修改配置中的 application.yourdomain 修改为你的域名

虚拟服务将主机映射到任何你想匹配的服务上,在示例中,第一条规则是匹配到服务 http 健康端点,如果匹配失败将跳转到 grpc 服务端口上。在重试的部分可以帮助我们知道网络是否有干扰或有不健康的 Pods。你可以添加更多你需要的匹配项,通过这些规则可以将任何形式的请求匹配到主机上:

你可以尝试一下方式访问 /health 端点:

你将接收到200,同时你的应用也会记录接受到的请求。 如果你接收到404,可能是你的虚拟服务没有将你的请求地址映射到你的服务上

请尝试如下方式:

你的应用程序会请求第二个应用程序,请检查应用程序二的日志记录。

Istio 也可以使用同样的规则映射 grpc 请求。复制应用程序仓库并使用同样的方式创建应用,修改 main.go 中的域名地址并进行尝试。

https://github.com/Stocco/istioapplications

网格的可视化度量

有很多方法来可视化网格中的内容,我将在本节中列举几种。

请注意,Istio 将收集所有需要的度量参数来绘制监控图形和对象,但是对于像 Kiali 和 Jaeger 这样的度量服务,你需要确保应用程序可以传播 Istio injected 的请求头,这样就可以将应用程序的请求历史连接起来。

检查应用程序处理健康功能的示例:https://github.com/Stocco/istioapplications/blob/a3c3275a63a0667f870d054ea5940284b8a100af/main.go#L72

Kiali

Kiali可以帮助我们了解实时发生的事情。将 kiali 端口暴露到本地,这样就可以查看应用程序:

点击链接并使用 admin(username)/admin(password) 登录:

你可以看到如下界面:

fMn2UnM.jpg!web

这样就成功了,Kiali 还有很多工具有待挖掘。

Jaeger

Jaeger 是一个功能强大的监控工具,可以用来监听请求到执行情况以及请求在每个部分中执行的时长。但是,你需要注意的是,如果你需要使用它更多的潜在功能,你需要适当的调整你的代码来传播 Istio injected 的头。如果你需要了解更多关于请求的信息,你需要使用一些工具(例如:opentracing)来获取应用程序内部功能调用的度量数据。

暴露 jaeger 端口和访问权限 http://localhost:16686

VBRvqaB.jpg!web

在左边的界面中有一些过滤条件,选择你需要的条件,你可以通过点击查找到的数据查看最新的跟踪路径。选择一条跟踪路径,你可以查看到应用程序中每一个请求的所消耗的准确时间。

ZRJV7bm.jpg!web

如果在应用程序中安装了 opentracing 并在每个功能调用的地方都使用到了,则会有更好的体验。

更多的度量工具

现在有3个应用程序通过 values.yaml 已经安装好了,并使用 Istio 收集了需要度量的数据。尝试使用 grafana,prometheus和servicegraph 检查应用。

使用一下命令暴露应用程序:

智能路由

如果你可以管理应用程序的版本?Istio 可以为 virtualservice.yaml 提供微小的修改。让我们来调整我们的虚拟服务( 修改 application.yourdomain 为你的应用程序名

规则遵循优先顺序。现在可以使用前一章节中给的 curl 命令,并将头放到第一条规则中:

你可以从第二个应用程序中查看到日志,而不是在第一个程序!这是因为第一条规则匹配到了。

Grpc ssl 目标规则

如果你在工作中使用过 grpc,你知道将 ssl 应用到 grpc 调用时会存在一个问题。主要是因为你需要将服务服务器的证书放入到代码中才能使 ssl 管道生效。如何在基础设置中设置一些配置达到这样的调用目标呢?

尝试为你的域名创建服务条目和目标规则,并查看你的非 ssl 应用程序对外部 grpc 服务进行了加密的调用!

有很多的服务条目和目标规则选项,你可以将他们结合起来为应用程序创建更丰富的环境。你可以通过下面的地址查看更多的信息。

我们只是初出茅庐

祝贺你,你已经获得了第一个 Istio 环境应用程序。现在,可以尝试将我的 deployment.yaml 替换成你自己的应用程序并查看它在 Istio 中的运行情况。

使用 Istio 可以获得很多额外的好处,例如特殊的目标规则,自定义策略和自定义度量,但这是下一章的主题。

如果您对本教程有任何疑问、建议或反馈,请随时添加任何意见并与我联系!

社区见!

相关阅读推

通知

为了方便中文用户交流分享 Istio Service Mesh 技术,Istio 社区特地推出了 Istio 中文用户邮件组: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!forum/istio-users-zh

I s t i o

I B M I s t i o

  • 1 1 1 I s t i o

  • 1 1 8 Istio上手

  • 1 1 1 5 I s t i o

  • 11月22日 E n v o y

  • 1 1 2 9 使 I s t i o

  • 1 2 6 I s t i o m i x e r -

  • 1 2 1 3 I s t i o

  • 1 2 2 0 I s t i o 使 S e r v e r l e s s k n a t i v e

  • I B M I s t i o

点击 【阅读原文】 跳转 到ServiceMesher网站上浏览可以查看文中的链接。

MnAvQfn.jpg!web

  • SOFAMesh( https://github.com/alipay/sofa-mesh )基于Istio的大规模服务网格解决方案

  • SOFAMosn( https://github.com/alipay/sofa-mosn )使用Go语言开发的高性能Sidecar代理

合作社区

aq6ZraM.jpg!web

参与社区

以下是参与ServiceMesher社区的方式,最简单的方式是联系我!

  • 加入微信交流群: 关注本微信公众号后访问主页右下角有获取联系方式按钮,添加好友时 请注明姓名-公司

  • 社区网址: http://www.servicemesher.com

  • Slack: https://servicemesher.slack.com  (需要邀请才能加入)

  • GitHub: https://github.com/servicemesher

  • Istio中文文档进度追踪: https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章线索与投稿: https://github.com/servicemesher/trans

IZrUnui.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK