日志持久化
Contents
日志持久化#
日志(系统日志和应用程序日志)对于 Ray 应用程序和集群的故障排除非常有用。例如,如果节点意外终止,您可能想要访问系统日志。
与 Kubernetes 类似,Ray 不提供日志数据的原生存储解决方案。用户需要自行管理日志的生命周期。本页面提供有关如何从 Kubernetes 上运行的 Ray 集群收集日志的说明。
Tip
跳至示例配置的 部署说明, 了解如何从 Ray pod 中提取日志。
Ray 日志目录#
默认的,Ray 将日志文件写入到每个 Ray Pod 的文件系统路径 /tmp/ray/session_*/logs,包括应用程序日志和系统日志。在开始收集日志之前,请详细了解 日志目录和日志文件 和 日志轮换配置。
日志处理工具#
Kubernetes 生态系统中有许多可用的开源日志处理工具。本页展示如何使用 Fluent Bit 提取 Ray 日志。 其他流行的工具包括 Vector、 Fluentd、 Filebeat 以及 Promtail。
日志收集策略#
使用以下两种日志记录策略之一收集写入 pod 文件系统的日志: sidecar 容器 或 daemonsets。 在 Kubernetes 文档 中阅读有关这些日志记录模式的更多信息。
Sidecar 容器#
我们在本指南中提供了 sidecar 策略的 示例。
您可以通过为每个 Ray pod 配置日志处理 sidecar 来处理日志。
Ray 容器应配置为通过卷挂载与日志记录 sidecar 共享目录 /tmp/ray。
可以将 sidecar 配置为执行以下任一操作:
将 Ray 日志流式传输到 sidecar 的标准输出。
将日志导出到外部服务。
守护进程#
或者,可以在 Kubernetes 节点级别收集日志。
为此,需要将日志处理守护进程集部署到 Kubernetes 集群的节点上。
使用此策略,关键是将 Ray 容器的 /tmp/ray 目录挂载到相关的 hostPath。
使用 Fluent Bit 设置日志记录 sidecar#
在本节中,我们将举例说明如何为 Ray pod设置发送日志的 Fluent Bit sidecar 。
这里 查看具有日志记录 sidecar 的单 Pod RayCluster 的完整配置。 我们现在讨论此配置并展示如何部署它。
配置日志处理#
第一步是创建一个包含 Fluent Bit 配置的 ConfigMap。
这是一个最小的 ConfigMap,它告诉 Fluent Bit sidecar
Tail Ray 日志。
将日志输出到容器的标准输出。
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentbit-config
data:
fluent-bit.conf: |
[INPUT]
Name tail
Path /tmp/ray/session_latest/logs/*
Tag ray
Path_Key true
Refresh_Interval 5
[OUTPUT]
Name stdout
Match *
对上述配置的一些注意事项:
除了将日志流式传输到 stdout 之外,您还可以使用 [OUTPUT] 子句将日志导出 到Fluent Bit 支持的任何后端存储。
上面的
Path_Key true行确保了文件名包含在 Fluent Bit 发出的日志记录中。Refresh_Interval 5行要求 Fluent Bit 每 5 秒刷新一次日志目录中的文件列表,而不是默认的 60 次。 原因是该/tmp/ray/session_latest/logs/目录最初不存在(Ray 必须先创建它)。 设置Refresh_Interval较低的值可以让我们更快地看到 Fluent Bit 容器的标准输出中的日志。
将日志记录 sidecar 添加到 RayCluster 自定义资源 (CR)#
添加日志和配置卷#
对于 RayCluster CR 中的每个 pod 模板, 我们需要添加两个卷:一个用于 Ray 日志的卷, 另一个用于存储上面应用的 ConfigMap 中的 Fluent Bit 配置的卷。
volumes:
- name: ray-logs
emptyDir: {}
- name: fluentbit-config
configMap:
name: fluentbit-config
挂载 Ray 日志目录#
将以下卷安装添加到 Ray 容器的配置中。
volumeMounts:
- mountPath: /tmp/ray
name: ray-logs
添加 Fluent Bit sidecar#
最后,将 Fluent Bit sidecar 容器添加到 RayCluster CR 中的每个 Ray pod 配置中。
- name: fluentbit
image: fluent/fluent-bit:1.9.6
# These resource requests for Fluent Bit should be sufficient in production.
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 100m
memory: 128Mi
volumeMounts:
- mountPath: /tmp/ray
name: ray-logs
- mountPath: /fluent-bit/etc/fluent-bit.conf
subPath: fluent-bit.conf
name: fluentbit-config
安装该 ray-logs 卷使 sidecar 容器可以访问 Ray 的日志。
fluentbit-config
将所有内容放在一起#
将上述所有元素放在一起,我们为单 Pod RayCluster 提供了以下 yaml 配置, 该配置将成为日志处理 sidecar。
# Fluent Bit ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentbit-config
data:
fluent-bit.conf: |
[INPUT]
Name tail
Path /tmp/ray/session_latest/logs/*
Tag ray
Path_Key true
Refresh_Interval 5
[OUTPUT]
Name stdout
Match *
---
# RayCluster CR with a FluentBit sidecar
apiVersion: ray.io/v1alpha1
kind: RayCluster
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: raycluster-complete-logs
spec:
rayVersion: '2.3.0'
headGroupSpec:
rayStartParams:
dashboard-host: '0.0.0.0'
template:
spec:
containers:
- name: ray-head
image: rayproject/ray:2.3.0
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","ray stop"]
# This config is meant for demonstration purposes only.
# Use larger Ray containers in production!
resources:
limits:
cpu: "1"
memory: "1G"
requests:
cpu: "1"
memory: "1G"
# Share logs with Fluent Bit
volumeMounts:
- mountPath: /tmp/ray
name: ray-logs
# Fluent Bit sidecar
- name: fluentbit
image: fluent/fluent-bit:1.9.6
# These resource requests for Fluent Bit should be sufficient in production.
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 100m
memory: 128Mi
volumeMounts:
- mountPath: /tmp/ray
name: ray-logs
- mountPath: /fluent-bit/etc/fluent-bit.conf
subPath: fluent-bit.conf
name: fluentbit-config
# Log and config volumes
volumes:
- name: ray-logs
emptyDir: {}
- name: fluentbit-config
configMap:
name: fluentbit-config
部署带有日志记录 sidecar 的 RayCluster#
要部署上述配置,请部署 KubeRay Operator(如果尚未部署): 参阅 入门指南 以获取有关此步骤的说明。
现在,运行以下命令来部署 Fluent Bit ConfigMap 和带有 Fluent Bit sidecar 的单 Pod RayCluster。
kubectl apply -f https://raw.githubusercontent.com/ray-project/ray/releases/2.4.0/doc/source/cluster/kubernetes/configs/ray-cluster.log.yaml
确定 Ray pod 的名称
kubectl get pod | grep raycluster-complete-logs
检查 FluentBit sidecar 的 STDOUT 以查看 Ray 组件进程的日志。
# Substitute the name of your Ray pod.
kubectl logs raycluster-complete-logs-head-xxxxx -c fluentbit
将 Ray 日志重定向到 stderr#
默认情况下,Ray 将日志写入该 /tmp/ray/session_*/logs 目录中的文件。如果您希望将日志重定向到主机 Pod 的 stderr,请在所有 Ray 节点上设置环境变量 RAY_LOG_TO_STDERR=1。推荐这种做法,但如果您的日志处理工具仅捕获写入 stderr 的日志记录,这种做法可能会很有用。
Alert
此功能存在已知问题。例如,它可能会破坏 Worker 日志重定向到 Driver等功能。如果需要这些功能,请使用上面的 Fluent Bit solution 方案。
对于虚拟机上的集群,不要将日志重定向到 stderr。请按照 本指南 保存日志。
将日志记录重定向到 stderr 还会在每个日志记录消息前面添加一个 ({component}) 前缀,例如 (raylet)。
[2022-01-24 19:42:02,978 I 1829336 1829336] (gcs_server) grpc_server.cc:103: GcsServer server started, listening on port 50009.
[2022-01-24 19:42:06,696 I 1829415 1829415] (raylet) grpc_server.cc:103: ObjectManager server started, listening on port 40545.
2022-01-24 19:42:05,087 INFO (dashboard) dashboard.py:95 -- Setup static dir for dashboard: /mnt/data/workspace/ray/python/ray/dashboard/client/build
2022-01-24 19:42:07,500 INFO (dashboard_agent) agent.py:105 -- Dashboard agent grpc address: 0.0.0.0:49228
这些前缀允许您将日志的 stderr 流过滤到感兴趣的组件。 请注意,多行日志记录在每行的开头 没有 此组件标记。
按照以下步骤在所有Ray节点上设置环境变量 RAY_LOG_TO_STDERR=1
Start the cluster explicitly with CLI
env RAY_LOG_TO_STDERR=1 ray start
Start the cluster implicitly with ray.init
os.environ["RAY_LOG_TO_STDERR"] = "1"
ray.init()
Set RAY_LOG_TO_STDERR to 1 in spec.headGroupSpec.template.spec.containers.env and spec.workerGroupSpec.template.spec.containers.env. Check out this example YAML file