概述
在前面系列文章中已经介绍了Istio及其各个核心组件,详述了如何利用阿里云Kubernetes容器服务,快速搭建一套用于连接、管理以及保护微服务的开放平台Istio,为应用引入和配置多个相关服务;并且通过一个官方示例演示了如何部署应用到上述Istio环境中,演示了如何设置智能路由、分布式追踪以及Istio 的遥测数据收集、查询及可视化等功能。
回顾这个系列文章请参考:
阿里云Kubernetes Service Mesh实践进行时(1): Istio初体验
阿里云Kubernetes Service Mesh实践进行时(2): 通过示例深入Istio
阿里云Kubernetes Service Mesh实践进行时(3): 智能路由
阿里云Kubernetes Service Mesh实践进行时(4): 分布式追踪
阿里云Kubernetes Service Mesh实践进行时(5): 遥测数据收集、查询及可视化
阿里云Kubernetes Service Mesh实践进行时(6): 故障诊断与检测工具Weave Scope
阿里云Kubernetes Service Mesh实践进行时(7): 可观测性分析服务Kiali
阿里云Kubernetes容器服务已经提供了Istio与日志服务Log Service的集成能力,本文通过一个官方示例来重点介绍Istio与基于阿里云日志服务的分布式追踪系统的整合能力。
注意:在使用阿里云Kubernetes容器服务Istio 1.0的过程中,如果遇到类似CRD版本问题,请参考我们提供的问题分析。 我们会持续更新遇到的问题及其解决方法。
回顾 OpenTracing
为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。OpenTracing 已进入 CNCF,正在为全球的分布式追踪,提供统一的概念和数据标准。它通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
Jaeger 是 CNCF下的一款开源分布式追踪系统,兼容 OpenTracing API。
阿里云日志服务Log Service与分布式追踪系统Jaeger
日志服务(Log Service,简称LOG/原SLS)是针对实时数据一站式服务,在阿里集团经历大量大数据场景锤炼而成。提供日志类数据采集、消费、投递及查询分析功能,全面提升海量日志处理/分析能力。具体可参见 日志服务。
Jaeger 是 Uber 推出的一款开源分布式追踪系统,为微服务场景而生。它主要用于分析多个服务的调用过程,图形化服务调用轨迹,是诊断性能问题、分析系统故障的利器。
Jaeger on Aliyun Log Service 是基于 Jeager 开发的分布式追踪系统,支持将采集到的追踪数据持久化到阿里云日志服务中,并通过 Jaeger 的原生接口进行查询和展示。
Jaeger-client
Jaeger-client 为不同语言实现了符合 OpenTracing 标准的 SDK。应用程序通过 API 写入数据,客户端库library 把 trace 信息按照应用程序指定的采样策略传递给 jaeger-agent。数据使用 Thrift 序列化,通过 UDP 进行通信。
Jaeger-agent
Jaeger-agent 是一个监听在 UDP 端口上接收 span 数据的网络守护进程,它会将数据批量发送给Jaeger-collector。它被设计成一个基础组件,部署到所有的宿主机上。Jaeger-agent代理将 Jaeger-client 和 Jaeger-collector 解耦,为 Jaeger-client library 屏蔽了路由和发现 collector 的细节。
Jaeger-collector
接收 jaeger-agent 发送来的数据,然后将数据写入后端存储。后端存储是一个可插拔的组件,Jaeger on Aliyun Log Service 增加了对阿里云日志服务的支持。
阿里云日志服务Log Service
Jaeger-collector 会将接收到的 span 数据持久化到日志服务Log Service中。Query 会从日志服务中检索数据。
Query&UI
接收查询请求,从后端存储系统中检索 trace 并通过 UI 进行展示。
准备Kubernetes环境
阿里云容器服务Kubernetes 1.10.4目前已经上线,可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。具体过程可以参考[创建Kubernetes集群]
通过应用目录简便部署Istio
点击左侧的应用目录
,在右侧选中ack-istio
,在打开的页面中点击参数
, 可以通过修改参数配置进行定制化,如下所示:
原生 Jaeger 仅支持将数据持久化到 cassandra 和 elasticsearch 中,用户需要自行维护后端存储系统的稳定性,调节存储容量。Jaeger on Alibaba Cloud Log Service 借助阿里云日志服务的海量数据处理能力,让您享受 Jaeger 在分布式追踪领域带来便捷的同时无需过多关注后端存储系统的问题。
阿里云Kubernetes容器服务中整合了日志服务Log Service, 其分布式追踪数据会保存到阿里云日志服务Log Store中,所以在参数配置中,我们将原有的tracing设置为false,即不启用,同时设置tracing-on-sls配置如下所示:
# tracing(jaeger on AliCloud Log Service)
tracing-on-sls:
enabled: true
storage:
type: aliyun-log
aliyun_sls:
project: newlogsample
logstore: mylogstore1
endpoint: cn-hangzhou.log.aliyuncs.com
accesskey:
id:
secret:
.......
tracing:
enabled: false
tracing-on-sls参数说明如下:
参数名 | 参数类型 | 描述 |
---|---|---|
enabled | 布尔型 | true表示启用,false表示禁用 |
storage.type | 字符串 | 指定用于存储 Span 的 类型,当前值必须为aliyun-log |
storage.aliyun_sls.project | 字符串 | 指定用于存储 Span 的 Project;项目名称只能包含小写字母、数字和连字符(-),且必须以小写字母和数字开头和结尾,长度为 3~63 个字节。 |
storage.aliyun_sls.endpoint | 字符串 | 指定用于存储 Span 的 Project 所在的 Endpoint |
storage.aliyun_sls.accesskey.id | 字符串 | 指定用户标识 Access Key ID |
storage.aliyun_sls.accesskey.secret | 字符串 | 指定用户标识 Access Key Secret |
storage.aliyun_sls.logstore | 字符串 | 指定用于存储 Span 的 Logstore;须由小写字母、数字、连字符(-)和下划线(_)组成,且以小写字母或者数字开头和结尾,长度为3-63字节。Logstore 名称在其所属项目内必须唯一。 |
注意的是,如果指定的Project不存在,系统会自动创建一个新project,并且完成相应的初始化工作。
修改之后,在右侧选择对应的集群、命名空间istio-system,指定发布名称,然后点击部署。
几分钟之后,一套用于连接、管理以及安全化微服务的开放平台Istio实例就可以创建出来。
体验Istio
点击左侧的容器组
,在右侧可以查看到刚创建的Istio相关容器组信息,如下所示:
点击左侧的服务
,在右侧可以查看到刚创建的Istio相关服务提供的访问地址,如下所示:
部署应用示例
使用 Istio 运行应用程序示例不需要修改应用程序本身,而只需要在支持 Istio 的环境中配置和运行服务, Envoy sidecar 将会注入到每个服务中。
所有的微服务都将与一个 Envoy sidecar 一起打包,拦截这些服务的入站和出站的调用请求,并且提供了一个所需的 hook来完成控制功能,即利用 Istio 控制平面从外部控制整个应用的路由、遥测收集和策略执行。
下载安装istioctl
可以通过以下地址下载,安装之后可以找到示例代码的目录:
https://github.com/istio/istio/releases/
安装示例bookinfo
默认情况下需要手动注入 sidecar,运行下面的命令:
kubectl apply -f <(istioctl kube-inject --debug -f samples/bookinfo/platform/kube/bookinfo.yaml)
其中,istioctl kube-inject 命令用于在创建部署之前修改 bookinfo.yaml 文件,这样 Envoy会作为sidecar被注入到 Kubernetes 资源中。
自动注入Sidecar的功能在最新的阿里云Kubernetes容器服务中已经得到支持,请关注后续文章了解如何启用自动注入Sidecar功能。
上述命令启动四个微服务,如下图所示。3 个版本的reviews的服务 v1、v2、v3 都已启动。
运行下面的命令定义Ingress网关:
istioctl create -f samples/bookinfo/networking/bookinfo-gateway.yaml
至此,示例中的微服务及其sidecar、Ingress都会建立,如下:
确保所有服务已经正常启动:
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 172.19.2.177 <none> 9080/TCP 15m
productpage ClusterIP 172.19.15.184 <none> 9080/TCP 15m
ratings ClusterIP 172.19.9.228 <none> 9080/TCP 15m
reviews ClusterIP 172.19.11.177 <none> 9080/TCP 15m
访问应用程序
运行下面的命令获取Ingress地址信息:
kubectl get svc istio-ingressgateway -n istio-system
当然,也可以通过阿里云容器服务的界面查看Ingress地址信息,如下所示,点击左侧的服务
,在右侧选择命名空间istio-system
,就可以找到istio-ingressgateway的信息。
访问示例页面: http://{EXTERNAL-IP}/productpage
多次刷新浏览器将在 productpage 中看到评论的不同的版本,它们会按照 round robin(红星、黑星、没有星星)的方式展现。
查看分布式调用链跟踪Jaeger on Aliyun Log Service
Jaeger收集启用了Istio的应用程序的调用链信息,点击阿里云容器服务页面中左侧服务
栏,找到 tracing-on-sls-query
服务,如下:
点击 tracing-on-sls-query
服务的外部端点地址,会看到如下一个Jaeger UI页面:
Jaeger UI显示了分布式服务追踪信息的结果,右上角显示的时刻和持续时间散点图用可视化方式呈现了结果,并提供了向下挖掘能力。
用户可以选择用多种不同视图对追踪结果进行可视化,例如追踪时段内的直方图,或服务在追踪过程中的累积时间:
查看阿里云日志服务Log Service
登录日志服务控制台,选择目标项目,单击项目名称。点击日志消费模式->查询分析->查询
,如下所示:
日志服务查询分析功能除了提供日志内容的各种语句查询能力以外,还提供以下多种扩展功能优化您的查询。
原始日志:
统计图表:
总结
阿里云Kubernetes容器服务已经提供了Istio与日志服务Log Service的集成能力,本文通过一个官方示例来重点介绍了Istio与基于阿里云日志服务的分布式追踪系统的整合能力。
欢迎大家使用阿里云上的容器服务,快速搭建微服务的开放治理平台Istio,比较简单地集成到自己项目的微服务开发中。