KubeRay 可观测性#
KubeRay / Kubernetes 可观测性#
检查 KubeRay operator 的日志以查找错误#
# Typically, the operator's Pod name is kuberay-operator-xxxxxxxxxx-yyyyy.
kubectl logs $KUBERAY_OPERATOR_POD -n $YOUR_NAMESPACE | tee operator-log
使用此命令将 operator 的日志重定向到一个名为 operator-log 的文件。然后在此文件中搜索错误。
检查自定义资源的 state 和 events#
kubectl describe [raycluster|rayjob|rayservice] $CUSTOM_RESOURCE_NAME -n $YOUR_NAMESPACE
运行此命令后,请检查自定义资源的 state 和 conditions 字段以及 events,以查找任何错误和进度。
RayCluster .Status.State#
.Status.State 字段代表集群的状态,但其表示方式有限,限制了其可用性。请使用新的 Status.Conditions 字段进行替换。
State |
描述 |
|---|---|
Ready |
当集群中的所有 Pod 都准备就绪后,KubeRay 会将状态设置为 |
Suspended |
当 KubeRay 将 |
RayCluster .Status.Conditions#
虽然 Status.State 可以表示集群的状态,但它仍然只有一个字段。通过在 KubeRay v1.2.1 上启用 RayClusterStatusConditions 功能门,您可以访问新的 Status.Conditions,以获得更详细的集群历史和状态。
警告
RayClusterStatusConditions 仍为 Alpha 功能,未来可能会发生变化。
如果使用 Helm 部署 KubeRay,请在 Helm values 的 featureGates 中启用 RayClusterStatusConditions 门。
helm upgrade kuberay-operator kuberay/kuberay-operator --version 1.2.2 \
--set featureGates\[0\].name=RayClusterStatusConditions \
--set featureGates\[0\].enabled=true
或者,只需运行 KubeRay Operator 可执行文件,并附带 --feature-gates=RayClusterStatusConditions=true 参数。
类型 |
Status |
Reason |
描述 |
|---|---|---|---|
RayClusterProvisioned |
True |
AllPodRunningAndReadyFirstTime |
当集群中的所有 Pod 都就绪时,系统会将此条件标记为 |
False |
RayClusterPodsProvisioning |
||
RayClusterReplicaFailure |
True |
FailedDeleteAllPods |
当出现协调错误时,KubeRay 会将此条件设置为 |
True |
FailedDeleteHeadPod |
有关更详细的调试信息,请参阅条件的 |
|
True |
FailedCreateHeadPod |
||
True |
FailedDeleteWorkerPod |
||
True |
FailedCreateWorkerPod |
||
HeadPodReady |
True |
HeadPodRunningAndReady |
此条件仅当 Head Pod 当前就绪时才为 |
False |
HeadPodNotFound |
RayService .Status.Conditions#
从 KubeRay v1.3.0 开始,RayService 也支持 Status.Conditions 字段。
Ready:如果Ready为 true,则 RayService 已准备好处理请求。UpgradeInProgress:如果UpgradeInProgress为 true,则 RayService 当前正在进行升级过程,并且存在活动的和待处理的 RayCluster。
kubectl describe rayservices.ray.io rayservice-sample
# [Example output]
# Conditions:
# Last Transition Time: 2025-02-08T06:45:20Z
# Message: Number of serve endpoints is greater than 0
# Observed Generation: 1
# Reason: NonZeroServeEndpoints
# Status: True
# Type: Ready
# Last Transition Time: 2025-02-08T06:44:28Z
# Message: Active Ray cluster exists and no pending Ray cluster
# Observed Generation: 1
# Reason: NoPendingCluster
# Status: False
# Type: UpgradeInProgress
Kubernetes Events#
KubeRay 会为 KubeRay operator 与 Kubernetes API 服务器之间的每一次交互创建 Kubernetes 事件,例如创建 Kubernetes Service、更新 RayCluster 和删除 RayCluster。此外,如果自定义资源的验证失败,KubeRay 也会创建 Kubernetes 事件。
# Example:
kubectl describe rayclusters.ray.io raycluster-kuberay
# Events:
# Type Reason Age From Message
# ---- ------ ---- ---- -------
# Normal CreatedService 37m raycluster-controller Created service default/raycluster-kuberay-head-svc
# Normal CreatedHeadPod 37m raycluster-controller Created head Pod default/raycluster-kuberay-head-l7v7q
# Normal CreatedWorkerPod ...
Ray 可观测性#
Ray Dashboard#
要查看在 head Pod 上运行的 Ray dashboard,请遵循 这些说明。
要将 Ray dashboard 与 Prometheus 和 Grafana 集成,请参阅 使用 Prometheus 和 Grafana 获取更多详细信息。
要启用“CPU Flame Graph”和“Stack Trace”功能,请参阅 使用 py-spy 进行性能分析。
检查 Ray Pod 的日志#
通过访问 Pod 上的日志文件直接检查 Ray 日志。有关更多详细信息,请参阅 Ray Logging。
kubectl exec -it $RAY_POD -n $YOUR_NAMESPACE -- bash
# Check the logs under /tmp/ray/session_latest/logs/
检查 Dashboard#
export HEAD_POD=$(kubectl get pods --selector=ray.io/node-type=head -o custom-columns=POD:metadata.name --no-headers)
kubectl port-forward $HEAD_POD -n $YOUR_NAMESPACE 8265:8265
# Check $YOUR_IP:8265 in your browser to access the dashboard.
# For most cases, 127.0.0.1:8265 or localhost:8265 should work.
Ray State CLI#
您可以使用 head Pod 上的 Ray State CLI 来检查 Ray Serve 应用程序的状态。
# Log into the head Pod
export HEAD_POD=$(kubectl get pods --selector=ray.io/node-type=head -o custom-columns=POD:metadata.name --no-headers)
kubectl exec -it $HEAD_POD -- ray summary actors
# [Example output]:
# ======== Actors Summary: 2023-07-11 17:58:24.625032 ========
# Stats:
# ------------------------------------
# total_actors: 14
# Table (group by class):
# ------------------------------------
# CLASS_NAME STATE_COUNTS
# 0 ... ALIVE: 1
# 1 ... ALIVE: 1
# 2 ... ALIVE: 3
# 3 ... ALIVE: 1
# 4 ... ALIVE: 1
# 5 ... ALIVE: 1
# 6 ... ALIVE: 1
# 7 ... ALIVE: 1
# 8 ... ALIVE: 1
# 9 ... ALIVE: 1
# 10 ... ALIVE: 1
# 11 ... ALIVE: 1