无需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
相关产品推荐
相关产品推荐

