Nginx

本文档介绍如何配置 Google Kubernetes Engine 部署,以便使用 Google Cloud Managed Service for Prometheus 从 Nginx 收集指标。本页面介绍如何完成以下任务:

  • 为 Nginx 设置导出器以报告指标。
  • 为 Managed Service for Prometheus 配置 PodMonitoring 资源以收集导出的指标。
  • 在 Cloud Monitoring 中访问信息中心以查看指标。
  • 配置提醒规则以监控指标。

以下说明仅在您将代管式收集功能与 Managed Service for Prometheus 搭配使用时适用。 如果您使用的是自行部署的收集功能,请参阅 Nginx 导出器的源代码库以了解安装信息。

这些说明仅作为示例提供,应该适用于大多数 Kubernetes 环境。如果您因为限制性安全或组织政策而无法安装应用或导出器,则我们建议您查阅开源文档以获取支持。

如需了解 Nginx,请参阅 Nginx

前提条件

要使用 Managed Service for Prometheus 和代管式收集功能从 Nginx 收集指标,您的部署必须满足以下要求:

  • 您的集群必须运行 Google Kubernetes Engine 1.21.4-gke.300 或更高版本。
  • 您必须运行 Managed Service for Prometheus,并启用代管式收集功能。如需了解详情,请参阅代管式收集功能使用入门

  • 如需使用 Cloud Monitoring 中提供的信息中心进行 Nginx 集成,您必须使用 nginx-prometheus-exporter v0.10.0 或更高版本。

    如需详细了解可用的信息中心,请参阅查看信息中心

安装 Nginx 导出器

我们建议您将 Nginx 导出器 nginx-prometheus-exporter 作为 Sidecar 安装到 Nginx 工作负载中。如需了解如何使用 Sidecar,请参阅具有多容器 pod 的 Kubernetes 上的扩展应用

如需将 nginx-prometheus-exporter 作为 Sidecar 安装到 Nginx,请修改您的 Nginx 配置,如以下示例所示:

# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx
data:
  default.conf: |
    server {
        listen       80 default_server;
        server_name  _;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
+       location /status {
+           stub_status on;
+           access_log off;
+           allow 127.0.0.1;
+           allow 10.0.0.0/8;
+           allow 172.16.0.0/12;
+           allow 192.168.0.0/16;
+           deny all;
+       }
    }
---
apiVersion: apps/v1
kind: Deployment
spec:
  ...
  template:
    metadata:
      labels:
+       app.kubernetes.io/name: nginx
    spec:
      containers:
+     - name: nginx-exporter
+       image: nginx/nginx-prometheus-exporter:0.10.0
+       args:
+       - "-nginx.scrape-uri=http://localhost/status"
+       ports:
+       - containerPort: 9113
+         name: prometheus
+       readinessProbe:
+         httpGet:
+           path: /metrics
+           port: prometheus
+       livenessProbe:
+         httpGet:
+           path: /metrics
+           port: prometheus
      - name: nginx
        image: nginx:1.14.2
+       ports:
+       - containerPort: 80
+         name: http
+       readinessProbe:
+         httpGet:
+           path: /status
+           port: http
+       livenessProbe:
+         httpGet:
+           path: /status
+           port: http
+       volumeMounts:
+       - mountPath: /etc/nginx/conf.d/default.conf
+         subPath: default.conf
+         name: config
+     volumes:
+     - name: config
+       configMap:
+         name: nginx
+         items:
+         - key: default.conf
+           path: default.conf

您必须将开头为 + 符号的所有行添加到您的配置中。

如需从本地文件应用配置更改,请运行以下命令:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

您还可以使用 Terraform 管理您的配置。

定义 PodMonitoring 资源

对于目标发现,Managed Service for Prometheus Operator 需要与同一命名空间中的 Nginx 导出器对应的 PodMonitoring 资源。

您可以使用以下 PodMonitoring 配置:

# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: nginx
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  endpoints:
  - port: prometheus
    scheme: http
    interval: 30s
    path: /metrics
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx

确保标签选择器和端口与安装 Nginx 导出器中使用的选择器和端口匹配。

如需从本地文件应用配置更改,请运行以下命令:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

您还可以使用 Terraform 管理您的配置。

定义规则和提醒

您可以使用以下 Rules 配置来定义 Nginx 指标提醒:

# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: monitoring.googleapis.com/v1
kind: Rules
metadata:
  name: nginx-rules
  labels:
    app.kubernetes.io/component: rules
    app.kubernetes.io/name: nginx-rules
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  groups:
  - name: nginx
    interval: 30s
    rules:
    - alert: NginxDown
      annotations:
        description: |-
          Nginx instance is down
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Nginx down (instance {{ $labels.instance }})
      expr: nginx_up{job="nginx"} == 0
      for: 5m
      labels:
        severity: critical
    - alert: NginxDroppedConnections
      annotations:
        description: |-
         Too many dropped connections (> 5%)
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Number of dropped connections is high (instance {{ $labels.instance }})
      expr: (rate(nginx_connections_accepted{job="nginx"}[1m]) - rate(nginx_connections_handled{job="nginx"}[1m])) / rate(nginx_connections_accepted{job="nginx"}[1m]) > 0.05
      for: 5m
      labels:
        severity: warning
    - alert: NginxTrafficSpike
      annotations:
        description: |-
          Increase in total number of HTTP requests received (> 20%)
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Spike in HTTP traffic (instance {{ $labels.instance }})
      expr: rate(nginx_http_requests_total{job="nginx"}[1m])/ rate(nginx_http_requests_total{job="nginx"}[1m] offset 5m) > 1.2
      for: 5m
      labels:
        severity: warning
    - alert: NginxTrafficDrop
      annotations:
        description: |-
           Decrease in total number of HTTP requests received (> 20%)
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Drop in HTTP traffic (instance {{ $labels.instance }})
      expr: rate(nginx_http_requests_total{job="nginx"}[1m])/ rate(nginx_http_requests_total{job="nginx"}[1m] offset 5m) < 0.8
      for: 5m
      labels:
        severity: warning

如需从本地文件应用配置更改,请运行以下命令:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

您还可以使用 Terraform 管理您的配置。

如需详细了解如何将规则应用于您的集群,请参阅代管式规则评估和提醒

您可以根据您的应用调整提醒阈值。

验证配置

您可以使用 Metrics Explorer 验证您是否正确配置了 Nginx 导出器。Cloud Monitoring 可能需要一两分钟时间来注入您的指标。

要验证指标是否已注入,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 Metrics Explorer 页面:

    进入 Metrics Explorer

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 在查询构建器窗格的工具栏中,选择名为  MQL PromQL 的按钮。
  3. 验证已在PromQL 切换开关中选择 PromQL。语言切换开关位于同一工具栏中,用于设置查询的格式。
  4. 输入并运行以下查询:
    up{job="nginx", cluster="CLUSTER_NAME", namespace="NAMESPACE_NAME"}
    

查看信息中心

Cloud Monitoring 集成包括 Nginx Prometheus 概览信息中心。当您配置集成时,系统会自动安装信息中心。您还可以在不安装集成的情况下查看信息中心的静态预览。

如需查看已安装的信息中心,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 信息中心页面:

    前往信息中心

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 选择信息中心列表标签页。
  3. 选择集成类别。
  4. 点击信息中心的名称,例如 Nginx Prometheus 概览

如需查看信息中心的静态预览,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 集成页面:

    前往集成

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 点击 Kubernetes Engine 部署平台过滤条件。
  3. 找到 Nginx 集成,然后点击查看详情
  4. 选择信息中心标签页。

问题排查

如需了解如何排查指标注入问题,请参阅排查注入端问题中的从导出器收集的问题