Files
2026-07-13 13:17:40 +08:00

166 lines
8.4 KiB
Markdown

(kuberay-observability)=
# KubeRay Observability
## KubeRay / Kubernetes Observability
### Check KubeRay operator's logs for errors
```bash
# Typically, the operator's Pod name is kuberay-operator-xxxxxxxxxx-yyyyy.
kubectl logs $KUBERAY_OPERATOR_POD -n $YOUR_NAMESPACE | tee operator-log
```
Use this command to redirect the operator's logs to a file called `operator-log`. Then search for errors in the file.
### Check the status and events of custom resources
```bash
kubectl describe [raycluster|rayjob|rayservice] $CUSTOM_RESOURCE_NAME -n $YOUR_NAMESPACE
```
After running this command, check events and the `state`, and `conditions` in the status of the custom resource for any errors and progress.
#### RayCluster `.Status.State`
The `.Status.State` field represents the cluster's situation, but its limited representation restricts its utility. Replace it with the new `Status.Conditions` field.
| State | Description |
|-----------|----------------------------------------------------------------------------------------------------------------------------------------|
| Ready | KubeRay sets the state to `Ready` once all the Pods in the cluster are ready. The `State` remains `Ready` until KubeRay suspends the cluster. |
| Suspended | KubeRay sets the state to `Suspended` when it sets `Spec.Suspend` to true and deletes all Pods in the cluster. |
#### RayCluster `.Status.Conditions`
Although `Status.State` can represent the cluster situation, it's still only a single field. By enabling the feature gate `RayClusterStatusConditions` on the KubeRay v1.2.1, you can access to new `Status.Conditions` for more detailed cluster history and states.
:::{warning}
`RayClusterStatusConditions` is still an alpha feature and may change in the future.
:::
If you deployed KubeRay with Helm, then enable the `RayClusterStatusConditions` gate in the `featureGates` of your Helm values.
```bash
helm upgrade kuberay-operator kuberay/kuberay-operator --version 1.2.2 \
--set featureGates\[0\].name=RayClusterStatusConditions \
--set featureGates\[0\].enabled=true
```
Or, just make your KubeRay Operator executable run with `--feature-gates=RayClusterStatusConditions=true` argument.
| Type | Status | Reason | Description |
|--------------------------|--------|--------------------------------|----------------------------------------------------------------------------------------------------------------------|
| RayClusterProvisioned | True | AllPodRunningAndReadyFirstTime | When all Pods in the cluster become ready, the system marks the condition as `True`. Even if some Pods fail later, the system maintains this `True` state. |
| | False | RayClusterPodsProvisioning | |
| RayClusterReplicaFailure | True | FailedDeleteAllPods | KubeRay sets this condition to `True` when there's a reconciliation error, otherwise KubeRay clears the condition. |
| | True | FailedDeleteHeadPod | See the `Reason` and the `Message` of the condition for more detailed debugging information. |
| | True | FailedCreateHeadPod | |
| | True | FailedDeleteWorkerPod | |
| | True | FailedCreateWorkerPod | |
| HeadPodReady | True | HeadPodRunningAndReady | This condition is `True` only if the HeadPod is currently ready; otherwise, it's `False`. |
| | False | HeadPodNotFound | |
#### RayService `.Status.Conditions`
From KubeRay v1.3.0, RayService also supports the `Status.Conditions` field.
* `Ready`: If `Ready` is true, the RayService is ready to serve requests.
* `UpgradeInProgress`: If `UpgradeInProgress` is true, the RayService is currently in the upgrade process and both active and pending RayCluster exist.
```sh
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 creates Kubernetes events for every interaction between the KubeRay operator and the Kubernetes API server, such as creating a Kubernetes service, updating a RayCluster, and deleting a RayCluster. In addition, if the validation of the custom resource fails, KubeRay also creates a Kubernetes event.
```sh
# 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 Observability
### Ray Dashboard
* To view the [Ray dashboard](observability-getting-started) running on the head Pod, follow [these instructions](kuberay-port-forward-dashboard).
* To integrate the Ray dashboard with Prometheus and Grafana, see [Using Prometheus and Grafana](kuberay-prometheus-grafana) for more details.
* To enable the "CPU Flame Graph" and "Stack Trace" features, see [Profiling with py-spy](kuberay-pyspy-integration).
### Check logs of Ray Pods
Check the Ray logs directly by accessing the log files on the Pods. See [Ray Logging](configure-logging) for more details.
```bash
kubectl exec -it $RAY_POD -n $YOUR_NAMESPACE -- bash
# Check the logs under /tmp/ray/session_latest/logs/
```
(kuberay-port-forward-dashboard)=
### Check Dashboard
```bash
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
You can use the [Ray State CLI](state-api-cli-ref) on the head Pod to check the status of Ray Serve applications.
```bash
# 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
```