网站首页 > 技术教程 正文
我们将讨论如何在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 <<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刮取的指标。
- 让我们使用下面的命令将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
让我们了解一下上述入口配置的情况。
- 我们使用ingress-nginx作为我们的入口控制器,因此入口类被定义为nginx。
- 在上面的配置中,我使用了我的Ingress的主机地址为podinfo.localdev.me。
- DNS *.localdev.me解析为127.0.0.1,因此对于任何本地测试,可以使用这个DNS,而不必在/etc/hosts文件中添加条目。
- 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 &
- 主机上的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集群,你可以添加一个集群标签,这将有助于识别警报的源集群。
猜你喜欢
- 2024-10-10 平台进程监控介绍(系统进程监控软件)
- 2024-10-10 Zabbix监控系统系列之八:监控nginx服务
- 2024-10-10 深度|掌握Nginx监控运维,这一篇足矣!
- 2024-10-10 Nginx 监控(nginx监控工具)
- 2024-10-10 如何轻松监控Nginx?(nginx 监控)
- 2024-09-11 这可能是把Nginx讲解的最透彻的一本新书
- 2024-09-11 nginx动态添加nginx-module-vts监控流量
- 2024-09-11 Docker 容器操作:运行、监控与维护
- 2024-09-11 用groovry做简单的nginx日志实时监控脚本
- 2024-09-11 教你三种方法,用 Python实时监控文件
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)