服务等级目标SLO可以用于衡量服务的水平。用户可以基于Prometheus指标手动定义SLO,但过程相对繁琐。ASM服务网格提供了生成SLO以及配套的告警规则的能力,能够通过自定义资源YAML配置的方式简化这一流程。本文将介绍如何将生成的规则导入到Prometheus中以及如何执行SLO。
系列文章:
在ASM中为应用服务启用SLO(1):服务等级目标SLO概览
https://developer.aliyun.com/article/1114965
在ASM中为应用服务启用SLO(2):服务网格中的SLO定义
https://developer.aliyun.com/article/1115135
在ASM中为应用服务启用SLO(3):使用ASM定义应用服务级SLO
https://developer.aliyun.com/article/1115152
在ASM中为应用服务启用SLO(4):导入生成的规则到Prometheus中执行SLO
https://developer.aliyun.com/article/1115171
在ASM中为应用服务启用SLO(5):使用Grafana查看SLO
https://developer.aliyun.com/article/1115187
前提条件
- 已创建ASM实例,且ASM实例为1.15.3或以上版本。具体操作,请参见创建ASM实例。
- 已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群。
- 安装Prometheus监控到ACK。具体操作,请参见开源Prometheus监控和集成自建Prometheus实现网格监控。
- 添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
- 已部署入口网关服务。具体操作,请参见添加入口网关服务。
- 已开启自动注入。具体操作,请参见多种方式灵活开启自动注入。
- 已定义应用服务级SLO。具体操作,请参见使用ASM定义应用服务级SLO
部署示例应用
在集群中部署httpbin应用并配置相应的虚拟服务与网关规则。
1. 在ACK集群中部署httpbin应用
将下面的yaml文件保存为httpbin.yaml
,通过kubectl连接到ACK集群,执行命令kubectl apply -f httpbin.yaml
################################################################################################### httpbin service##################################################################################################apiVersion v1 kind ServiceAccount metadata name httpbin ---apiVersion v1 kind Service metadata name httpbin labels app httpbin service httpbin spec portsname http port8000 targetPort80 selector app httpbin ---apiVersion apps/v1 kind Deployment metadata name httpbin spec replicas1 selector matchLabels app httpbin version v1 template metadata labels app httpbin version v1 spec serviceAccountName httpbin containersimage docker.io/kennethreitz/httpbin imagePullPolicy IfNotPresent name httpbin portscontainerPort80
2. 在ASM服务网格中配置虚拟服务和网关规则
将下面的yaml保存为文件httpbin-gateway.yaml
,切换kubectl连接至服务网格,执行命令kubectl apply -f httpbin-gateway.yaml
apiVersion networking.istio.io/v1alpha3 kind Gateway metadata name httpbin-gateway spec selector istio ingressgateway serversport number80 name http protocol HTTP hosts"*"---apiVersion networking.istio.io/v1alpha3 kind VirtualService metadata name httpbin spec hosts"*" gateways httpbin-gateway httproutedestination host httpbin port number8000
导入规则到Prometheus
本示例中使用的Prometheus通过Prometheus Operator模式进行部署。在Operator模式下,Prometheus的相关配置是通过Prometheus定义的相关自定义资源来决定的。根据使用的Prometheus部署方式的不同,需要采用不同的方法来部署生成的Prometheus规则。如有需要,可以参考Prometheus官方网站了解如何导入规则。
要配置recordingrules和告警规则,可以通过新建PrometheusRule
cr,创建一个具有 app: ack-prometheus-operator和release: ack-prometheus-operator 标签的PrometheusRule
对象。
注意:具体需要添加的标签取决于在cr Prometheus
中标签选择器ruleSelector
的设置,为空可以不加,实际使用中需要根据实际情况调整 。在ACK中获取ruleSelector
参数的方法如下:
- 登录容器服务管理控制台,在集群列表页面中,单击目标集群名称,进入集群信息页面。
- 在左侧导航栏,选择工作负载 > 自定义资源
- 在资源定义标签页找到自定义资源Prometheus并单击进入资源对象浏览器标签页
- 切换命名空间为monitoring,找到ack-prometheus-operator-prometheus,单击右侧操作列下的YAML编辑
- 查找
ruleSelector
字段,结构如下。为了被选中,PrometheusRule
需要包含matchLabels
中的标签。
ruleSelector matchLabels app ack-prometheus-operator release ack-prometheus-operator
本示例中,PrometheusRule
的结构如下:
apiVersion monitoring.coreos.com/v1 kind PrometheusRule metadata labels app ack-prometheus-operator release ack-prometheus-operator name asm-rules namespace monitoring spec# 此处替换为生成的规则文件
将上述生成的规则文件替换到spec字段中后,将yaml格式的cr保存为prometheusrule.yaml
。
使用kubectl连接到ACK集群,执行命令kubectl apply -f prometheusrule.yaml
将cr添加到集群中。
打开集群控制台,可以看到PrometheusRule
的对应controller会自动将配置写入configmap中供Prometheus读取。
执行SLO
查看Prometheus监控数据及告警信息
使用kubectl连接到ACK集群,在本地终端运行kubectl --namespace monitoring port-forward svc/ack-prometheus-operator-prometheus 9090
,点击http://localhost:9090访问Prometheus控制台,
在首页查询框内输入asm_slo_info
后点击执行,查看配置的SLO,结果如下图所示,说明成功配置了Prometheus Recording Rules:
点击切换到Alerts标签页查看告警规则,能看到下图所示的两条规则,说明成功配置了Prometheus Alerting Rules:
模拟正常请求
请将大括号中内容替换成自己的网关ip后,在命令行执行下方脚本,模拟99.5%成功率的情况下产生的指标。
for i in`seq 200`doif (( $i==100 )) thencurl-I http://{网关ip}/status/500; elsecurl-I http://{网关ip}/; fiecho"OK"sleep0.01; done;
提示:如何获取网关ip请参考文档:添加入口网关服务
返回Prometheus控制台首页,输入slo:period_error_budget_remaining:ratio
后点击执行,查看剩余的错误预算的变化:
关于SLO的几个关键指标(相关术语请参考:《服务等级目标SLO概览》 ):
slo:period_error_budget_remaining:ratio
:SLO持续时间(30d)的剩余错误预算slo:sli_error:ratio_rate30d
:SLO持续时间(30d)内的平均错误率slo:period_burn_rate:ratio
:SLO持续时间(30d)内的燃烧率slo:current_burn_rate:ratio
:当前燃烧率
模拟异常请求
手动触发故障以测试告警。用户可将大括号中内容替换成自己的网关ip后,在命令行执行下方脚本,模拟请求出错时,50%成功率(燃烧率为50)的情况下产生的指标。
for i in`seq 200`docurl-I http://{网关ip}/ curl-I http://{网关ip}/status/500; echo"OK"sleep0.01; done;
告警触发后,在Alerts页面可以看到:
在AlertManager中查看告警
在Prometheus框架中,由Alertmanager组件负责收集Prometheus Server产生的告警信息,并根据用户的配置发送给各个接收者。
在终端运行kubectl --namespace monitoring port-forward svc/ack-prometheus-operator-alertmanager 9093
,点击http://localhost:9093访问Alert Manager控制台,可以看到Alert Manager也成功采集到了自定义告警信息。