Files
ljwx-k8s/enable-prometheus-alerts.sh
2026-02-20 22:50:45 +08:00

286 lines
8.7 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
set -e
echo "======================================"
echo "启用 Prometheus 告警规则"
echo "======================================"
echo ""
# 1. 备份当前配置
echo "1. 备份当前 Prometheus 配置..."
kubectl get configmap prometheus-config -n monitoring -o yaml > /tmp/prometheus-config-backup-$(date +%Y%m%d-%H%M%S).yaml
echo " ✅ 备份保存到: /tmp/prometheus-config-backup-*.yaml"
echo ""
# 2. 检查 prometheus-rules ConfigMap 是否存在
echo "2. 检查告警规则 ConfigMap..."
if kubectl get configmap prometheus-rules -n monitoring &> /dev/null; then
echo " ✅ prometheus-rules ConfigMap 存在"
kubectl get configmap prometheus-rules -n monitoring -o jsonpath='{.data}' | grep -o '\.yml' | wc -l | xargs echo " 发现规则文件数量:"
else
echo " ❌ prometheus-rules ConfigMap 不存在"
echo " 请先创建告警规则"
exit 1
fi
echo ""
# 3. 更新 Prometheus ConfigMap 添加 rule_files
echo "3. 更新 Prometheus ConfigMap 添加 rule_files..."
cat <<'EOF' > /tmp/prometheus-config-patch.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
# 告警规则文件
rule_files:
- /etc/prometheus/rules/*.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
scrape_configs:
# ==================== 基础设施监控 ====================
# Prometheus 自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Kubernetes API Server
- job_name: 'kubernetes-apiservers'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
# Kubernetes Nodes
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
# Node Exporter
- job_name: 'node-exporter'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_name]
action: keep
regex: node-exporter
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
target_label: pod
# kube-state-metrics
- job_name: 'kube-state-metrics'
static_configs:
- targets: ['kube-state-metrics.monitoring.svc.cluster.local:8080']
# Kubernetes Pods
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
# ==================== 数据库和缓存监控(data namespace)====================
# Postgres Exporter
- job_name: 'postgres-exporter'
static_configs:
- targets: ['postgres-postgresql-metrics.data.svc.cluster.local:9187']
labels:
namespace: data
service: postgres-postgresql
component: database
# Redis Exporter
- job_name: 'redis-exporter'
static_configs:
- targets: ['redis-metrics.data.svc.cluster.local:9121']
labels:
namespace: data
service: redis-master
component: cache
# ==================== 可观测性组件自监控 ====================
# Loki
- job_name: 'loki'
static_configs:
- targets: ['loki.logging.svc.cluster.local:3100']
labels:
component: loki
# Tempo
- job_name: 'tempo'
static_configs:
- targets: ['tempo.tracing.svc.cluster.local:3200']
labels:
component: tempo
# Grafana
- job_name: 'grafana'
static_configs:
- targets: ['grafana.monitoring.svc.cluster.local:3000']
labels:
component: grafana
# ==================== 业务应用监控 ====================
# 业务应用 - 通过 Service annotation 自动发现
- job_name: 'business-services'
kubernetes_sd_configs:
- role: service
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: service
EOF
kubectl apply -f /tmp/prometheus-config-patch.yaml
echo " ✅ ConfigMap 已更新(添加 rule_files)"
echo ""
# 4. 更新 Prometheus Deployment 挂载 rules ConfigMap
echo "4. 更新 Prometheus Deployment 挂载告警规则..."
# 检查是否已经挂载
if kubectl get deployment prometheus -n monitoring -o yaml | grep -q "prometheus-rules"; then
echo " ℹ️ 告警规则已挂载,跳过"
else
# 添加 volume
kubectl patch deployment prometheus -n monitoring --type='json' -p='[
{
"op": "add",
"path": "/spec/template/spec/volumes/-",
"value": {
"name": "prometheus-rules",
"configMap": {
"name": "prometheus-rules"
}
}
}
]'
# 添加 volumeMount
kubectl patch deployment prometheus -n monitoring --type='json' -p='[
{
"op": "add",
"path": "/spec/template/spec/containers/0/volumeMounts/-",
"value": {
"name": "prometheus-rules",
"mountPath": "/etc/prometheus/rules"
}
}
]'
echo " ✅ Deployment 已更新(挂载告警规则)"
fi
echo ""
# 5. 等待 Prometheus 重启
echo "5. 等待 Prometheus Pod 重启..."
kubectl rollout status deployment prometheus -n monitoring --timeout=120s
echo " ✅ Prometheus 重启完成"
echo ""
# 6. 验证告警规则加载
echo "6. 验证告警规则加载..."
sleep 10
# 启动端口转发
kubectl port-forward -n monitoring svc/prometheus 9090:9090 > /dev/null 2>&1 &
PF_PID=$!
sleep 5
# 检查规则
RULES_COUNT=$(curl -s http://localhost:9090/api/v1/rules | jq -r '.data.groups | length')
# 停止端口转发
kill $PF_PID 2>/dev/null || true
if [ "$RULES_COUNT" -gt 0 ]; then
echo " ✅ 告警规则已加载: $RULES_COUNT 个规则组"
else
echo " ⚠️ 未检测到告警规则"
echo " 请访问 http://localhost:9090/rules 手动验证"
fi
echo ""
echo "======================================"
echo "✅ 告警规则启用完成"
echo "======================================"
echo ""
echo "验证步骤:"
echo "1. 启动端口转发:"
echo " kubectl port-forward -n monitoring svc/prometheus 9090:9090"
echo ""
echo "2. 访问 Prometheus Rules 页面:"
echo " http://localhost:9090/rules"
echo ""
echo "3. 预期看到:"
echo " - postgres-alerts (20+ 条规则)"
echo " - redis-alerts (20+ 条规则)"
echo " - k3s-operational-alerts (30+ 条规则)"
echo ""