You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需kubectl:基于CloudWatch容器洞察增强可观测性统计EKS Pod数量并告警

解决方案

1. 日志源确认

CloudWatch Container Insights Enhanced Observability会将EKS集群的Pod状态数据写入日志组/aws/eks/<你的集群名称>/cluster(若自定义了日志组,需替换为实际名称)。日志事件的kubernetes字段包含Pod名称、标签、运行状态等关键信息,这是查询的核心数据源。

2. Lambda权限配置

为Lambda执行角色添加以下IAM权限:

  • logs:StartQuery 和 logs:GetQueryResults:用于执行CloudWatch Logs Insights查询
  • sns:Publish:若通过SNS发送告警通知(可根据实际告警渠道调整权限)

3. CloudWatch Logs Insights查询语句

根据需求选择对应的查询语句:

按应用标签统计Running Pod数量

适用于按app标签区分应用的场景:

fields @timestamp, kubernetes.labels.app, kubernetes.pod_status.status
| filter kubernetes.pod_status.status = "Running"
| stats count(*) as pod_count by kubernetes.labels.app
| sort pod_count desc

按Pod名称前缀统计数量

适用于同名Pod(如名称以myapp-开头)的场景:

fields @timestamp, kubernetes.pod_name, kubernetes.pod_status.status
| filter kubernetes.pod_status.status = "Running" and starts_with(kubernetes.pod_name, "myapp-")
| stats count(*) as pod_count

4. Lambda代码实现(Python)

以下代码实现了查询Pod数量、对比阈值并触发告警的逻辑:

import boto3
import time

# 配置参数
CLUSTER_NAME = "your-eks-cluster-name"
LOG_GROUP = f"/aws/eks/{CLUSTER_NAME}/cluster"
QUERY_WINDOW_MINUTES = 10  # 查询最近10分钟的日志,确保获取最新状态
# 自定义应用与对应的最低Pod数量阈值
POD_THRESHOLDS = {
    "user-service": 2,
    "order-service": 3
}
SNS_ALARM_TOPIC = "arn:aws:sns:us-east-1:123456789012:eks-pod-alerts"

# 初始化AWS客户端
logs_client = boto3.client('logs')
sns_client = boto3.client('sns')

def lambda_handler(event, context):
    # 计算查询时间范围(毫秒级)
    start_time = int(time.time() * 1000) - (QUERY_WINDOW_MINUTES * 60 * 1000)
    end_time = int(time.time() * 1000)
    
    # 启动Logs Insights查询
    query_resp = logs_client.start_query(
        logGroupName=LOG_GROUP,
        startTime=start_time,
        endTime=end_time,
        queryString="""
            fields kubernetes.labels.app, kubernetes.pod_status.status
            | filter kubernetes.pod_status.status = "Running"
            | stats count(*) as pod_count by kubernetes.labels.app
        """
    )
    query_id = query_resp['queryId']
    
    # 等待查询完成
    while True:
        result = logs_client.get_query_results(queryId=query_id)
        if result['status'] == 'Complete':
            break
        time.sleep(2)
    
    # 解析查询结果,构建应用-Pod数量映射
    app_pod_counts = {}
    for item in result['results']:
        app_label = next(i['value'] for i in item if i['field'] == 'kubernetes.labels.app')
        count = int(next(i['value'] for i in item if i['field'] == 'pod_count'))
        app_pod_counts[app_label] = count
    
    # 检查阈值,收集告警信息
    alert_messages = []
    for app, threshold in POD_THRESHOLDS.items():
        current_count = app_pod_counts.get(app, 0)
        if current_count < threshold:
            alert_messages.append(f"⚠️ 应用[{app}] Running Pod数量为{current_count},低于阈值{threshold}")
    
    # 发送告警(若有触发条件)
    if alert_messages:
        alert_content = "\n".join(alert_messages)
        sns_client.publish(
            TopicArn=SNS_ALARM_TOPIC,
            Subject="EKS集群Pod数量告警",
            Message=alert_content
        )
        return {"status": "alert_triggered", "alerts": alert_messages}
    else:
        return {"status": "ok", "message": "所有应用Pod数量符合阈值要求"}

5. Lambda触发配置

通过EventBridge(原CloudWatch Events)设置定时触发规则,比如每5分钟执行一次,确保实时监控Pod数量变化。

关键注意事项

  • 若你的集群使用非app的标签区分应用,需将查询语句中的kubernetes.labels.app替换为实际标签键(如kubernetes.labels.service)。
  • 调整QUERY_WINDOW_MINUTES参数,确保覆盖Pod状态变更的时间范围,避免漏查。
  • 确保Lambda执行角色的权限范围仅包含必要的资源,遵循最小权限原则。

内容的提问来源于stack exchange,提问作者win

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:50:35