news 2026/8/8 14:25:01

[K8S监控]-K8S容器pod异常状态监控脚本并推送钉钉告警

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[K8S监控]-K8S容器pod异常状态监控脚本并推送钉钉告警

1. 监控需求

检测k8s集群中异常状态的pod容器,并通过钉钉告警推送提醒,通过Shell脚本实现。

2. 完整脚本

cat k8s_pod_status_monitor.sh

#!/bin/bash # K8s Pod状态监控钉钉告警脚本 # 作者:LMZF # 日期:2025-12-15 ############################ 配置区域 ############################ # 钉钉机器人webhook地址(必填) DINGDING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=c8452b88888888888888888888888888888888888888888888888888" # 钉钉消息中需要包含的关键词(用于安全校验) DINGDING_KEYWORDS="告警" # 可选的命名空间过滤(默认检查所有命名空间) NAMESPACE_FILTER="--all-namespaces" # NAMESPACE_FILTER="-n default" # 只检查default命名空间 # 要忽略的命名空间(多个用逗号分隔) IGNORE_NAMESPACES="kube-system,kube-public" # 检查间隔(秒) CHECK_INTERVAL=300 # 日志文件路径 LOG_FILE="/mnt/logs/k8s-pod-monitor.log" # 集群名称 ClUSTER_NAME='机房测试环境k8s集群' ############################ 函数定义 ############################ # 初始化日志记录 init_log() { local log_dir=$(dirname "$LOG_FILE") mkdir -p "$log_dir" echo "$(date '+%Y-%m-%d %H:%M:%S') - 初始化K8s Pod监控脚本" >> "$LOG_FILE" } # 记录日志 log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # 发送钉钉告警 send_dingding_alert() { local alert_message="$1" local pod_info="$2" # 构建钉钉消息格式 [11](@ref) local dingding_msg=$(cat << EOF { "msgtype": "markdown", "markdown": { "title": "K8S Pod状态告警", "text": "## ${DINGDING_KEYWORDS} ⚠️\n**告警时间:** $(date '+%Y-%m-%d %H:%M:%S')\n**告警详情:**\n\`\`\`json\n${alert_message}\n\`\`\`\n**异常Pod信息:**\n\`\`\`\n${pod_info}\n\`\`\`\n---\n> 请及时处理" }, "at": { "isAtAll": false } } EOF ) # 发送请求 [10,11](@ref) local response=$(curl -s -H "Content-Type: application/json" \ -d "$dingding_msg" \ "$DINGDING_WEBHOOK") if echo "$response" | grep -q '"errcode":0'; then log "钉钉告警发送成功" return 0 else log "钉钉告警发送失败: $response" return 1 fi } # 检查kubectl配置 check_kubectl_config() { if ! command -v /usr/local/bin/kubectl &> /dev/null; then log "错误: kubectl 未找到,请确保已安装并配置" exit 1 fi if ! /usr/local/bin/kubectl cluster-info &> /dev/null; then log "错误: 无法连接Kubernetes集群,请检查kubectl配置" exit 1 fi log "kubectl配置检查通过" } # 检查Pod状态 check_pod_status() { local abnormal_pods="" local pod_count=0 log "开始检查Pod状态..." # 获取Pod状态信息 [1,2](@ref) while IFS= read -r line; do if [ -n "$line" ]; then local namespace=$(echo "$line" | awk '{print $1}') local pod_name=$(echo "$line" | awk '{print $2}') local status=$(echo "$line" | awk '{print $4}') local restarts=$(echo "$line" | awk '{print $5}') local age=$(echo "$line" | awk '{print $6}') # 检查是否在忽略的命名空间中 if echo ",${IGNORE_NAMESPACES}," | grep -q ",${namespace},"; then continue fi # 检查Pod状态 #if [ "$status" != "Running" ]; then if [ "$status" != "Running" ] && [ "$status" != "Completed" ] ; then abnormal_pods="${abnormal_pods}命名空间: $namespace | Pod: $pod_name | 状态: $status | 重启次数: $restarts | 运行时间: $age\n" pod_count=$((pod_count + 1)) # 获取详细事件信息用于告警 local events=$(/usr/local/bin/kubectl get events -n "$namespace" --field-selector involvedObject.name="$pod_name" --sort-by='.lastTimestamp' 2>/dev/null | tail -5) #abnormal_pods="${abnormal_pods}最近事件:\n$events\n----------------------------------------\n" fi fi done <<< "$(/usr/local/bin/kubectl get pods $NAMESPACE_FILTER --no-headers 2>/dev/null)" if [ $pod_count -gt 0 ]; then local alert_msg="${ClUSTER_NAME}发现 $pod_count 个Pod状态异常" log "$alert_msg" # 发送钉钉告警 send_dingding_alert "$alert_msg" "$abnormal_pods" else log "所有Pod状态正常" fi } # 检查Metrics Server是否可用(可选检查) check_metrics_server() { if kubectl top nodes &> /dev/null; then log "Metrics Server可用,可以监控资源使用情况" return 0 else log "Metrics Server不可用,跳过资源监控" return 1 fi } ############################ 主程序 ############################ main() { # 初始化 init_log log "=== K8s Pod监控脚本启动 ===" # 检查配置 check_kubectl_config #check_metrics_server # 验证钉钉webhook配置 if [ -z "$DINGDING_WEBHOOK" ] || [ "$DINGDING_WEBHOOK" = "https://oapi.dingtalk.com/robot/send?access_token=YOUR_ACCESS_TOKEN" ]; then log "错误: 请先配置钉钉机器人webhook地址" exit 1 fi log "监控程序启动,检查间隔: ${CHECK_INTERVAL}秒" # 主循环 # while true; do # log "开始新一轮检查..." check_pod_status # log "本轮检查完成,等待${CHECK_INTERVAL}秒后继续..." # sleep $CHECK_INTERVAL #done } # 信号处理,优雅退出 trap "log '监控脚本被用户中断'; exit 0" INT TERM # 脚本入口 if [ "$1" = "test" ]; then # 测试模式:只运行一次检查 log "=== 测试模式启动 ===" check_kubectl_config check_pod_status log "=== 测试模式结束 ===" else # 正常模式:持续监控 main fi

3. 配置定时任务

根据需求,通过/etc/crontab或crontab -e设置定时任务。脚本中以下几行需注释

# 主循环 # while true; do # log "开始新一轮检查..." check_pod_status # log "本轮检查完成,等待${CHECK_INTERVAL}秒后继续..." # sleep $CHECK_INTERVAL #done

若不注释上述几行,可以使用nohup k8s_pod_status_monitor.sh & 执行一次脚本即可。

4. 备注

kubectl尽量使用绝对路径(本文/usr/local/bin/kubectl),避免设置定时任务,执行shell脚本报错。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 7:27:35

为什么Qwen3-VL-8B是轻量级多模态入门首选?

为什么Qwen3-VL-8B是轻量级多模态入门首选&#xff1f; 在电商商品页自动生成图文描述、客服系统“拍照提问”即时响应、教育平台自动解析习题图片的背后&#xff0c;隐藏着一个共同的技术核心&#xff1a;多模态大模型。这些能够“看图说话”的AI系统&#xff0c;正从实验室走…

作者头像 李华
网站建设 2026/8/6 20:51:59

计算机Java毕设实战-基于springboot古风生活体验交流网站的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/8/6 2:07:01

花5分钟判断,你的Jmeter技能是大佬还是小白!

jmeter 这个工具既可以做接口的功能测试&#xff0c;也可以做自动化测试&#xff0c;还可以做性能测试&#xff0c;其主要用途就是用于性能测试。但是&#xff0c;有些公司和个人&#xff0c;就想用 jmeter 来做接口自动化测试。 你有没有想过呢&#xff1f; 下面我就给大家讲…

作者头像 李华
网站建设 2026/8/6 3:32:27

Transformer模型压缩技术在Qwen-Image上的应用前景

Transformer模型压缩技术在Qwen-Image上的应用前景 在生成式AI迅速渗透内容创作领域的今天&#xff0c;图像生成模型正面临一场关键的“落地挑战”&#xff1a;如何在不牺牲质量的前提下&#xff0c;把动辄上百GB显存需求、延迟高达数秒的庞然大物&#xff0c;塞进一张消费级显…

作者头像 李华
网站建设 2026/8/7 8:39:07

HuggingFace镜像网站上线Qwen-Image,支持高分辨率图像生成

HuggingFace镜像网站上线Qwen-Image&#xff0c;支持高分辨率图像生成 在AIGC&#xff08;生成式人工智能&#xff09;浪潮席卷内容创作领域的今天&#xff0c;一个现实问题始终困扰着设计师和开发者&#xff1a;如何让AI真正理解复杂、细腻的中文语义&#xff0c;并输出可用于…

作者头像 李华
网站建设 2026/8/7 23:25:15

Stm32_2:蜂鸣器、按键、继电器

1.蜂鸣器1.蜂鸣器的种类蜂鸣器是一种常用的电子发声元器件&#xff0c;采用直流电压供电。广泛应用于计算机&#xff0c;打印机&#xff0c;报警器&#xff0c;电子玩具&#xff0c;汽车电子设备灯等产品中常见的蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。2.蜂鸣器的控制方式有源蜂…

作者头像 李华