求助:编写Shell脚本批量生成Kubernetes ConfigMap规则
批量生成Kubernetes ConfigMap规则块的Shell脚本实现
核心思路
通过定义索引一一对应的Pod名称与时间间隔数组,结合规则块模板批量生成告警规则,再将生成的规则插入到指定ConfigMap模板的rules字段下,最终输出完整的合法ConfigMap配置文件。
脚本实现
#!/bin/bash # 1. 定义输入参数:Pod列表和对应的时间间隔列表(索引需严格对应) PODS=("pod1" "pod2") INTERVALS=("2m" "3m") # 2. 规则块模板,用{{POD_NAME}}和{{INTERVAL}}作为占位符 RULE_TEMPLATE=' - alert: PodHighCPU expr: sum(rate(container_cpu_usage_seconds_total{pod="{{POD_NAME}}"}[{{INTERVAL}}])) by (pod) > 0.8 for: 1m labels: severity: warning annotations: summary: "Pod {{POD_NAME}} high CPU usage" description: "Pod {{POD_NAME}} CPU usage exceeds 80% for 1+ minute (sampling interval: {{INTERVAL}})"' # 3. 指定模板文件路径和最终输出文件路径 TEMPLATE_FILE="./prometheus-rules-template.yaml" OUTPUT_FILE="./final-prometheus-rules.yaml" # 4. 批量生成规则块 GENERATED_RULES="" for i in "${!PODS[@]}"; do POD=${PODS[$i]} INTERVAL=${INTERVALS[$i]} # 替换占位符生成单条规则 RULE=$(echo "$RULE_TEMPLATE" | sed "s/{{POD_NAME}}/$POD/g; s/{{INTERVAL}}/$INTERVAL/g") GENERATED_RULES+="$RULE"$'\n' done # 5. 将生成的规则插入到模板的指定位置 # 需在模板的rules字段下添加标记:# INSERT GENERATED RULES HERE sed "/# INSERT GENERATED RULES HERE/r /dev/stdin" "$TEMPLATE_FILE" <<< "$GENERATED_RULES" > "$OUTPUT_FILE" echo "最终ConfigMap文件已生成:$OUTPUT_FILE"
关键细节说明
- 数组对应校验:务必保证
PODS和INTERVALS数组的索引一一匹配,避免Pod与时间间隔错配。 - 规则模板自定义:可根据实际监控需求修改
RULE_TEMPLATE的告警逻辑、标签、注释内容,占位符名称可自行调整(需同步修改sed替换规则)。 - 模板插入标记:在ConfigMap模板的
rules字段下添加注释# INSERT GENERATED RULES HERE作为插入锚点,脚本会自动将生成的规则插入到该位置。 - YAML格式兼容:规则块的缩进需与模板中
rules字段的缩进保持一致(示例中为2个空格),确保最终输出的YAML配置合法可被Kubernetes识别。
ConfigMap模板示例
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-rules data: prometheus.rules.yml: | groups: - name: pod-monitoring rules: # INSERT GENERATED RULES HERE # 可保留原有固定规则 - alert: NodeHighMemory expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10 for: 5m labels: severity: critical annotations: summary: "Node high memory usage"
内容的提问来源于stack exchange,提问作者Branden
相关产品推荐
相关产品推荐

