EKS节点诊断MCP
⚠️ 概念验证(POC): 这个项目是一个概念验证,应该首先在非生产环境中进行测试。在与生产工作负载一起使用之前,在过渡或开发帐户中进行彻底验证。
AWS DevOps代理的MCP服务器,用于使用SSM Automation从EKS工作节点收集和分析诊断日志。涵盖20多个日志源,包括kubelet、containerd、iptables、CNI config、路由表、dmesg、IPAMD等,这些工件位于节点操作系统上,无法通过Kubernetes API或CloudWatch访问。
想了解内部吗? 看 建筑与设计 深入了解组件的工作原理、数据流、工具设计和安全模型。
______________________________________________________________________
先决条件
1.Node.js(v18.x或更高版本)
macOS(Homebrew):
brew install nodeLinux(Ubuntu/Debian):
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs2.AWS CLI v2
macOS:
brew install awscliLinux:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install3.AWS-CDK-CLI
npm install -g aws-cdk4.Python 3
大多数系统都预装了它:
python3 --version5.AWS证书
您需要权限来创建IAM角色、Lambda函数、S3 Bucket、KMS密钥、Cognito用户池和BedrockAgentCore网关。
aws configure
# Or use AWS SSO:
aws sso login --profile your-profile
export AWS_PROFILE=your-profile6.Worker节点上的crictl(适用于pod级别的tcpdump)
仅适用于 tcpdump_capture 和 podName/podNamespace默认情况下,EKS优化的AMI包括它。
______________________________________________________________________
部署
# Clone the repository
git clone https://github.com/aws-samples/sample-eks-node-diagnostics-mcp.git
cd sample-eks-node-diagnostics-mcp
# Make the script executable
chmod +x deploy.sh
# Deploy (defaults to us-east-1)
./deploy.sh
# Or deploy to a specific region
AWS_REGION=us-west-2 ./deploy.sh交互式部署流程
部署脚本将引导您完成三个交互式提示:
步骤1——区域选择:
Which AWS regions should be scanned for EKS clusters?
1) All enabled regions
2) Current deploy region only (us-east-1)
3) Enter a specific region
Select [1/2/3] (default: 1):步骤2——集群选择:
Found 4 EKS cluster(s):
1) prod-cluster (us-east-1)
2) dev-cluster (us-east-1)
3) analytics (us-west-2)
4) eu-cluster (eu-west-1)
a) All clusters
Select clusters (comma-separated numbers, or 'a' for all) [default: a]:步骤3——节点角色选择:
Found 3 unique node role(s):
1) arn:aws:iam::123456789012:role/eks-prod-node-role
└─ eks-prod-node-role (prod-cluster / us-east-1)
2) arn:aws:iam::123456789012:role/eks-dev-node-role
└─ eks-dev-node-role (dev-cluster / us-east-1)
3) arn:aws:iam::123456789012:role/eks-eu-node-role
└─ eks-eu-node-role (eu-cluster / eu-west-1)
a) All roles
Select node roles (comma-separated numbers, or 'a' for all) [default: a]:回退——手动输入ARN:
如果找不到EKS集群或节点角色,则脚本会提示您手动输入角色ARN:
WARNING: No EKS clusters found in the selected region(s).
Would you like to manually enter node role ARN(s)? [y/N]: y
Enter comma-separated role ARNs (e.g. arn:aws:iam::123456789012:role/MyNodeRole):
>非交互/CI模式
直接提供角色ARN跳过所有提示:
# Via environment variable
EKS_NODE_ROLE_ARNS="arn:aws:iam::123456789012:role/MyNodeRole" ./deploy.sh
# Or as a positional argument
./deploy.sh EksNodeLogMcpStack arn:aws:iam::123456789012:role/MyNodeRole
# Multiple roles (comma-separated)
EKS_NODE_ROLE_ARNS="arn:aws:iam::123456789012:role/Role1,arn:aws:iam::123456789012:role/Role2" ./deploy.sh部署什么
| 资源 | 目的 |
|---|---|
| S3存储桶(KMS加密) | 存储收集的日志包 |
| S3 Bucket(SOP) | 存储41个Runbook,通过CDK自动部署 |
| Lambda(SSM自动化) | 处理所有19个MCP工具调用 |
| Lambda(解压缩) | 自动提取上传的存档 |
| Lambda(发现索引器) | 预索引错误以实现快速检索 |
| SSM自动化角色 | 在EC2实例上运行日志收集 |
| Cognito用户池 | MCP网关的OAuth2身份验证 |
| BedrockAgentCore网关 | MCP协议端点 |
| KMS密钥 | 加密所有静态数据 |
______________________________________________________________________
部署后:EKS节点IAM设置
什么是自动
如果您在交互式部署流程中选择了节点角色(或通过 EKS_NODE_ROLE_ARNS),CDK堆栈会自动授予:
- S3存储桶策略:
s3:PutObject,s3:GetBucketPolicyStatus,s3:GetBucketAcl在原木桶上 - KMS密钥策略:
kms:GenerateDataKey,kms:Encrypt,kms:Decrypt关于加密密钥(kms:Decrypt需要S3多部分上传大于~8 MiB的文件)
这些角色不需要手动设置S3或KMS。
如果在部署期间没有提供节点角色,则堆栈将回退到帐户范围的策略(帐户中的任何主体都可以上传)。这限制较少,但仍然有效。
你可能还需要什么
CDK堆栈唯一没有附加的是SSM代理管理的策略。EKS优化的AMI默认包括SSM代理,但IAM角色需要以下策略:
# Only needed if not already attached
aws iam attach-role-policy \
--role-name \
--policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore部署后添加节点角色
如果稍后添加新的EKS集群,请重新运行部署脚本——它将检测新的节点角色并自动更新S3存储桶和KMS密钥策略。
或者,直接传递新角色:
EKS_NODE_ROLE_ARNS="arn:aws:iam::123456789012:role/ExistingRole,arn:aws:iam::123456789012:role/NewRole" ./deploy.sh每个集群的检查表
- \[\]部署期间选择了节点角色(或通过重新部署添加)
- \[\]节点角色具有
AmazonSSMManagedInstanceCore管理策略(用于SSM代理) - \[\]SSM代理正在节点上运行(EKS优化AMI上的默认设置)
- \[ \]
AWSSupport-CollectEKSInstanceLogs目标区域中存在SSM文档
______________________________________________________________________
DevOps代理中的配置
部署后,脚本输出MCP服务器配置所需的所有值:
| 设置 | 值 |
|---|---|
| MCP服务器URL | https://.gateway.bedrock-agentcore..amazonaws.com/mcp |
| OAuth客户端ID | 输出中的Cognito客户端ID |
| OAuth客户端密码 | 输出中的Cognito客户端密码 |
| 令牌URL | https://-.auth..amazoncognito.com/oauth2/token |
| 范围 | ssm-automation-gateway-id/gateway:read |
值也保存到 mcp-config.txt 以供参考。
______________________________________________________________________
代理技能
A预制 代理技能 包含在 skills/ 教AWS DevOps Agent如何有效地使用此MCP服务器。该技能将调查工作流程、抗幻觉护栏和所有41个runbook程序加载到代理的上下文中,从而补充了运行时 list_sops/get_sop 工具。
| 技能拉链 | 大小 | 内容 |
|---|---|---|
| 188K | 21个工具工作流程,41个运行本,VPC CNI抗幻觉规则,存储护栏 |
上传技能
- 导航至 技能 您的页面 代理空间运营商Web应用程序
- 点击 添加技能 → 上传技巧
- 上传
skills/eks-node-diagnostics.zip - 将代理类型设置为 通用的 (所有代理类型)
- 点击 上传
有关更多详细信息,请参阅 AWS DevOps代理技能文档.
技能vs SOP:调查开始时的技能负荷(前期方法和陷阱)。SOP通过以下方式按需获取 get_sop (详细的分步程序)。两者结合使用可获得最佳效果。______________________________________________________________________
运作原理
该服务器使MCP兼容代理能够从EKS工作节点收集完整的诊断包,对严重性分类的错误进行预索引,在不截断的情况下流式传输多GB日志文件,跨日志源关联事件,运行实时tcpdump捕获,比较节点,并遵循结构化的运行手册——所有这些都是通过分为5层的19个MCP工具完成的。
有关架构、数据流、工具设计、跨区域机制、安全模型和抗幻觉设计的详细演练,请参阅:
MCP工具(快速参考)
| 层级 | 工具 | 目的 |
|---|---|---|
| 1--核心 | collect, status, validate, errors, read | 日志收集、发现、流式传输 |
| 2--分析 | search, correlate, artifact, summarize, history | 深入调查、关联、总结 |
| 3--集群 | cluster_health, compare_nodes, batch_collect, batch_status, network_diagnostics | 多节点操作 |
| 4--捕获 | tcpdump_capture, tcpdump_analyze | 实时数据包捕获和分析 |
| 5-SOP | list_sops, get_sop | 41本结构化的小册子 |
代理工作流
collect → status (poll) → validate → errors → search → correlate → read → summarizeRunbook库(41 SOP)
| 类别 | 覆盖范围 |
|---|---|
| A--节点生命周期 | OOM/NotReady、证书、引导、时钟偏斜、连接失败 |
| B-Kubelet | 配置错误、驱逐、PLEG |
| C--容器运行时 | 映像拉取、沙箱创建、覆盖FS/索引节点 |
| D--网络 | VPC CNI、kube-proxy、conntrack、MTU、DNS、ENA、pod到pod |
| E--存储 | EBS CSI、EFS装载 |
| F-调度 | CPU/内存、最大Pod数、污染/容忍度 |
| G--资源压力 | 磁盘压力、OOMKill、PID压力 |
| H-IAM/安全 | 节点角色、IRSA/Pod标识、IMDS |
| I——升级 | 版本偏差 |
| J-基础设施 | ENA/实例限制、EBS瞬态、AZ停机 |
| K--工作负载问题 | 终止Pod卡住、探测器故障、CrashLoopBackOff、容器故障、CSI插件 |
| Z--包罗万象 | 一般故障排除 |
______________________________________________________________________
使用示例
基础调查
Node i-0abc123def in us-west-2 went NotReady around 3am. Collect its logs
and correlate what happened in the 5 minutes before it went down.集群范围分类
We have a 200-node cluster and something is off. Do a dry run batch collection
first — show me which nodes you'd sample. Then collect from the unhealthy ones.实时数据包捕获
Pods on node i-0abc123def can't reach the API server. Run a 2-minute tcpdump
filtered on port 443, then analyze — show me RST counts and retransmissions.吊舱液位捕捉
DNS lookups are timing out. CoreDNS pod coredns-5d78c9869d-abc12 is on node
i-0abc123def in kube-system. Capture UDP port 53 from inside the pod for 60s.SOP指导
I don't know what's wrong — just investigate. List the available SOPs, run a
general triage, and follow whichever runbook matches.______________________________________________________________________
云形成输出
| 输出 | 描述 |
|---|---|
GatewayId | AgentCore网关ID |
GatewayUrl | MCP服务器URL |
CognitoUserPoolId | Cognito用户池ID |
CognitoClientId | OAuth客户端ID |
OAuthExchangeUrl | OAuth令牌URL |
OAuthScope | OAuth作用域 |
LogsBucketName | S3原木桶 |
SOPBucketName | S3 Runbook桶 |
SSMAutomationRoleArn | SSM自动化角色ARN |
EncryptionKeyArn | KMS密钥ARN |
______________________________________________________________________
故障排除
| 症状 | 原因 | 修复 |
|---|---|---|
collect 返回“找不到文档” | SSM文档不在目标区域 | 使用支持的区域或通道 region 明确 |
| 上传步骤失败 | 节点角色缺少S3/KMS权限 | 添加 EksNodeLogMcpS3Upload 内联策略 |
status 返回错误的区域 | 区域元数据未持久化 | 通过 region 明确 |
| 自动检测超时 | 异常区域实例 | 通过 region 明确 |
errors 返回空 | 结果索引器尚未运行 | 等待几秒钟 validate,或使用 search |
______________________________________________________________________
清理
cdk destroyS3铲斗具有 removalPolicy: RETAIN。如果需要,在堆栈销毁后手动删除。______________________________________________________________________
许可证
本项目根据麻省理工学院无署名(MIT-0)许可证获得许可。看 许可证 文件。
