如何对Kubernetes中的IngressNGINX进行监控和预警
我们将讨论如何在Kubernetes环境中为Nginx ingress设置监控和警报。
我们将介绍ingress-nginx、Prometheus和Grafana的安装和配置,以及关键Ingress指标的警报设置。前提条件 :一个Kubernetes集群helm v3安装Prometheus和Grafana
在这一步,我们将安装Prometheus来收集指标,并安装Grafana来可视化并根据这些指标创建警报。
让我们通过在终端应用下面提到的命令来安装kube-prometheus-stack helm。这将设置Grafana、Prometheus和其他监控组件。# Add and update the prometheus-community helm repository. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo updatebash cat < /dev/null & 主机上的80端口是一个特权端口,所以我们不使用它。相反,我们将nginx服务的80端口与主机的8080端口绑定。你可以选择任何有效的端口。
注意:如果你在任何云中运行,不需要端口转发,因为ingress-nginx服务的LoadBalancer将被自动创建,因为该服务类型默认定义为LoadBalancer。
5. 现在,你可以运行下面的curl请求到podinfo端点,它应该以.NET的方式响应。curl http://podinfo.localdev.me:8080 "hostname": "podinfo-59cd496d88-8dcsx" "message": "greetings from podinfo v6.2.2"
6. 你也可以在浏览器中获得更漂亮的外观,网址是:http://podinfo.localdev.me:8080/。
为Ingress Nginx监控配置Grafana仪表盘
要访问Grafana,你可以在浏览器中用凭证admin:admin : http://grafana.localdev.me:8080/,打开下面的URL。
从这里复制nginx.json并粘贴到http://grafana.localdev.me:8080/dashboard/import,导入仪表盘。
一旦导入,仪表板应该看起来像这样。
生成样本载荷
为了获得我的podinfo应用程序的流量,我们将使用 vegeta 作为负载测试工具。请从这里安装它。
让我们生成一个HTTP 4xx流量样本。要做到这一点,你可以运行下面的命令,它将以10 RPS的请求率运行10分钟。echo "GET http://podinfo.localdev.me:8080/status/400" | vegeta attack -duration=10m -rate=10/s 你只需将状态代码从400改为500,然后也可以运行,以测试5xx的吞吐量。
对于延迟测试,我使用了以下命令作为GET /delay/{seconds}等待指定的时间。echo "GET http://podinfo.localdev.me:8080/delay/3" | vegeta attack -duration=10m -rate=100/s
注意:你可以从这里阅读更多关于podinfo应用程序中可用的端点。用Grafana对SLI指标进行预警
较新的Grafana带有自己的警报引擎。这有助于将所有的配置、规则、甚至发射警报都放在一个地方。
让我们来配置普通SLI的警报。4XX错误率让我们通过访问http://grafana.localdev.me:8080/alerting/new 来创建一个警报。我们可以用以下公式得到4xx错误率的百分比。
(4xx请求的总数/请求总数) *100
3. 为查询添加以下表达式。(sum(rate(nginx_ingress_controller_requests{status=~"4.."}[1m])) by (ingress) / sum(rate(nginx_ingress_controller_requests[1m])) by (ingress)) * 100 > 5
4. 在表达式B中,对输入A使用Reduce操作和函数Mean。
5. 在 "警报详情 "中,根据你的喜好命名该警报,我将其命名为Ingress_Nginx_4xx。
6. 对于Summary,我们可以尽量缩短,只显示带有标签{{$labels.ingress }}的Ingress名称。Ingress High Error Rate : 4xx on *{{ $labels.ingress }}*
7. 对于描述,我使用printf"%0.2f "来显示百分比值上最多两个小数。4xx : High Error rate : `{{ printf "%0.2f" $values.B.Value }}%` on *{{ $labels.ingress }}*.
8. 整个警报配置应该类似于下面的快照。
9. 最后,你可以添加一个自定义标签,如严重程度:关键。5XX错误率
与4xx警报配置类似,5xx错误率也可以通过以下查询来查询。sum(rate(nginx_ingress_controller_requests{status=~"5.."}[1m])) by (ingress,cluster) / sum(rate(nginx_ingress_controller_requests[1m]))by (ingress) * 100 > 5
注意:我将警报配置为当5xx/4xx百分比>5%时被触发。你可以根据你的错误预算来设置它。高延时 (p95)
为了计算过去15分钟内请求持续时间的第95百分位数,我们可以使用nginx_ingress_controller_request_duration_seconds_bucket指标。
它给出了以毫秒为单位的请求处理时间,由于它是一个桶,我们可以使用histogram_quantile函数。
创建一个类似于上述例子的警报,并使用以下查询。histogram_quantile(0.95,sum(rate(nginx_ingress_controller_request_duration_seconds_bucket[15m])) by (le,ingress)) > 1.5
我把阈值设置为1.5秒,它可以根据你的SLO进行更新。高请求率
为了得到每秒的请求率(RPS),我们可以使用以下查询。sum(rate(nginx_ingress_controller_requests[5m])) by (ingress) > 2000
上述查询将在请求率大于2000RPS时触发警报。其他需要考虑的SLI
连接率。这是对Nginx ingress的活动连接数的测量,可以用来识别连接处理的潜在问题。rate(nginx_ingress_controller_nginx_process_connections{ingress="ingress-name"}[5m])
上游响应时间。底层服务响应一个请求所需的时间,这将有助于识别服务的问题,而不仅仅是入口的问题。histogram_quantile(0.95,sum(rate(nginx_ingress_controller_response_duration_seconds_bucket[15m])) by (le,ingress)) Slack警报模板
为了使警报信息有意义,我们可以在Grafana中使用警报模板。为了配置它们,进入http://grafana.localdev.me:8080/alerting/notifications,通过粘贴以下代码块创建一个名为slack的新模板。{{ define "alert_severity_prefix_emoji" -}} {{- if ne .Status "firing" -}} :white_check_mark: {{- else if eq .CommonLabels.severity "critical" -}} :fire: {{- else if eq .CommonLabels.severity "warning" -}} :warning: {{- end -}} {{- end -}} {{ define "slack.title" -}} {{ template "alert_severity_prefix_emoji" . }} {{- .Status | toUpper -}}{{- if eq .Status "firing" }} x {{ .Alerts.Firing | len -}}{{- end }} | {{ .CommonLabels.alertname -}} {{- end -}} {{- define "slack.text" -}} {{- range .Alerts -}} {{ if gt (len .Annotations) 0 }} *Summary*: {{ .Annotations.summary}} *Description*: {{ .Annotations.description }} Labels: {{ range .Labels.SortedPairs }}{{ if or (eq .Name "ingress") (eq .Name "cluster") }}• {{ .Name }}: `{{ .Value }}` {{ end }}{{ end }} {{ end }} {{ end }} {{ end }}
2. 配置一个新的Slack类型的联系点。为此,你需要从Slack创建一个传入的webhook。更详细的步骤请参考此文档。
3. 编辑接触点的松弛,向下滚动并选择可选松弛设置选项。
4. 在 "标题 "中,输入以下内容以指定要使用的模板。{{ template "slack.title" . }}
5. 在文本主体中,输入以下内容并保存。{{ template "slack.text" . }}
6. 进入http://grafana.localdev.me:8080/alerting/routes,将默认联络点配置为Slack。终于,警报信息到了!
在配置了所有的步骤之后,我们终于到达了终点,下面是警报在你的Slack上的快照。
4xx 错误率 :
5xx 错误率 :
延迟 P95 :
人们可以根据自己的要求改进很多东西。例如,如果你有多个Kubernetes集群,你可以添加一个集群标签,这将有助于识别警报的源集群。