在eks集群中部署eks-node-monitoring-agent并利用NodeDiagnostic收集节点日志

参考资料

本文尝试在中国区EKS 集群中部署官方的节点监控eks-node-monitoring-agent并利用该组件来收集日志。该组件以DS的形式在每个节点运行,持续监控节点内核日志、系统日志、容器运行时状态,将检测结果上报到 Kubernetes API Server,通过 NodeCondition 体现。

相关的基础概念

eks-node-monitoring-agent的核心功能如下

  • 日志监控:实时读取和分析系统日志文件
  • 问题检测:使用预定义的正则表达式匹配错误模式
  • 状态上报:通过 Kubernetes API 设置 NodeCondition

监控的日志源如下

go 复制代码
// 主要日志文件
/var/log/messages           // 系统消息日志
/var/log/kubelet.log        // Kubelet 服务日志
/var/log/aws-routed-eni/ipamd.log  // VPC CNI 日志
/var/log/pods/             // Pod 容器日志
// systemd 日志
journal -u kubelet          // Kubelet systemd 日志
journal -k                  // 内核日志

发布的NodeCondition 类型包括如下几种

但是目前中国区的eks节点组无法开启-node-repair-config enabled=true,因此无法自动修复节点,后续可以考虑自行开发controller来实现节点异常状态触发节点替换。

首先在集群中部署eks-node-monitoring-agent组件,命令如下

shell 复制代码
cat > /tmp/agent-values.yaml << 'EOF'
nodeAgent:
  image:
    tag: v1.6.0-eksbuild.1
    containerRegistry: "xxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn"
EOF

helm install eks-node-monitoring-agent \
    /home/ec2-user/eksagent/eks-node-monitoring-agent-main/charts/eks-node-monitoring-agent/ \
    -n eks-node-monitoring --create-namespace \
    -f /tmp/agent-values.yaml

节点日志收集

本次我们参考官方文档(https://docs.amazonaws.cn/en_us/eks/latest/userguide/auto-get-logs.html)利用agent来实现边界的节点日志获取。具体的步骤如下

创建s3预签名url,agent会使用这个url来上传日志

shell 复制代码
aws s3 presign s3://eks-node-logs-test127/node-logs-my-node.tar.gz --expires-in 3600 --region cn-north-1

然后在集群中创建

yaml 复制代码
apiVersion: eks.amazonaws.com/v1alpha1
kind: NodeDiagnostic
metadata:
  name: <node-name>
spec:
  logCapture:
    destination: "<presign URL>"

实际资源的结果如下

检查agent的日志可以看到具体的日志收集和上传动作

具体而言,ageng的组件NodeDiagnostic Controller负责具体的日志收集动作

go 复制代码
func (c *nodeDiagnosticController) Reconcile(ctx context.Context, nodeDiagnostic *v1alpha1.NodeDiagnostic) (reconcile.Result, error) {
    // 1. 更新状态为 Running
    captureStatus := v1alpha1.CaptureStatus{
        Type: v1alpha1.CaptureTypeLog,
        State: v1alpha1.CaptureState{
            Running: &v1alpha1.CaptureStateRunning{StartedAt: metav1.Now()},
        },
    }
    
    // 2. 收集日志
    archiveReader, issueCount, err := c.collectLogs(ctx, nodeDiagnostic.Spec.Categories)
    
    // 3. 上传
    uploadRequest, _ := http.NewRequestWithContext(ctx, http.MethodPut, 
        string(nodeDiagnostic.Spec.UploadDestination), archiveReader)
    netutil.DoRequest(uploadRequest)
    
    // 4. 更新状态为 Completed
    captureStatus.State = v1alpha1.CaptureState{
        Completed: &v1alpha1.CaptureStateCompleted{
            Reason:     v1alpha1.CaptureStateSuccess,
            Message:    "successfully uploaded logs with no errors",
            FinishedAt: metav1.Now(),
        },
    }
}

这个日志和通过eks日志收集脚本收集到的内容时相同的,使用这种方式即使无法登录节点也可以收集节点日志,以便于后续的故障排查。

相关推荐
普通网友5 天前
Serverless 框架:多云函数部署(AWS + 阿里云 + 腾讯云)
阿里云·serverless·aws
TG_yunshuguoji5 天前
亚马逊云代理商:如何用 CloudWatch+Lambda 打造自动化告警系统
大数据·运维·自动化·云计算·aws
yyuuuzz5 天前
独立站搭建的几个核心技术问题
运维·服务器·网络·数据库·aws
yyuuuzz6 天前
aws亚马逊云服务的基础认知与常见场景
大数据·运维·服务器·网络·云计算·aws
普通网友6 天前
AWS VPC Transit Gateway 部署:实现多 VPC(开发 / 测试 / 生产)间流量集中管控
云计算·gateway·aws
dog2507 天前
从扩张性看 AWS RNG 为何优于传统胖树
云计算·php·aws
团象科技8 天前
出海企业技术架构优化实地观察 拆解AWS Lambda无服务器的落地细节
架构·serverless·aws
yyuuuzz8 天前
运维场景中AI模型的常见问题
运维·服务器·人工智能·深度学习·机器学习·云计算·aws
dog2508 天前
把确定性交给统计-浅析 AWS RNG
云计算·aws
知识浅谈9 天前
人工智能日报 每日AI新闻(2026年6月2日):OpenAI上AWS、Anthropic递表与AI终端竞赛升温
大数据·人工智能·aws