编程技术分享平台

网站首页 > 技术教程 正文

如何对Kubernetes中的Ingress-NGINX进行监控和预警

xnh888 2024-09-11 11:01:13 技术教程 61 ℃ 0 评论

我们将讨论如何在Kubernetes环境中为Nginx ingress设置监控和警报。

我们将介绍ingress-nginx、Prometheus和Grafana的安装和配置,以及关键Ingress指标的警报设置。

前提条件 :

  1. 一个Kubernetes集群
  2. 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 <<EOF | helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
--create-namespace -n monitoring -f -
  bash
grafana:
  enabled: true
  adminPassword: "admin"
  persistence:
    enabled: true
    accessModes: ["ReadWriteOnce"]
    size: 1Gi
      ingress:
    enabled: true
    ingressClassName: nginx
        hosts:
      - grafana.localdev.me
EOF

让我们看看所安装的组件是否已经启动和运行。

kubectl get pods -n monitoring

NAME                                                        READY   STATUS    RESTARTS        AGE
kube-prometheus-stack-grafana-7bb55544c9-qwkrg              3/3     Running   0               3m38s
kube-prometheus-stack-prometheus-0                          2/2     Running   0               3m14s
...

看起来不错,让我们进入下一节。

安装和配置Ingress Nginx

在这一步,我们将安装和配置Nginx ingress控制器,并启用可以被Prometheus刮取的指标。

  1. 让我们使用下面的命令将ingress-nginx安装到我们的集群中。
helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
    --set controller.metrics.enabled=true \
  --set controller.metrics.serviceMonitor.enabled=true \
  --set controller.metrics.serviceMonitor.additionalLabels.release="kube-prometheus-stack"

这里我们指定serviceMonitor.extraLabels.release tokube-prometheus-stack,这样Prometheus就能发现服务监视器,并自动从它那里刮取指标。

2. 一旦图表安装完毕,让我们把一个样本应用podinfo部署到默认命名空间。

helm install --wait podinfo --namespace default \
oci://ghcr.io/stefanprodan/charts/podinfo

3. 现在,为已部署的podinfo部署创建一个ingress。

cat <<EOF | kubectl apply -f -
  apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: podinfo-ingress
spec:
  ingressClassName: nginx
    rules :
  - host: podinfo.localdev.me
  defaultBackend:
    service:
      name: podinfo
            port:
        number: 9898
EOF

让我们了解一下上述入口配置的情况。

  1. 我们使用ingress-nginx作为我们的入口控制器,因此入口类被定义为nginx。
  2. 在上面的配置中,我使用了我的Ingress的主机地址为podinfo.localdev.me。
  3. DNS *.localdev.me解析为127.0.0.1,因此对于任何本地测试,可以使用这个DNS,而不必在/etc/hosts文件中添加条目。
  4. Podinfo应用程序通过9898端口提供HTTP API服务,因此它被指定为后端端口,即当流量到达域名http://podinfo.localdev.me,它将被转发到podinfo服务的9898。

4. 接下来,从你的终端,端口转发ingress-nginx服务,以便你可以从你的本地终端发送流量。

kubectl port-forward -n ingress-nginx service/ingress-nginx-controller 8080:80  > /dev/null &
  
  1. 主机上的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
  1. 你只需将状态代码从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错误率

  1. 让我们通过访问http://grafana.localdev.me:8080/alerting/new 来创建一个警报。
  2. 我们可以用以下公式得到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中使用警报模板。

  1. 为了配置它们,进入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集群,你可以添加一个集群标签,这将有助于识别警报的源集群。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表