在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日志收集脚本收集到的内容时相同的,使用这种方式即使无法登录节点也可以收集节点日志,以便于后续的故障排查。

相关推荐
yyuuuzz2 天前
谷歌云使用的几个常见注意事项
运维·服务器·网络·安全·web安全·云计算·aws
zhojiew2 天前
在AWS中国区的EMR集群中实现基于向量语义搜索的HBase运维诊断系统
运维·hbase·aws
yyuuuzz2 天前
独立开发者线上服务运维的几点实践经验
运维·服务器·网络·云计算·aws
zhojiew2 天前
使用DBT(data build tool)集成AWS Athena完成数据处理的实践
云计算·aws
yyuuuzz3 天前
aws的核心概念与常见使用场景
运维·服务器·网络·云计算·aws
zhojiew4 天前
在AWS云上使用EC2 嵌套虚拟化实例部署Cube Sandbox的实践和问题
云计算·aws
yyuuuzz5 天前
国际云服务器的技术特点与使用经验
运维·服务器·网络·数据库·云计算·aws
我是小邵6 天前
从 Supabase 迁移到 AWS 的云架构演进实践
架构·云计算·aws
炸裂狸花猫6 天前
开源身份认证与访问管理平台 - Keycloak(三)公有云Console集成实践(AWS / 阿里云 / OCI)
阿里云·云原生·keycloak·aws·oci·sso
xixixi777776 天前
AI的“账号”与“钱包”:AWS与Circle同日出手,AI正从工具进化
人工智能·安全·ai·大模型·云计算·aws