Skip to content

Commit 077c6fc

Browse files
committed
Basic support for the GPU/batch/inference ecosystem (37 kinds)
Status badges, smart table columns, column filters, drawer kind names, sidebar grouping, and Helm RBAC for: - Kueue: ClusterQueue, LocalQueue, Workload, ResourceFlavor, AdmissionCheck + Cluster Autoscaler ProvisioningRequest - KubeRay: RayCluster, RayJob, RayService, RayCronJob - KServe: InferenceService, ServingRuntime, ClusterServingRuntime, InferenceGraph, TrainedModel, LLMInferenceService - Gateway API Inference Extension: InferencePool (dual-group v1 + v1alpha2 with shape-detected accessors), InferenceObjective - LeaderWorkerSet, JobSet - Volcano: Job, Queue, PodGroup, JobFlow, JobTemplate - KAI Scheduler: Queue, PodGroup - KAITO: Workspace, RAGEngine - NVIDIA NIM Operator: NIMService, NIMCache, NIMPipeline - AMD GPU Operator: DeviceConfig - Kubeflow training: PyTorchJob, TFJob, MPIJob, TrainJob Detail views deliberately use the generic spec/status renderer - typed renderers, topology, and diagnosis land with the deeper per-tool phases. All status/spec accessors verified against upstream Go types; multi- version tolerant (Kueue v1beta1/v1beta2, MPIJob v1/v2beta1, GIE dual group) and nil-guarded throughout. Collision handling: Volcano Job shares the jobs plural with batch/v1 - core JobRenderer is apiVersion-gated and the CR falls through to GenericRenderer (Crossplane pattern); Volcano/KAI Queues + PodGroups and KAITO Workspaces disambiguate by group via GROUP_QUALIFIED_COLUMN_KEYS and guarded status routing. Five dispatch tests pin the collisions.
1 parent 8cef824 commit 077c6fc

34 files changed

Lines changed: 3310 additions & 12 deletions

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,13 @@ Radar auto-discovers any CRD in your cluster. Popular tools get [dedicated integ
391391
| **Sealed Secrets** | SealedSecret |
392392
| **Dynamic Resource Allocation** | ResourceClaim, ResourceClaimTemplate, DeviceClass, ResourceSlice (resource.k8s.io, K8s 1.32+) |
393393
| **NVIDIA GPU Operator** | ClusterPolicy, NVIDIADriver |
394+
| **Kueue** | ClusterQueue, LocalQueue, Workload, ResourceFlavor, AdmissionCheck (+ Cluster Autoscaler ProvisioningRequest) — basic |
395+
| **KubeRay** | RayCluster, RayJob, RayService, RayCronJob — basic |
396+
| **KServe** | InferenceService, ServingRuntime, ClusterServingRuntime, InferenceGraph, TrainedModel, LLMInferenceService — basic |
397+
| **Inference Gateway** | InferencePool (v1 + alpha groups), InferenceObjective — basic |
398+
| **Batch** | LeaderWorkerSet, JobSet, Volcano (Job/Queue/PodGroup/JobFlow/JobTemplate), Kubeflow (PyTorchJob/TFJob/MPIJob/TrainJob) — basic |
399+
| **KAI Scheduler** | Queue, PodGroup — basic |
400+
| **Model serving** | KAITO (Workspace, RAGEngine), NVIDIA NIM (NIMService/NIMCache/NIMPipeline), AMD GPU Operator (DeviceConfig) — basic |
394401
| **Cost (OpenCost)** | Namespace/workload/node cost breakdown via Prometheus (no CRDs) |
395402
| **CRDs** | Any Custom Resource Definition in your cluster (auto-discovered) |
396403

deploy/helm/radar/templates/clusterrole.yaml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,69 @@ rules:
353353
resources: ["*"]
354354
verbs: ["get", "list", "watch"]
355355
{{- end }}
356+
{{- if .Values.rbac.crdGroups.nimOperator }}
357+
- apiGroups: ["apps.nvidia.com"]
358+
resources: ["*"]
359+
verbs: ["get", "list", "watch"]
360+
{{- end }}
361+
{{- if .Values.rbac.crdGroups.amdGpu }}
362+
- apiGroups: ["amd.com"]
363+
resources: ["*"]
364+
verbs: ["get", "list", "watch"]
365+
{{- end }}
366+
{{- if .Values.rbac.crdGroups.kueue }}
367+
# autoscaling.x-k8s.io carries ProvisioningRequests — created by Kueue's
368+
# provisioning AdmissionCheck, so the two ship under one toggle.
369+
- apiGroups: ["kueue.x-k8s.io", "autoscaling.x-k8s.io"]
370+
resources: ["*"]
371+
verbs: ["get", "list", "watch"]
372+
{{- end }}
373+
{{- if .Values.rbac.crdGroups.kserve }}
374+
- apiGroups: ["serving.kserve.io"]
375+
resources: ["*"]
376+
verbs: ["get", "list", "watch"]
377+
{{- end }}
378+
{{- if .Values.rbac.crdGroups.kuberay }}
379+
- apiGroups: ["ray.io"]
380+
resources: ["*"]
381+
verbs: ["get", "list", "watch"]
382+
{{- end }}
383+
{{- if .Values.rbac.crdGroups.lws }}
384+
- apiGroups: ["leaderworkerset.x-k8s.io"]
385+
resources: ["*"]
386+
verbs: ["get", "list", "watch"]
387+
{{- end }}
388+
{{- if .Values.rbac.crdGroups.jobset }}
389+
- apiGroups: ["jobset.x-k8s.io"]
390+
resources: ["*"]
391+
verbs: ["get", "list", "watch"]
392+
{{- end }}
393+
{{- if .Values.rbac.crdGroups.inferenceGateway }}
394+
# Both groups coexist while the Inference Extension migrates to GA.
395+
- apiGroups: ["inference.networking.k8s.io", "inference.networking.x-k8s.io"]
396+
resources: ["*"]
397+
verbs: ["get", "list", "watch"]
398+
{{- end }}
399+
{{- if .Values.rbac.crdGroups.volcano }}
400+
- apiGroups: ["batch.volcano.sh", "scheduling.volcano.sh", "flow.volcano.sh", "bus.volcano.sh"]
401+
resources: ["*"]
402+
verbs: ["get", "list", "watch"]
403+
{{- end }}
404+
{{- if .Values.rbac.crdGroups.kaiScheduler }}
405+
- apiGroups: ["scheduling.run.ai", "kai.scheduler"]
406+
resources: ["*"]
407+
verbs: ["get", "list", "watch"]
408+
{{- end }}
409+
{{- if .Values.rbac.crdGroups.kaito }}
410+
- apiGroups: ["kaito.sh"]
411+
resources: ["*"]
412+
verbs: ["get", "list", "watch"]
413+
{{- end }}
414+
{{- if .Values.rbac.crdGroups.kubeflow }}
415+
- apiGroups: ["kubeflow.org", "trainer.kubeflow.org"]
416+
resources: ["*"]
417+
verbs: ["get", "list", "watch"]
418+
{{- end }}
356419
{{- if .Values.rbac.crdGroups.nginx }}
357420
- apiGroups: ["nginx.org"]
358421
resources: ["*"]

deploy/helm/radar/values.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,25 +131,36 @@ rbac:
131131
clusterApi: true # *.cluster.x-k8s.io (CAPI core + infrastructure / controlplane / bootstrap / addons)
132132
contour: true # projectcontour.io
133133
crossplane: true # crossplane.io, pkg.crossplane.io, apiextensions.crossplane.io, helm.crossplane.io, kubernetes.crossplane.io. For Upbound provider CRDs (s3.aws.upbound.io, compute.gcp.upbound.io, etc.) list them in additionalCrdGroups — K8s RBAC has no apiGroup wildcards.
134+
amdGpu: true # amd.com (AMD GPU Operator: DeviceConfig)
134135
descheduler: true # descheduler.alpha.kubernetes.io
135136
dra: true # resource.k8s.io (Dynamic Resource Allocation — ResourceClaims, DeviceClasses, ResourceSlices)
136137
envoyGateway: true # gateway.envoyproxy.io
138+
inferenceGateway: true # inference.networking.k8s.io, inference.networking.x-k8s.io (Gateway API Inference Extension)
137139
externalDns: true # externaldns.k8s.io
138140
externalSecrets: true # external-secrets.io
139141
flux: true # *.toolkit.fluxcd.io
140142
gatewayApi: true # gateway.networking.k8s.io
141143
gcpMonitoring: true # monitoring.googleapis.com
142144
grafana: true # monitoring.grafana.com, tempo/loki/grafana.integreatly.org
143145
istio: true # networking.istio.io, security.istio.io
146+
jobset: true # jobset.x-k8s.io
147+
kaiScheduler: true # scheduling.run.ai, kai.scheduler (KAI Scheduler queues and pod groups)
148+
kaito: true # kaito.sh (Workspaces, RAGEngines)
144149
karpenter: true # karpenter.sh, karpenter.k8s.aws, karpenter.azure.com, karpenter.k8s.gcp
145150
keda: true # keda.sh
146151
knative: true # serving.knative.dev, eventing.knative.dev, sources/messaging/flows/networking.internal.knative.dev
152+
kserve: true # serving.kserve.io (InferenceServices, ServingRuntimes, LLMInferenceServices)
153+
kubeflow: true # kubeflow.org, trainer.kubeflow.org (PyTorchJob/TFJob/MPIJob, TrainJob)
154+
kuberay: true # ray.io (RayClusters, RayJobs, RayServices)
147155
kubeshark: true # kubeshark.io
156+
kueue: true # kueue.x-k8s.io + autoscaling.x-k8s.io (queues, workloads, ProvisioningRequests)
148157
kured: true # kured.io
149158
kyverno: true # kyverno.io, wgpolicyk8s.io, reports.kyverno.io, openreports.io
159+
lws: true # leaderworkerset.x-k8s.io
150160
mariadb: true # mariadb.mmontes.io
151161
networkPolicyApi: true # policy.networking.k8s.io (Admin/Baseline/ClusterNetworkPolicy — SIG-network)
152162
nginx: true # nginx.org
163+
nimOperator: true # apps.nvidia.com (NVIDIA NIM: NIMServices, NIMCaches, NIMPipelines)
153164
nvidia: true # nvidia.com (GPU Operator: ClusterPolicy, NVIDIADriver)
154165
openshift: true # observability.openshift.io
155166
opentelemetry: true # opentelemetry.io
@@ -163,6 +174,7 @@ rbac:
163174
trivy: true # aquasecurity.github.io
164175
velero: true # velero.io
165176
verticalPodAutoscaler: true # autoscaling.k8s.io (VPA — granted by default; no-op on clusters where VPA isn't installed)
177+
volcano: true # batch.volcano.sh, scheduling.volcano.sh, flow.volcano.sh, bus.volcano.sh
166178

167179
# Additional CRD API groups for custom/unlisted CRDs
168180
# Example: ["mycompany.io", "custom.example.com"]

docs/integrations.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,76 @@ The [NVIDIA GPU Operator](https://docs.nvidia.com/datacenter/cloud-native/gpu-op
11151115

11161116
---
11171117

1118+
## GPU & Batch Ecosystem (basic support)
1119+
1120+
Basic resource support for the GPU scheduling, batch, and inference-serving ecosystem: **status badges, smart table columns, column filters, and sidebar grouping** for every kind below. Detail views use the standard spec/status renderer; topology participation and typed detail views land with the deeper per-tool integrations.
1121+
1122+
### Kueue + Cluster Autoscaler
1123+
1124+
| Resource | Group | Status source |
1125+
|----------|-------|---------------|
1126+
| ClusterQueue | `kueue.x-k8s.io` (v1beta2, v1beta1) | `Active` condition |
1127+
| LocalQueue | `kueue.x-k8s.io` | `Active` condition |
1128+
| Workload | `kueue.x-k8s.io` | Admitted / Evicted / Preempted / Finished conditions |
1129+
| ResourceFlavor | `kueue.x-k8s.io` ||
1130+
| AdmissionCheck | `kueue.x-k8s.io` | `Active` condition |
1131+
| ProvisioningRequest | `autoscaling.x-k8s.io` (v1, v1beta1) | Provisioned / Failed / CapacityRevoked / BookingExpired conditions |
1132+
1133+
### KubeRay
1134+
1135+
| Resource | Group | Status source |
1136+
|----------|-------|---------------|
1137+
| RayCluster | `ray.io/v1` | state + provisioning conditions |
1138+
| RayJob | `ray.io/v1` | jobStatus + jobDeploymentStatus |
1139+
| RayService | `ray.io/v1` | serviceStatus + upgrade/rollback conditions |
1140+
| RayCronJob | `ray.io/v1` | suspend |
1141+
1142+
### KServe
1143+
1144+
| Resource | Group | Status source |
1145+
|----------|-------|---------------|
1146+
| InferenceService | `serving.kserve.io/v1beta1` | Ready condition + modelStatus.transitionStatus |
1147+
| ServingRuntime / ClusterServingRuntime | `serving.kserve.io/v1alpha1` | spec.disabled |
1148+
| InferenceGraph | `serving.kserve.io/v1alpha1` | Ready condition |
1149+
| TrainedModel | `serving.kserve.io/v1alpha1` | Ready condition |
1150+
| LLMInferenceService | `serving.kserve.io` (v1alpha2, v1alpha1) | Ready / aggregate conditions |
1151+
1152+
### Gateway API Inference Extension
1153+
1154+
| Resource | Group | Status source |
1155+
|----------|-------|---------------|
1156+
| InferencePool | `inference.networking.k8s.io/v1` and `inference.networking.x-k8s.io/v1alpha2` | per-parent Accepted + ResolvedRefs |
1157+
| InferenceObjective | `inference.networking.x-k8s.io/v1alpha2` | Accepted condition |
1158+
1159+
### Batch: LeaderWorkerSet, JobSet, Volcano, Kubeflow Training
1160+
1161+
| Resource | Group | Status source |
1162+
|----------|-------|---------------|
1163+
| LeaderWorkerSet | `leaderworkerset.x-k8s.io/v1` | Available / Progressing conditions |
1164+
| JobSet | `jobset.x-k8s.io/v1alpha2` | Completed / Failed / Suspended conditions |
1165+
| Job (Volcano) | `batch.volcano.sh/v1alpha1` | state.phase — disambiguated from batch/v1 Jobs by group |
1166+
| Queue (Volcano) | `scheduling.volcano.sh/v1beta1` | state (Open/Closed) |
1167+
| PodGroup (Volcano) | `scheduling.volcano.sh/v1beta1` | phase + Unschedulable condition |
1168+
| JobFlow / JobTemplate | `flow.volcano.sh/v1alpha1` | state.phase / — |
1169+
| Queue (KAI) | `scheduling.run.ai/v2` | quota + allocation (no controller status) |
1170+
| PodGroup (KAI) | `scheduling.run.ai/v2alpha2` | phase + scheduling conditions |
1171+
| PyTorchJob / TFJob | `kubeflow.org/v1` | JobCondition pattern |
1172+
| MPIJob | `kubeflow.org` (v1, v2beta1) | JobCondition pattern |
1173+
| TrainJob | `trainer.kubeflow.org/v1alpha1` | Complete / Failed / Suspended conditions |
1174+
1175+
Volcano Job, the Volcano/KAI Queues and PodGroups, and KAITO Workspaces share kind names with other resources — Radar disambiguates by API group in tables, filters, and status badges.
1176+
1177+
### Model serving operators: KAITO, NVIDIA NIM, AMD
1178+
1179+
| Resource | Group | Status source |
1180+
|----------|-------|---------------|
1181+
| Workspace (KAITO) | `kaito.sh` (v1beta1) | ResourceReady / InferenceReady / WorkspaceSucceeded conditions |
1182+
| RAGEngine (KAITO) | `kaito.sh/v1alpha1` | ResourceReady / ServiceReady conditions |
1183+
| NIMService / NIMCache / NIMPipeline | `apps.nvidia.com/v1alpha1` | status.state |
1184+
| DeviceConfig (AMD GPU Operator) | `amd.com/v1alpha1` | component DaemonSet rollout counts |
1185+
1186+
---
1187+
11181188
## Any Other CRD
11191189

11201190
Radar automatically discovers and displays **every** CRD installed in your cluster — no configuration or plugins required. Resources appear in the sidebar, can be filtered and searched, and show full YAML with syntax highlighting in the detail drawer. The integrations above add richer presentation, but every CRD is browsable out of the box.

0 commit comments

Comments
 (0)