阿里云容器服务Kubernetes(简称ACK)支持一键部署Istio,可以参考文档在ACK上部署使用Isito。Istio on ACK提供了丰富的监控能力,为网格中的服务收集遥测数据,其中Mixer是负责提供策略控制和遥测收集的Istio组件。使用Prometheus进行监控是Istio提供的监控能力之一。Prometheus是一个开源的监控和报警系统,Prometheus依赖少,功能齐全,广泛用于Kubernetes集群的监控系统中。Istio自0.8版本开始默认将Prometheus包含在内,Mixer支持对接到Prometheus监控设施的Adapter。用户可以通过查询service或pod看到Prometheus的运行状态和地址。也可以通过简洁明了的Prometheus的UI界面查看监测数据。
Prometheus的存储挑战及解决方案
Prometheus的本地存储设计可以减少其自身运维和管理的复杂度,能够满足大部分用户监控规模的需求,但是本地存储也意味着Prometheus无法持久化数据,无法存储大量历史数据,同时也无法灵活扩展。Prometheus本身没有尝试解决以上问题,而是通过定义一组remote storage adapter标准接口,让用户可以基于这组标准接口自主决定将Promthues中的监控样本数据存储至第三方的远端存储服务中,来解决本地存储带来的问题。
TSDB for Prometheus是一种高性能,低成本,稳定可靠的在线时序数据库服务,通过内置实现的Prometheus的remote storage adapter,天然原生支持作为Promtheus的第三方在线远端存储服务。
相较于其他第三方远端存储而言,TSDB for Prometheus具有集成程度高,同时支持读写等优势。
- 集成程度高
目前Prometheus对接第三方存储系统的主流做法是实现一个独立于第三方存储系统的remote storage adapter, 这个adapter需要单独部署和运维,另外单独部署的remote storage adapter还存在单点故障和读写性能问题。
TSDB for Prometheus在服务端内置实现的Prometheus remote storage adapter,只需在Prometheus的配置文件prometheus.yaml中修改下远程读写配置,即可原生支持Prometheus直接读写TSDB,集成程度高,无需额外单独部署adapter,极大地降低了adapter的单点故障风险和运维成本。
- 同时支持读写
当前一些第三方远端存储仅支持Prometheus将监控样本数据写入,而不支持读取。比如对于OpenTSDB、Graphite和Elasticsearch等第三方存储,Prometheus社区提供的adapter只支持写入模式,不支持读取模式。而TSDB for Prometheus同时支持读写。如要了解更多第三方存储系统对于Prometheus读写的支持程度,请参考Remote Endpoints and Storage。
TSDB for Prometheus
时序时空数据库(Time Series & Spatial Temporal Database,简称 TSDB)是一种高性能、低成本、稳定可靠的在线时序时空数据库服务,提供高效读写、高压缩比存储、时序数据插值及聚合计算等服务。TSDB 具备秒级写入百万级时序数据的性能,提供高压缩比低成本存储、预降采样、插值、多维聚合计算、可视化查询结果等功能。
TSDB for Prometheus是阿里云时序时空数据库TSDB为Prometheus提供的一种高性能、低成本、稳定可靠的在线远端存储服务,具备以下能力:
- 提供高效读写、高压缩比存储的能力,可无缝被Prometheus集成,在协议上原生支持Prometheus远端存储对接至TSDB。
- 解决了以往需要为Prometheus额外开发remote storage adapter的问题,极大的降低了Prometheus远端存储对接TSDB的成本。
- TSDB for Prometheus最大程度的兼容Prometheus的PromQL查询语法,从而降低了用户的开发,迁移和维护成本。
- 解决Prometheus local stroge 无法存储大量历史数据的场景,且无法扩展的问题。
- 通过内置实现的Prometheus的remote storage adapter,天然原生支持作为Promtheus的第三方在线远端存储服务。
- 相较于其他第三方远端存储而言,TSDB for Prometheus具有集成程度高,同时支持读写等优势。
TSDB for Prometheus的使用要求具体可以参见使用要求
阿里云提供的不同规格的TSDB实例,设置了不同的最大写入TPS,避免过大TPS导致TSDB示例不可用,保护TSDB实例正常运行。当写入TPS超过TSDB实例允许的最大TPS时,将触发TSDB实例限流保护规则,会造成写入失败异常。因此需要根据TSDB实例规格来调整Prometheus的remote_write配置,从而实现平稳可靠的将Prometheus采集到的指标写入TSDB中。
关于Remote Write配置,除了参考Prometheus官方提供的Remote Write配置说明之外,还可以参考Prometheus对接阿里云TSDB时的写入配置最佳实践。
创建TSDB实例
创建一个TSDB实例非常简单,登录TSDB 控制台,参照创建实例文档即可创建。
获取开通的TSDB实例的地址,可以参考TSDB官方文档快速入门
确认Prometheus所在机器能够正常访问TSDB实例。直接使用http访问TSDB实例的地址,如果能够得到包含”Welcome to use the TSDB”的字符串,表示Prometheus所在机器能够正常访问TSDB实例。
设TSDB实例的公网地址为: ts-xxxxxxxxxxxx.hitsdb.rds.aliyuncs.com:3242,在启用了Prometheus的Istio所在Kubernetes集群下,执行命令:kubectl exec -it -n istio-system $(kubectl get pods -n istio-system -l app=prometheus -o jsonpath='{.items[0].metadata.name}') sh
进入到Prometheus容器之后,执行命令wget -S ts-xxxxxxxxxxxx.hitsdb.rds.aliyuncs.com:3242
,可以得到如下结果:
Connecting to ts-bp1839ak5uf20igcw.hitsdb.rds.aliyuncs.com:3242 (101.37.143.44:3242)
HTTP/1.1 200 OK
Content-Type: Content-Type
index.html 100% |*****************************************************************************************| 361 0:00:00 ETA
然后执行命令 cat index.html,可以得到如下结果:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv=content-type content="text/html;charset=utf-8"><title>TSDB</title>
<style><!--
body{font-family:arial,sans-serif;margin-left:2em}A.l:link{color:#6f6f6f}A.u:link{color:green}.fwf{font-family:monospace;white-space:pre-wrap}//--></style><div>Welcome to use the TSDB!</div>
集成TSDB到Istio on ACK
第一次部署Istio
阿里云容器服务Kubernetes(简称ACK)支持一键部署Istio,可以参考文档在ACK上部署Isito。
如果是第一次部署使用Isito,可以直接按照文档步骤进行部署。
注意,勾选启用Prometheus 度量日志收集选项,默认情况下启用,并勾选持久化存储,提示需要提供可以访问的TSDB地址。此处填写在上述步骤中已经验证可以使用的TSDB实例的地址,例如ts-xxxxxxxxxxxx.hitsdb.rds.aliyuncs.com:3242。
然后单击部署 Istio,启动部署。部署成功之后,Prometheus的监控数据将持久化到对应的TSDB实例中。
更改已有Isito部署配置
如果之前已经部署过Istio,但没有启用Prometheus的持久化存储,则可以按照如下步骤进行配置。
- 登录容器服务管理控制台。
- 在 Kubernetes 菜单下,单击左侧导航栏的应用 > 发布,进入发布页面。
- 单击Helm,选择所需的集群,选择待更新的Istio,单击操作列的更新。
- 在弹出的对话框中,对Istio的Prometheus参数进行修改:
配置 | 说明 |
---|---|
enabled | true或者false,表示是否启用Prometheus 收集度量日志。默认情况下启用,即值为true。 |
replicaCount | prometheus容器组的副本数,默认值为1。 |
persist | true或者false,表示是否启用持久化存储。设置为true时,必须指定TSDB实例地址。 |
tsdbEndpoint | TSDB实例地址,启用持久化存储时必须指定。 |
retention | 默认的数据保留时间,8760h0m0s即为24*365小时,即1年 |
scrapeInterval | 全局默认抓取时间间隔,默认为15s |
- 修改完毕之后,单击更新。
查看Prometheus配置
登录容器服务管理控制台,单击左侧导航栏中的应用配置下的配置项,进入配置项列表页面。点击名称为prometheus的配置项,进入配置项明细页面,如下图所示,可以看到对应的TSDB实例的地址:
TSDB写入和读取验证
TSDB写入验证
可以简单的通过TSDB实例的管理控制台界面的“实例监控”界面,观察写入的TPS是否有所变化来验证。一般刚开始没有任何数据写入时,写入的TPS为0;若TPS开始从0变为正数时,则说明Prometheus已经将数据上报到了TSDB中,如下图所示。
读取验证
在启用了Prometheus的Istio所在Kubernetes集群下,执行命令:kubectl port-forward -n istio-system svc/prometheus 9090:9090
打开浏览器,输入地址http://localhost:9090,进入Prometheus控制台页面。
Istio提供了一系列的默认监控指标,以Prometheus采集到Istio的一个监控指标istio_request_bytes_count为例进行查询认证,结果如下图所示。
至此,一个完整集成TSDB到Istio可观性Prometheus服务的过程已经结束。
总结
在阿里云Kubernetes容器服务基础之上,快速搭建一套用于连接、管理以及安全化微服务的开放平台Istio,为应用引入和配置多个相关服务。使用Prometheus进行监控是Istio提供的监控能力之一,通过集成TSDB有效地解决持久化存储的问题。