Repairing GPU Hosts
Find out how to configure and use GPU host repair for GPU worker nodes in clusters created with Kubernetes Engine (OKE).
GPU host repair helps you respond to specified hardware-related conditions on eligible bare metal GPU worker nodes. When a node is eligible for repair, OKE coordinates the repair workflow. The workflow first makes the node unavailable for new workloads and attempts to drain workloads from it before it performs the applicable Compute action.
GPU host repair supports the following repair types:
- User-initiated repair: Use this repair type when you identify a condition that requires a GPU worker node to be replaced. OKE coordinates draining the node, reporting the condition to Compute, terminating the affected instance, and restoring managed node pool capacity.
- GPU instance recovery: Use this repair type to trigger a repair action when GPU health monitoring reports an eligible critical GPU health signal. OKE coordinates draining the node and reboots the affected instance.
- Maintenance event repair: Use this repair type to trigger a repair action when OKE correlates a node-local GPU or RDMA fault with an OCI Compute maintenance event for the same Compute instance. OKE coordinates draining the node and either schedules a non-terminating maintenance event or terminates the instance, depending on the maintenance event action.
GPU host repair is available for eligible bare metal GPU worker nodes in clusters running Kubernetes version 1.32 or later. User-initiated repair and GPU instance recovery apply to eligible managed GPU worker nodes in managed node pools. Maintenance event repair applies to eligible managed and self-managed bare metal GPU worker nodes. A node is eligible only when its GPU shape is supported and available in the selected region. GPU host repair does not apply to virtual nodes or non-GPU worker nodes.
GPU host repair uses Kubernetes resources and standard Kubernetes tools. A NodeRepairConfig is a Kubernetes custom resource that selects the GPU worker nodes to which a repair policy applies. A NodeHealthReport is a Kubernetes custom resource that records health signals and repair progress for a node. You can inspect a NodeHealthReport, but you must not edit its status. The Node Repair Controller coordinates the repair workflow. For GPU instance recovery and maintenance event repair, the GPU Fault Monitor reports GPU and RDMA health signals. For maintenance event repair, OKE correlates local fault signals with OCI Compute maintenance events. Repair coordination uses a Kubernetes Lease to prevent concurrent processing of the same repair request.
Use dry-run mode to verify configuration and observe a proposed repair without cordoning or draining the node, applying a Compute tag, terminating or rebooting the instance, or replacing the node.
GPU host repair can disrupt workloads running on an affected node. Before configuring GPU host repair, design workloads for interruption. Review pod disruption budgets, replica configuration, checkpointing requirements, topology constraints, and available spare GPU capacity.
A repair request with a Completed state indicates that the repair workflow completed. It does not confirm that the underlying GPU fault was corrected. For maintenance event repair, a repair request with a Completed state also does not confirm that every underlying physical host diagnosis, repair, validation, or return-to-service process is complete, that replacement capacity is ready, or that workloads have recovered. After any repair, verify the node's current health signals and application health.
Configuring User-Initiated Repair for Managed GPU Worker Nodes
Before configuring user-initiated repair, identify an eligible managed GPU node pool and a controlled test node. Ensure that workloads on the selected node can be interrupted.
User-initiated repair requires access control in both OCI IAM and Kubernetes RBAC. In OCI IAM, the OKE cluster resource principal requires permission to apply the defined tag used to report the host condition to Compute. In Kubernetes, only a trusted operator should be able to initiate the protected repair request. The trusted operator requires standard Kubernetes RBAC permissions to update the target Node resource and the OKE-specific authorization delegated through a ClusterRoleBinding.
When you request user-initiated repair, OKE coordinates the following actions:
- Ensures only one repair request is processed at a time.
- Cordons the node so that Kubernetes does not schedule new pods on it.
- Attempts to drain workloads from the node.
- Reports the condition to Compute and terminates the affected instance.
- Restores the managed node pool’s configured capacity.
To configure and test user-initiated repair:
-
Verify that the cluster is an enhanced cluster, and is running Kubernetes version 1.32 or later. Verify that the node is an eligible managed GPU worker node. Verify that the OKE-managed Node Repair Controller and
NodeHealthReportCRDs, theoke-customer-node-repair-triggerClusterRole, and the trigger-protection admission policy and binding are installed on the cluster. If any OKE-managed resource is missing, contact Oracle Support. Do not recreate OKE-managed resources. Before using live repair, open a Support request to enable user-reported hardware-fault handling for your tenancy. Include the tenancy, region, cluster OCID, and GPU node pool in the request.
-
Create or reuse the defined tag that the Node Repair Controller uses to report the host condition to Compute.
Create or reuse a tag namespace named
ComputeInstanceHostActions. In that namespace, create or reuse a tag key definition namedCustomerReportedHostStatus. Do not create a free-form tag with the same text. For more information, see Creating a Tag Namespace and Creating a Tag Key Definition.Before terminating the original instance, the Node Repair Controller writes the value
unhealthyto theComputeInstanceHostActions.CustomerReportedHostStatusdefined tag on the instance. Create an OCI IAM policy that grants the OKE cluster resource principal the narrowly scoped permission to apply the defined tag:
Allow any-user to use tag-namespace in tenancy where all {request.principal.type = 'cluster', request.principal.id = '<cluster-ocid>', target.tag-namespace.name = 'ComputeInstanceHostActions'}IAM changes can take time to propagate. Wait for propagation before performing destructive validation.
-
Delegate the protected user-initiated repair trigger to trusted operators.
Create a
ClusterRoleBindingthat binds a trusted OCI IAM group OCID to the OKE-ownedoke-customer-node-repair-triggerClusterRole. Operators also require standard Kubernetes RBAC permissions to update the targetNoderesource.Create a file named
cir-trigger-operators.yamlwith the following content:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: oke-node-repair-trigger-operators roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: oke-customer-node-repair-trigger subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: <trusted-oci-iam-group-ocid>Replace
<trusted-oci-iam-group-ocid>with the OCID of the OCI IAM group that contains the trusted operators.Apply and verify the binding by entering:
kubectl apply -f cir-trigger-operators.yamlkubectl get clusterrolebinding \ oke-node-repair-trigger-operators \ -o yamlThis binding does not grant general permission to update
Noderesources. Use your existing Kubernetes authorization model to grant only the standard Kubernetes RBAC permissions required by the trusted operators. -
Create a non-overlapping, cluster-scoped
NodeRepairConfigcustom resource in dry-run mode.Select nodes by using a durable node-pool label that you manage and that is present on replacement nodes. The selector label is user-defined. Configure the label on the intended managed node pool so that replacement nodes retain it.
A node must match exactly one
NodeRepairConfigresource. Requests with no matching configuration or overlapping configurations are rejected without repair side effects. You can use the same or separate configurations for user-initiated repair and GPU instance recovery. If you use separate configurations, do not include the same nodes in multiple configurations; otherwise, the repair request will be rejected.The following example starts in dry-run mode, allows one repair at a time, sets the unhealthy-node threshold to 10%, uses a 60-minute drain grace period, and disables force-after-grace behavior:
apiVersion: oci.oraclecloud.com/v1beta1 kind: NodeRepairConfig metadata: name: gpu-node-repair spec: nodeSelector: matchLabels: example.com/gpu-repair: "enabled" policy: dryRun: true evictionGracePeriodMinutes: 60 forceActionAfterGracePeriod: false maxUnhealthyNodeThreshold: "10%" maximumParallelNodeRepairs: 1In the
policysection,dryRunandforceActionAfterGracePeriodare Boolean values.evictionGracePeriodMinutesis a non-negative integer.maximumParallelNodeRepairsis a positive integer.maxUnhealthyNodeThresholdaccepts a positive node count or a quoted percentage, such as"10%".Start with
dryRun: true. After validating the configuration, update onlydryRuntofalsefor live operation. -
Request a dry-run repair by applying the protected label
oci.oraclecloud.com/customer-report-host-status=unhealthyto the selected node. Inspect theNodeHealthReportand related node state. A dry-run request creates a completedNodeHealthReportrecord, but does not cordon, drain, apply the Compute defined tag, terminate, reboot, or replace the node. Trigger a live repair by applying the protected trigger label together with the one-shot live override
oci.oraclecloud.com/node-repair-dry-run=false. The live override is valid only with an active trigger, and is sampled only when a new trigger is created.To retry a user-initiated repair request, remove and reapply the
oci.oraclecloud.com/customer-report-host-status=unhealthylabel. Reapplying the same label value does not start another request. Removing the label does not cancel an active repair.Important
A live user-initiated repair can drain workloads and terminates the original Compute instance. Draining uses the Kubernetes Eviction API and honors pod disruption budgets. DaemonSet pods and static pods are skipped. If force-after-grace is enabled, the Node Repair Controller does not force-delete remaining pods, but the subsequent host action can still disrupt them.Verify the progress of the repair action, the Compute defined tag, termination of the original instance, managed-node-pool capacity restoration, and creation of a replacement node with a new UID and instance OCID. The
NodeHealthReportfor terminated instances is retained temporarily after the workflow completes.A
Deferredresult means that the workflow is temporarily blocked. AFailedresult means that the attempt stopped. ASupersededresult means that a higher-priority OKE workflow took over. ACompletedresult means that OKE finished the requested termination workflow. It does not mean that physical repair is complete or that replacement capacity isReady. After the workflow completes, verify that the managed node pool has the expected capacity and that the replacement node reports current healthy status.
For user-initiated repair, creation of a replacement worker node depends on managed-node-pool reconciliation and available GPU capacity. A completed workflow does not confirm that the underlying GPU fault was corrected.
Configuring GPU Instance Recovery for Managed GPU Worker Nodes
Before configuring GPU instance recovery, identify an eligible managed GPU node pool and confirm that its workloads can be interrupted. GPU instance recovery can cordon and drain an affected node before rebooting its instance.
Before configuring GPU instance recovery, create the IAM policies required by the GPU Health Monitoring add-on to monitor GPU hosts:
Allow dynamic-group <dg-name> to manage instance-family in compartment id <compartment-ocid>
Allow dynamic-group <dg-name> to read instance-agent-plugins in compartment id <compartment-ocid>
where:
-
<dg-name>is the name of the dynamic group that includes the Compute instances for the GPU worker nodes. For example, using a rule such asALL {instance.compartment.id = '<compartment-ocid>'}. By applying tags to node pools, you can create more restrictive rules such as:ALL { instance.compartment.id = 'ocid1.compartment.oc1..examplecompartment', tag.Operations.Workload.value = 'gpu-monitoring', tag.Operations.Environment.value = 'prod' }For more information, see Applying Tags to Node Pools.
<compartment-ocid>is the OCID of the compartment that contains the GPU worker nodes.
GPU instance recovery is supported only on eligible managed GPU worker nodes using the following GPU shapes:
BM.GPU.A10.4BM.GPU.A100-v2.8BM.GPU.B200.8BM.GPU.B300.8BM.GPU.B300.HS.8BM.GPU.B4.8BM.GPU.GB200-v2.4BM.GPU.GB200-v3.4BM.GPU.GB200.4BM.GPU.GB300.4BM.GPU.H100.8BM.GPU.H100T.8BM.GPU.H200-NC.8BM.GPU.H200.8BM.GPU.L40S-NC.4BM.GPU.L40S.4BM.GPU.MI300X.8BM.GPU.MI355X-v1.8BM.GPU.MI355X.8
GPU shape availability varies by region. Confirm that the selected GPU shape is available in the region where the cluster runs.
Oracle Cloud Agent version 1.64.0 or later is required by the Compute RDMA GPU Monitoring plug-in and must be installed on the selected nodes.
When OKE receives an eligible GPU health signal, it coordinates the following actions:
- Ensures only one recovery request is processed at a time.
- Cordons the node so that Kubernetes does not schedule new pods on it.
- Attempts to drain workloads from the node.
- Reboots the affected Compute instance.
To configure GPU instance recovery:
-
Verify that the cluster is running Kubernetes version 1.32 or later. Verify that the node is an eligible managed GPU worker node. Verify that the OKE-managed Node Repair Controller and
NodeHealthReportCRDs are installed on the cluster, and verify that the GPU Health Monitoring add-on is available for the cluster. Verify that the GPU Health Monitoring add-on has an
ACTIVEoption for the Kubernetes version running on the cluster by entering:oci ce addon-option list \ --kubernetes-version <version> \ --addon-name GpuHealthMonitoringWhen you install the add-on, install the latest
ACTIVEoption rather than pinning a version. The installed version must bev1.1.0or later.Install the OKE-managed GPU Health Monitoring add-on by entering:
oci ce cluster install-addon \ --addon-name GpuHealthMonitoring \ --cluster-id $CLUSTER_ID \ --region $REGIONThe command installs the latest available version of the add-on for the cluster.
The supported add-on configuration keys are
nodeSelectors,tolerations, androllingUpdate. TherollingUpdatevalue controls rolling update behavior bymaxSurgeandmaxUnavailable, using JSON format in plain text.-
Create a
GpuHealthMonitoringConfigresource to enable GPU health monitoring for the selected GPU worker nodes. The configuration requiresspec.enabledand a non-empty node selector.apiVersion: oci.oraclecloud.com/v1beta1 kind: GpuHealthMonitoringConfig metadata: name: gpu-health-monitoring spec: enabled: true nodeSelector: matchLabels: nvidia.com/gpu.present: "true"Save the configuration as
gpu-health-monitoring.yaml, and apply it by entering:kubectl apply -f gpu-health-monitoring.yamlThe
spec.enabledfield enables or disables monitoring for the selected nodes. Thespec.nodeSelectorfield selects the GPU nodes on which the Compute RDMA GPU Monitoring plug-in and GPU Fault Monitor run.Avoid creating multiple enabled
GpuHealthMonitoringConfigresources whose selectors match the same node. Overlapping policies are rejected with aReadycondition that hasstatusset toFalseandreasonset toMultipleMatchingPolicies. Verify GPU health monitoring configuration on the selected nodes.
The controller publishes the
oci.oraclecloud.com/GpuHealthMonitoringConfiguredNode condition. A value ofTrueindicates that the Compute RDMA GPU Monitoring plug-in was configured as enabled. A value ofFalseindicates that it was configured as disabled. A value ofUnknownindicates that the configured state cannot currently be trusted.The GPU Fault Monitor publishes the
oci.oraclecloud.com/GpuHealthMonitoringUnavailableNode condition. A value ofTrueindicates that one or more required GPU health-result files are unavailable. Possible causes include an outdated Oracle Cloud Agent version, unsupported shape, disabled or unhealthy plug-in, or misconfiguration. A value ofFalseindicates that the required result files are present.-
Create a non-overlapping, cluster-scoped
NodeRepairConfigcustom resource in dry-run mode.Select nodes by using a durable node-pool label that you manage. The selector label is user-defined.
A node must match exactly one
NodeRepairConfigresource. Requests with no matching configuration or overlapping configurations are rejected without repair side effects. You can use the same or separate configurations for user-initiated repair and GPU instance recovery. If you use separate configurations, do not include the same nodes in multiple configurations; otherwise, the repair request will be rejected.The following example starts in dry-run mode, allows one repair at a time, sets the unhealthy-node threshold to 10%, uses a 60-minute drain grace period, and disables force-after-grace behavior:
apiVersion: oci.oraclecloud.com/v1beta1 kind: NodeRepairConfig metadata: name: gpu-node-repair spec: nodeSelector: matchLabels: example.com/gpu-repair: "enabled" policy: dryRun: true evictionGracePeriodMinutes: 60 forceActionAfterGracePeriod: false maxUnhealthyNodeThreshold: "10%" maximumParallelNodeRepairs: 1 pauseBeforeRepair: trueIn the
policysection,dryRun,forceActionAfterGracePeriod, andpauseBeforeRepairare Boolean values.evictionGracePeriodMinutesis a non-negative integer.maximumParallelNodeRepairsis a positive integer.maxUnhealthyNodeThresholdaccepts a positive node count or a quoted percentage, such as"10%".Start with
dryRun: trueandpauseBeforeRepair: true. SettingpauseBeforeRepairtotrueenables you to inspect the selected repair before OKE starts disruptive actions. Pause also applies during dry-run. WhenpauseBeforeRepairis set totrue, you must continue the paused simulation before it can complete.After validating the configuration, update only
dryRuntofalsefor live operation.Note that GPU instance recovery is health-signal-driven. Do not apply the user-initiated repair label
oci.oraclecloud.com/customer-report-host-status=unhealthyfor GPU instance recovery. Verify that an eligible GPU health signal is reported for the node.
A node is eligible for automated reboot only when all of the following conditions are met:
- The Node condition
oci.oraclecloud.com/GpuHealthMonitoringFaultDetectedisTrue. - The
NodeHealthReportcontains an entry understatus.signals.clusterHealthCheck[]. - The signal has a non-empty
id. - The signal has
action=REBOOT. The value is case-insensitive. - The signal has a non-null
firstObservedAtvalue. - The signal has a non-null
lastObservedAtvalue, indicating that the signal is active. - The signal has remained active for at least 10 minutes.
- Node Repair Controller retry and cooldown rules permit another attempt. The repeat reboot cooldown is 60 minutes.
- The effective dry-run value is
falsefor an actual reboot. - Subsequent admission and disruption limits pass.
Signals with
action=CUSTOMER_ACTION_REQUIREDdo not trigger an automated reboot. If you see one of these signals, review theNodeHealthReportand node conditions, investigate the reported GPU health issue, and contact Support if you need help resolving it.- The Node condition
-
Enable live repair in the
NodeRepairConfigresource.GPU instance recovery starts only after the eligible signal has remained active for at least 10 minutes, and the repeat reboot cooldown is 60 minutes. Drain behavior follows the repair policy specified in the matching
NodeRepairConfigresource. Draining uses the Kubernetes Eviction API and honors pod disruption budgets. The time required to complete GPU instance recovery can vary, depending on workload disruption settings, node drain behavior, and Compute instance state. -
Verify that GPU instance recovery completed successfully.
Confirm that the
NodeHealthReportshows aRebootaction in live mode and has a terminal status ofCompleted. Confirm that the Compute instance is in theRunningstate, the Kubernetes node isReady, and the current GPU health result no longer reports the fault. Review the GPU health result after the workflow completes.
If the GPU health result still reports the same fault after the reboot, or reports the fault again, the fault has not been resolved. A completed recovery workflow does not mean that the underlying GPU fault was corrected. GPU instance recovery uses cooldown rules to prevent immediate reboot loops. After the GPU health result stops reporting the fault, a later GPU health result that reports a new fault can make the node eligible for another repair.
The generated
GpuHealthMonitoringAction resource is controller-owned. Do not create or edit GpuHealthMonitoringAction resources.Configuring Maintenance Event Repair for GPU Worker Nodes
Before configuring maintenance event repair, identify eligible bare metal GPU worker nodes and confirm that workloads on the selected nodes can be interrupted. Maintenance event repair can cordon and drain an affected node before OKE performs the applicable Compute action.
Maintenance event repair is supported for eligible bare metal GPU worker nodes, including managed nodes and self-managed nodes. The cluster must be an enhanced cluster and must be running Kubernetes version 1.32 or later. Maintenance event repair does not apply to virtual nodes or non-bare metal worker nodes.
Maintenance event repair uses GPU Health Monitoring to identify node-local GPU or RDMA faults on GPU shapes. OKE correlates the local fault signal with an OCI Compute maintenance event for the same Compute instance. If the node is selected by exactly one matching NodeRepairConfig resource and the repair policy allows repair, OKE coordinates the repair workflow.
Before configuring maintenance event repair, create the IAM policies required by the GPU Health Monitoring add-on to monitor GPU hosts:
Allow dynamic-group <dg-name> to manage instance-family in compartment id <compartment-ocid>
Allow dynamic-group <dg-name> to read instance-agent-plugins in compartment id <compartment-ocid>
where:
-
<dg-name>is the name of the dynamic group that includes the Compute instances for the GPU worker nodes. For example, using a rule such asALL {instance.compartment.id = '<compartment-ocid>'}. By applying tags to node pools, you can create more restrictive rules such as:ALL { instance.compartment.id = 'ocid1.compartment.oc1..examplecompartment', tag.Operations.Workload.value = 'gpu-monitoring', tag.Operations.Environment.value = 'prod' }For more information, see Applying Tags to Node Pools.
<compartment-ocid>is the OCID of the compartment that contains the GPU worker nodes.
Also create a policy that allows the OKE cluster resource principal to use instance maintenance events in the compartment that contains the GPU worker node instances and their maintenance events:
Allow any-user to use instance-maintenance-events in compartment id <worker-compartment-ocid> where request.principal.type = 'cluster'
To restrict access to a specific cluster, use a policy such as:
Allow any-user to use instance-maintenance-events in compartment id <worker-compartment-ocid> where all {request.principal.type = 'cluster', request.principal.id = '<cluster-ocid>'}
where:
<worker-compartment-ocid>is the OCID of the compartment that contains the GPU worker node instances and their maintenance events.<cluster-ocid>is the OCID of the cluster.
Maintenance event repair supports the following Compute maintenance event actions:
STOP: OKE coordinates a non-terminating maintenance event. The same Compute instance and Kubernetes node are expected to return to service after the maintenance event is processed.TERMINATE: OKE coordinates termination of the affected Compute instance. For managed node pools, replacement depends on managed-node-pool capacity management and available GPU capacity. For self-managed nodes, OKE does not automatically replace the node after termination. Provision and join a replacement node using the node-management process that you normally use for self-managed nodes (see Working with Self-Managed Nodes).
Oracle Cloud Agent version 1.64.0 or later is required by the Compute RDMA GPU Monitoring plug-in and must be installed on the selected nodes.
When OKE admits a maintenance event repair request, it coordinates the following actions:
- Ensures only one repair request is processed at a time.
- Correlates the local GPU or RDMA fault signal with a Compute maintenance event for the same instance.
- Records repair information in a
NodeHealthReport. - Cordons the node so that Kubernetes does not schedule new pods on it.
- Attempts to drain workloads from the node.
- Performs the applicable
STOPorTERMINATEmaintenance event workflow.
To configure maintenance event repair:
-
Verify that the cluster is an enhanced cluster and is running Kubernetes version 1.32 or later. Verify that the node is an eligible bare metal GPU worker node, either a managed node or a self-managed node.
Verify that the OKE-managed Node Repair Controller and
NodeHealthReportCRDs are installed on the cluster, and verify that the GPU Health Monitoring add-on is available for the cluster. If any OKE-managed resource is missing, contact Oracle Support. Do not recreate OKE-managed resources. -
Install and configure the GPU Health Monitoring add-on for the selected GPU worker nodes.
Maintenance event repair requires GPU Health Monitoring to be enabled on the selected GPU worker nodes so that OKE can correlate a local GPU or RDMA fault signal with a Compute maintenance event.
Verify that the GPU Health Monitoring add-on has an
ACTIVEoption for the Kubernetes version running on the cluster by entering:oci ce addon-option list \ --kubernetes-version <version> \ --addon-name GpuHealthMonitoringInstall the OKE-managed GPU Health Monitoring add-on by entering:
oci ce cluster install-addon \ --addon-name GpuHealthMonitoring \ --cluster-id $CLUSTER_ID \ --region $REGIONCreate a
GpuHealthMonitoringConfigresource to enable GPU health monitoring for the selected GPU worker nodes. The configuration requiresspec.enabledand a non-empty node selector.apiVersion: oci.oraclecloud.com/v1beta1 kind: GpuHealthMonitoringConfig metadata: name: gpu-health-monitoring spec: enabled: true nodeSelector: matchLabels: nvidia.com/gpu.present: "true"Save the configuration as
gpu-health-monitoring.yaml, and apply it by entering:kubectl apply -f gpu-health-monitoring.yamlThe
spec.enabledfield enables or disables monitoring for the selected nodes. Thespec.nodeSelectorfield selects the GPU nodes on which the Compute RDMA GPU Monitoring plug-in and GPU Fault Monitor run.Avoid creating multiple enabled
GpuHealthMonitoringConfigresources whose selectors match the same node. Overlapping policies are rejected with aReadycondition that hasstatusset toFalseandreasonset toMultipleMatchingPolicies.Verify GPU health monitoring configuration on the selected nodes. The controller publishes the
oci.oraclecloud.com/GpuHealthMonitoringConfiguredNode condition. The GPU Fault Monitor publishes theoci.oraclecloud.com/GpuHealthMonitoringUnavailableNode condition. -
Create a non-overlapping, cluster-scoped
NodeRepairConfigcustom resource in dry-run mode.Select nodes by using a durable label that you manage and that is present on the intended GPU worker nodes. For managed node pools, configure the label on the node pool so that replacement nodes retain it. For self-managed nodes, ensure that the label is applied consistently to the intended nodes.
A node must match exactly one
NodeRepairConfigresource. Requests with no matching configuration or overlapping configurations are rejected without repair side effects. Do not create overlapping configurations for user-initiated repair, GPU instance recovery, and maintenance event repair.The following example starts in dry-run mode, allows one repair at a time, sets the unhealthy-node threshold to 10%, uses a 60-minute drain grace period, and disables force-after-grace behavior:
apiVersion: oci.oraclecloud.com/v1beta1 kind: NodeRepairConfig metadata: name: gpu-node-repair spec: nodeSelector: matchLabels: example.com/gpu-repair: "enabled" policy: dryRun: true evictionGracePeriodMinutes: 60 forceActionAfterGracePeriod: false maxUnhealthyNodeThreshold: "10%" maximumParallelNodeRepairs: 1 pauseBeforeRepair: trueIn the
policysection,dryRun,forceActionAfterGracePeriod, andpauseBeforeRepairare Boolean values.evictionGracePeriodMinutesis a non-negative integer.maximumParallelNodeRepairsis a positive integer.maxUnhealthyNodeThresholdaccepts a positive node count or a quoted percentage, such as"10%".Start with
dryRun: trueandpauseBeforeRepair: true. SettingpauseBeforeRepairtotrueenables you to inspect the selected repair before OKE starts disruptive actions. Pause also applies during dry-run. WhenpauseBeforeRepairis set totrue, you must continue the paused simulation before it can complete. -
Verify dry-run behavior.
In dry-run mode, OKE evaluates the selected node, matching repair policy, correlated maintenance event, and proposed maintenance event action. Dry-run mode must not cordon, drain, stop, terminate, or replace the node.
Inspect the
NodeHealthReportfor the correlated maintenance event and workflow result. The maintenance event OCID is shown instatus.signals.maintenanceEvent[].maintenanceEventId. The correlated action is shown instatus.signals.maintenanceEvent[].action. The Compute event lifecycle state is shown instatus.signals.maintenanceEvent[].maintenanceLifecycleState.To verify the selected repair attempt, review
status.repair.selectedSignalIds,status.repair.repairAction,status.repair.dryRun,status.repair.terminalState, andstatus.lastRepairAttempt. A successful dry-run simulation recordsCompletedwithdryRun: true. Dry-run completion does not prove that a real drain or Compute action will succeed. -
Enable controlled live repair by updating the matching
NodeRepairConfigresource.For live operation, update only the intended policy fields, such as changing
dryRunfromtruetofalse. ChangingdryRundoes not replay an already admitted repair attempt. Changing theNodeRepairConfigresource does not re-evaluate an existing maintenance-event signal or alter an already admitted repair attempt. The updated policy applies to the next distinct maintenance-event signal.Do not edit
NodeHealthReportresources or toggle internalNodeconditions to force a retry.Important
A live maintenance event repair can drain workloads and stop or terminate the affected Compute instance. Draining uses the Kubernetes Eviction API and honors pod disruption budgets. DaemonSet pods and static pods are skipped. If force-after-grace is enabled, the Node Repair Controller does not force-delete remaining pods, but the subsequent Compute action can still disrupt them. -
If the repair pauses before the Compute action, inspect the
NodeHealthReportand node conditions. A paused repair is indicated by theoci.oraclecloud.com/NodeAutoRepairPaused=Truenode condition.To continue the paused repair, enter:
kubectl label node <node-name> oci.oraclecloud.com/node-repair-paused-response=continue --overwriteTo cancel the paused repair, enter:
kubectl label node <node-name> oci.oraclecloud.com/node-repair-paused-response=cancel --overwriteThe Node Repair Controller consumes the response label and clears the pause condition. When you continue a paused repair, OKE checks the repair policy and disruption limits again before continuing.
Canceling a paused repair stops only the OKE repair attempt. It does not cancel, reschedule, or remove the underlying Compute maintenance event. OKE records
Cancelledfor the repair attempt and clears the pause condition and response label. OKE continues tracking the Compute maintenance event, and theMaintenanceEventDetectedcondition might remain present. Canceling the OKE repair attempt does not prevent Compute from processing maintenance under its own schedule. -
For a
STOPmaintenance event repair, verify that the maintenance event workflow completes and the same node returns to service.In a successful non-terminating
STOPrepair, the KubernetesNodename, KubernetesNodeUID, and Compute instance OCID remain the same.Confirm that the
NodeHealthReportrecordsrepairAction: STOPand is not a dry-run. Confirm thatstatus.lastRepairAttemptrecordsresult: Completedand acompletedAttimestamp. Confirm that the originalNodeisReadyand schedulable, with unchanged identities. -
For a
TERMINATEmaintenance event repair, verify that the live repair matches the intended maintenance event and Compute instance, that the original instance is terminated, and that the original KubernetesNodeis removed.For managed node pools, confirm that replacement capacity becomes available when GPU capacity, service limits, and compartment quotas allow replacement. For self-managed nodes, provision and join a replacement node using the node-management process that you normally use for self-managed nodes (see Working with Self-Managed Nodes).
A
Completedresult indicates that OKE completed the termination workflow. It does not confirm that physical host repair is complete, replacement capacity is ready, or workloads have recovered.
A completed maintenance event repair workflow does not confirm that the underlying GPU or RDMA fault was corrected, that physical host repair is complete, that replacement capacity is ready, or that workloads have recovered. After the workflow completes, verify the node's current health signals, node readiness, expected capacity, and application health.
Monitoring and Troubleshooting GPU Host Repair for GPU Worker Nodes
Use Kubernetes resources and standard Kubernetes monitoring tools to inspect the NodeHealthReport, Node conditions, affected workloads, and repair workflow.
A
NodeHealthReport with a Completed state indicates that the repair workflow completed. It does not indicate that the underlying GPU fault was fixed. Verify current health signals, the worker node's readiness, and application health after the workflow completes.To monitor a GPU host repair workflow:
Inspect the
NodeHealthReportand the affected worker node before, during, and after repair.Review the
NodeHealthReportfor the repair request, repair progress, action, dry-run or live mode, and workflow result. Review the affected KubernetesNoderesource for node labels and conditions. Review Kubernetes Events for recent node and repair activity. For GPU instance recovery, check theGpuHealthMonitoringConfigured,GpuHealthMonitoringUnavailable, andGpuHealthMonitoringFaultDetectedconditions on the affected KubernetesNoderesource. For maintenance event repair, check the GPU or RDMA health signal, the correlated Compute maintenance event, and the maintenance event repair status recorded in theNodeHealthReport.Treat controller-owned resources as read-only. Do not create or edit generated actions or controller-owned resources.
Review the supported repair status and node state.
Use the
NodeHealthReportto review the repair policy, effective dry-run value, admission result, terminal result, and last repair attempt. Use the affected KubernetesNoderesource to review node conditions. Where applicable, verify the Compute instance lifecycle state, the Compute defined tag used for user-initiated repair, maintenance event details for maintenance event repair, and whether replacement capacity is ready.Do not rely on internal leases, request IDs, file paths, polling intervals, or intermediate workflow phases as status indicators.
-
For user-initiated repair, investigate rejected requests, deferred repair, failed repair, and superseded repair.
A request can be rejected when no
NodeRepairConfigresource matches the node or when more than one configuration applies.Use the
NodeHealthReportresult to decide what to investigate:- If the
NodeHealthReportshowsAdmissionRejected, verify theNodeRepairConfigresource, trigger authorization, and label configuration. - If the
NodeHealthReportshowsDeferred, wait for the blocking condition to clear, or adjust capacity if replacement capacity is unavailable. - If the
NodeHealthReportshowsFailed, inspect theNodeHealthReport, Kubernetes Events, pod disruption budgets, IAM policy, Compute defined tag, and Compute instance state. - If the
NodeHealthReportshowsSuperseded, follow the OKE workflow that took over the repair. - If the
NodeHealthReportshowsCompleted, verify that the original instance was terminated and that replacement capacity is ready.
- If the
-
For GPU instance recovery, investigate GPU health monitoring configuration, unavailable health results, reboot signals, signals that require action, incomplete drains, completed reboots with an ongoing fault, and continuing signals that do not trigger repeated reboots.
Use node conditions, GPU health signals, and the
NodeHealthReportresult to decide what to investigate:- If the
GpuHealthMonitoringConfigurednode condition isFalseorUnknown, verify the Oracle Cloud Agent configuration and theGpuHealthMonitoringadd-on configuration. - If the
GpuHealthMonitoringUnavailablenode condition isTrue, verify that the GPU shape is supported, Oracle Cloud Agent version1.64.0or later is installed, the Compute RDMA GPU Monitoring plug-in is enabled, and the GPU Health Monitoring add-on is installed and configured. - If an active GPU health signal has
action=REBOOT, monitor theNodeHealthReportfor the GPU instance recovery workflow. - If a GPU health signal has
action=CUSTOMER_ACTION_REQUIRED, investigate the reported GPU health issue. This signal does not trigger an automated reboot. - If the
NodeHealthReportshows an incomplete drain or failed repair, inspect Kubernetes Events, pod disruption budgets, workload state, and node conditions. - If the reboot completed but the GPU health result still reports the fault, investigate the ongoing fault.
- If the same signal continues after reboot, GPU instance recovery does not immediately reboot the node again. Cooldown rules prevent immediate reboot loops.
- If the
-
For maintenance event repair, investigate GPU Health Monitoring configuration, local GPU or RDMA fault signals, correlated Compute maintenance events, matching
NodeRepairConfigresources, paused repairs, incomplete drains, and the result of theSTOPorTERMINATEworkflow.For maintenance event repair, review the
oci.oraclecloud.com/MaintenanceEventDetectedandoci.oraclecloud.com/NodeAutoRepairPausednode conditions. In theNodeHealthReport, review the maintenance event OCID, action, fault codes, maintenance lifecycle state, repair ID, selected signal IDs, repair action, dry-run value, admission state, rejection details, terminal state, and last repair attempt.Use node conditions, maintenance event information, and the
NodeHealthReportresult to decide what to investigate:- If a local GPU or RDMA fault does not start maintenance event repair, verify GPU Health Monitoring, Oracle Cloud Agent, the GPU worker node shape, and the health signals recorded in the
NodeHealthReport. Confirm that a matching Compute maintenance event exists for the same instance. - If maintenance event repair is not admitted, confirm that exactly one
NodeRepairConfigselects the node and that repair policy and disruption limits allow repair. Inspect theNodeHealthReportadmission result. - If repair is paused, inspect the
NodeHealthReportand node conditions, and then use the supported response mechanism to continue or cancel the repair. - If a
STOPrepair completes but the node is not schedulable, check node readiness, cordon state, Compute maintenance event lifecycle state, current health signals, and Kubernetes Events. - If a
TERMINATErepair completes but expected capacity is not available, check GPU shape capacity, service limits, compartment quotas, and the node pool state. For self-managed nodes, provision and join a replacement node using the node-management process that you normally use for self-managed nodes (see Working with Self-Managed Nodes).
Relevant OKE repair outcomes include
Completed,Failed,Cancelled,Superseded, andAdmissionRejected. ADeferredstate represents temporary blocking, not a terminal outcome. Compute maintenance lifecycle values are separate from OKE repair outcomes. - If a local GPU or RDMA fault does not start maintenance event repair, verify GPU Health Monitoring, Oracle Cloud Agent, the GPU worker node shape, and the health signals recorded in the
-
Before opening a service request, collect the information needed to investigate the repair workflow.
Include the tenancy OCID, cluster OCID, region, Kubernetes version, GPU Health Monitoring add-on version, Oracle Cloud Agent version, affected worker node name, Compute instance OCID, relevant
NodeHealthReportandNodeRepairConfigresources, node labels and conditions, Kubernetes Events, pod disruption budget and workload state, timestamps, and current GPU health results. For maintenance event repair, also include the Compute maintenance event OCID, maintenance event action, fault codes, maintenance event lifecycle state, and any available maintenance event details from Compute.Do not modify OKE-owned CRDs, controller resources, admission objects, generated actions, or coordination resources.
Troubleshooting GPU Host Repair
| Issue | Action |
|---|---|
| No repair starts after a user-initiated request. | Check that exactly one NodeRepairConfig selects the node, confirm that the request was made by an authorized operator, and inspect the NodeHealthReport admission result. |
| The node remains cordoned or workloads are not drained. | Review pod disruption budgets, pods that cannot be evicted, workload scheduling constraints, and available replacement capacity. |
| The managed node pool does not return to its configured capacity after user-initiated repair. | Check GPU shape capacity in the selected region, service limits, compartment quotas, and the managed node pool's state. |
| A GPU health signal does not start GPU instance recovery. | Confirm that the signal and node are eligible, and verify the GPU Health Monitoring add-on and NodeRepairConfig. |
| The GPU worker node does not become ready after GPU instance recovery. | Check Node conditions, current GPU health signals, and application health. A completed workflow does not confirm that the underlying GPU fault was resolved. |
| A local GPU or RDMA fault does not start maintenance event repair. | Verify GPU Health Monitoring, Oracle Cloud Agent, the GPU worker node shape, and NodeHealthReport signals. Confirm that a matching Compute maintenance event exists for the same instance. |
| Maintenance event repair is not admitted. | Confirm that exactly one NodeRepairConfig selects the node and that the repair policy and disruption limits allow repair. Inspect the NodeHealthReport admission result. |
| A paused maintenance event repair does not continue. | Check for the oci.oraclecloud.com/NodeAutoRepairPaused=True node condition. Inspect the NodeHealthReport, then continue the repair by applying the oci.oraclecloud.com/node-repair-paused-response=continue label. If you cancel the paused repair, OKE stops only the repair attempt; it does not cancel, reschedule, or remove the underlying Compute maintenance event. |
A STOP maintenance event repair completes but the node is not schedulable. |
Check node readiness, cordon state, Compute maintenance event lifecycle state, current health signals, and Kubernetes Events. |
A TERMINATE maintenance event repair completes but expected capacity is not available. |
Verify that the live repair matches the intended maintenance event and Compute instance, that the original instance is terminated, and that the original Kubernetes Node is removed. For managed node pools, check GPU shape capacity, service limits, compartment quotas, and the node pool state. For self-managed nodes, provision and join a replacement node using the node-management process that you normally use for self-managed nodes. |
Use Kubernetes resources, node conditions, and Kubernetes Events as troubleshooting evidence. If you open a service request, Oracle Support can retrieve service-side logs as needed.