如何将AWS EKS的容器日志及节点操作系统日志发送至CloudWatch?
将EKS节点操作系统日志发送到CloudWatch的实现方案
核心结论
用DaemonSet形式部署的CloudWatch Agent完全可以实现EKS节点操作系统日志的采集转发,不需要在每个节点单独安装Linux二进制包,这种方式更贴合Kubernetes的运维流程,管理起来更高效。
具体配置步骤
1. 配置Agent权限
确保CloudWatch Agent DaemonSet使用的服务账号具备以下CloudWatch权限:logs:CreateLogStream、logs:PutLogEvents,同时要能读取节点上的系统日志文件(挂载后Pod默认有只读权限,只要节点路径权限允许即可)。
2. 挂载节点日志目录
在DaemonSet的配置里,通过hostPath将节点的系统日志目录挂载到Agent Pod中,示例volume配置:
volumes: - name: node-var-log hostPath: path: /var/log type: Directory # 如果需要采集Docker相关日志也可以挂载下面路径,按需添加 - name: docker-containers hostPath: path: /var/lib/docker/containers type: Directory
然后在容器的volumeMounts里添加挂载规则:
volumeMounts: - name: node-var-log mountPath: /var/log readOnly: true - name: docker-containers mountPath: /var/lib/docker/containers readOnly: true
3. 定义日志采集规则
通过ConfigMap或者Agent的配置文件,指定要采集的系统日志路径、目标日志组和流名称。示例配置片段(JSON格式):
{ "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/messages", "log_group_name": "/aws/eks/your-cluster-name/node/messages", "log_stream_name": "{instance_id}", "timestamp_format": "%b %d %H:%M:%S" }, { "file_path": "/var/log/auth.log", "log_group_name": "/aws/eks/your-cluster-name/node/auth", "log_stream_name": "{instance_id}", "timestamp_format": "%b %d %H:%M:%S" } ] } } } }
- 替换
your-cluster-name为你的EKS集群名称 timestamp_format要匹配节点系统日志的时间格式,不同发行版可能有差异,按需调整
4. 部署/更新DaemonSet
把上述配置整合到CloudWatch Agent的DaemonSet YAML文件中,执行部署命令:
kubectl apply -f cloudwatch-agent-daemonset.yaml
优势说明
用DaemonSet方式比单独安装二进制包更省心:
- 无需手动登录每个节点操作,配置统一管理
- 节点扩容时会自动在新节点部署Agent,无需额外操作
- Agent的生命周期由Kubernetes管控,异常时会自动重启
内容的提问来源于stack exchange,提问作者Biju
相关产品推荐
相关产品推荐

