利用脚本获取证书到期时间:

#!/bin/bash

# 获取当前时间的Unix时间戳
currentTimestamp=$(date +%s)

kubectl get secrets --all-namespaces -o json | jq -r '.items[] | select(.type == "kubernetes.io/tls") | "\(.metadata.name) \(.metadata.namespace)"' | while read secretName namespace; do
    # 获取Secret中的tls.crt并解码
    tlsCert=$(kubectl get secret "$secretName" -n "$namespace" -o jsonpath='{.data.tls\.crt}' | base64 --decode)

    # 使用OpenSSL检查证书的过期时间
    expirationDate=$(echo "$tlsCert" | openssl x509 -noout -enddate | awk -F'=' '{print $2}')

    # 将原始日期转换为Unix时间戳
    expireTimestamp=$(date -d "$expirationDate" +%s)

    # 计算剩余秒数
    remainingSeconds=$((expireTimestamp - currentTimestamp))

    # 输出Prometheus监控指标格式
    printf 'secret_expire_time{secret_name="%s",namespace="%s"} %d\n' "$secretName" "$namespace" "$remainingSeconds"
done

配置ingress监控

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller-metrics
  namespace: ingress-nginx
  labels:
    app: ingress-nginx-default
    component: controller
    tier: ingress-nginx
spec:
  type: ClusterIP
  ports:
  - name: metrics
    port: 10254
    protocol: TCP
  selector:
    app: ingress-nginx-default
    component: controller
    tier: ingress-nginx
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: ingress-nginx-controller-metrics
  namespace: ingress-nginx
spec:
  endpoints:
  - interval: 30s
    port: metrics
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - ingress-nginx
  selector:
    matchLabels:
      app: ingress-nginx-default
      component: controller
      tier: ingress-nginx

告警规则

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: k8s
    role: alert-rules
  name: nginx-ingress-rules
  namespace: monitoring
spec:
  groups:
  - name: nginx-ingress-rules
    rules:
    - alert: NginxFailedtoLoadConfiguration
      expr: nginx_ingress_controller_config_last_reload_successful == 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "Nginx Ingress Controller配置文件加载失败"
        description: "Nginx Ingress Controller的配置文件加载失败,请检查配置文件是否正确。"
    - alert: NginxHighHttp4xxErrorRate
      expr: rate(nginx_ingress_controller_requests{status=~"^404"}[5m]) * 100 > 1
      for: 1m
      labels:
        severity: warning
      annotations:
        description: "Nginx high HTTP 4xx error rate ( namespaces {{ $labels.exported_namespace }} host {{ $labels.host }} )"
        summary: "Too many HTTP requests with status 404 (> 1%)"
    - alert: NginxHighHttp5xxErrorRate
      expr: rate(nginx_ingress_controller_requests{status=~"^5.."}[5m]) * 100 > 1
      for: 1m
      labels:
        severity: warning
      annotations:
        description: "Nginx high HTTP 5xx error rate ( namespaces {{ $labels.exported_namespace }} host {{ $labels.host }} )"
        summary: "Too many HTTP requests with status 5xx (> 1%)"
    - alert: NginxLatencyHigh
      expr: histogram_quantile(0.99, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket[2m])) by (host, node)) > 3
      for: 2m
      labels:
        severity: warning
      annotations:
        description: "Nginx latency high ( namespaces {{ $labels.exported_namespace }} host {{ $labels.host }} )"
        summary: "Nginx p99 latency is higher than 3 seconds"
    - alert: NginxHighRequestRate
      expr: rate(nginx_ingress_controller_nginx_process_requests_total[5m]) * 100 > 1000
      for: 1m
      labels:
        severity: warning
      annotations:
        description: "Nginx ingress controller high request rate ( instance {{ $labels.instance }} namespaces {{ $labels.namespaces }} pod {{$labels.pod}})"
        summary: "Nginx ingress controller high request rate (> 1000 requests per second)"
    - alert: SSLCertificateExpiration15day
      expr: nginx_ingress_controller_ssl_expire_time_seconds < 1296000
      for: 30m
      labels:
        severity: warning
      annotations:
        summary: "SSL/TLS certificate for {{ $labels.host }}{{ $labels.secret_name }} is about to expire"
        description: "The SSL/TLS certificate for {{ $labels.host }}{{ $labels.secret_name }} will expire in less than 15 days."
    - alert: SSLCertificateExpiration7day
      expr: nginx_ingress_controller_ssl_expire_time_seconds < 604800
      for: 30m
      labels:
        severity: critical
      annotations:
        summary: "SSL/TLS certificate for {{ $labels.host }}{{ $labels.secret_name }} is about to expire"
        description: "The SSL/TLS certificate for {{ $labels.host }}{{ $labels.secret_name }} will expire in less than 7 days."

grafana图表序号:

Ingress-nginx模板ID:9614

Ingress-nginx模板ID:14314

常用metrics解释

这些指标通过 Prometheus 暴露,并可以用于监控和告警:

nginx_ingress_controller_bytes_sent_bucket: 请求发送字节大小的分布情况(通常为直方图的一部分,用于计算请求字节量的分位数)。

nginx_ingress_controller_bytes_sent_count: 发送的总请求数量,每个请求发送的字节累加的总和。

nginx_ingress_controller_bytes_sent_sum: 发送的总字节量,累计所有请求发送的字节。

nginx_ingress_controller_config_hash: 当前Nginx配置的哈希值,可用来检测配置是否有变化。

nginx_ingress_controller_config_last_reload_successful: 标识最后一次重新加载Nginx配置是否成功(1表示成功,0表示失败)。

nginx_ingress_controller_config_last_reload_successful_timestamp_seconds: 最后一次成功重新加载Nginx配置的时间戳。

nginx_ingress_controller_ingress_upstream_latency_seconds: 记录从ingress到上游服务的延迟。

nginx_ingress_controller_ingress_upstream_latency_seconds_count: 上游服务延迟计数。

nginx_ingress_controller_ingress_upstream_latency_seconds_sum: 上游服务延迟总和。

nginx_ingress_controller_leader_election_status: 标识当前实例是否是领导者(leader election用于决定哪个Ingress controller实例是主控)。

nginx_ingress_controller_nginx_process_connections: Nginx进程当前的活跃连接数。

nginx_ingress_controller_nginx_process_connections_total: Nginx进程处理的总连接数。

nginx_ingress_controller_nginx_process_cpu_seconds_total: Nginx进程消耗的CPU时间总量。

nginx_ingress_controller_nginx_process_num_procs: Nginx进程数。

nginx_ingress_controller_nginx_process_oldest_start_time_seconds: 最老的Nginx进程启动时间。

nginx_ingress_controller_nginx_process_read_bytes_total: Nginx进程读操作的总字节数。

nginx_ingress_controller_nginx_process_requests_total: Nginx进程处理的总请求数量。

nginx_ingress_controller_nginx_process_resident_memory_bytes: Nginx进程的常驻内存大小。

nginx_ingress_controller_nginx_process_virtual_memory_bytes: Nginx进程的虚拟内存大小。

nginx_ingress_controller_nginx_process_write_bytes_total: Nginx进程写操作的总字节数。

nginx_ingress_controller_request_duration_seconds_bucket: 处理请求的持续时间的分布情况。

nginx_ingress_controller_request_duration_seconds_count: 请求持续时间的计数。

nginx_ingress_controller_request_duration_seconds_sum: 请求持续时间的总和。

nginx_ingress_controller_requests: 处理的总请求量。

nginx_ingress_controller_request_size_bucket: 请求大小的分布情况。

nginx_ingress_controller_request_size_count: 请求大小的计数。

nginx_ingress_controller_request_size_sum: 请求大小的总和。

nginx_ingress_controller_response_duration_seconds_bucket: 响应时间的分布情况。

nginx_ingress_controller_response_duration_seconds_count: 响应时间的计数。

nginx_ingress_controller_response_duration_seconds_sum: 响应时间的总和。

nginx_ingress_controller_response_size_bucket: 响应大小的分布情况。

nginx_ingress_controller_response_size_count: 响应大小的计数。

nginx_ingress_controller_response_size_sum: 响应大小的总和。

nginx_ingress_controller_ssl_expire_time_seconds: SSL证书到期时间。

nginx_ingress_controller_success: 成功处理的请求计数。

process_cpu_seconds_total: 进程消耗的CPU时间总量。

process_max_fds: 进程可以打开的最大文件描述符数量。

process_open_fds: 进程当前打开的文件描述符数量。

process_resident_memory_bytes: 进程的常驻内存大小。

process_start_time_seconds: 进程启动的开始时间。

process_virtual_memory_bytes: 进程的虚拟内存大小。

process_virtual_memory_max_bytes: 进程可以使用的最大虚拟内存大小。

promhttp_metric_handler_requests_in_flight: 当前正在处理的promhttp指标处理器的请求数量。

promhttp_metric_handler_requests_total: promhttp指标处理器处理的总请求数量。