openshift / openshift/machine-config-operator

Transient modprobe openvswitch failure permanently wedges kubelet/crio on boot, no self-recovery even after ovs-vswitchd recovers

Open
#6,545 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Go
Stars
269
Forks
529
Avg merge
3d 18h
Merged PRs (30d)
83

Description

Summary

A transient modprobe openvswitch failure during boot permanently prevents kubelet/crio from starting, with no automatic recovery, even though the underlying ovs-vswitchd.service itself self-heals via its own systemd restart policy a second later. Confirmed live on a control plane node during a mandatory MachineConfig rollout.

Reproduction, observed live

At boot, modprobe openvswitch failed transiently:

modprobe: ERROR: could not insert 'openvswitch': Cannot allocate memory

ovs-vswitchd.service's first start attempt failed as a direct result. Systemd's own Restart= policy successfully retried ovs-vswitchd.service about one second later, and it came up fine, confirmed active (running) and healthy for over an hour afterward.

However, openvswitch.service and ovs-configuration.service (templates/common/_base/units/ovs-configuration.service.yaml) had already evaluated their dependency on ovs-vswitchd.service at the moment of that first failure, and were marked Dependency failed, going inactive (dead) permanently with no further retry. This cascaded through nmstate-configuration.service to kubelet-dependencies.target (templates/common/_base/units/kubelet-dependencies.target.yaml) to crio.service and kubelet.service, all left inactive (dead) with result dependency. The node stayed NotReady for over an hour with zero self-recovery until manual intervention.

Recovery tested and confirmed

Once ovs-vswitchd.service was confirmed healthy again on its own, restarting ovs-configuration.service manually succeeded, but did not cascade to kubelet/crio automatically, those had to be explicitly restarted too:

systemctl restart ovs-configuration.service
systemctl restart kubelet-dependencies.target crio.service kubelet.service

Immediately after, the node returned to Ready. No further reboot was needed.

Why this matters

This happened during a routine MachineConfig rollout on a control plane node, not an unusual or contrived scenario. If it hit two control plane nodes at once (plausible if the underlying resource-pressure trigger for the transient modprobe failure is host-wide, for example a hypervisor host under memory pressure during a synchronized multi-VM reboot), it would risk actual etcd quorum loss during a disruptive rollout window. There is currently no automated recovery, and no indication anywhere in cluster status (ClusterOperators, MachineConfigPool) that points at the actual cause, a customer or support engineer would only see a node stuck NotReady and would need to SSH in, read raw journalctl boot logs, and understand systemd dependency/target semantics to find the real cause.

Recommendation

The dependent units in this boot chain (openvswitch.service, ovs-configuration.service, and by extension kubelet-dependencies.target) should re-evaluate or retry once the underlying ovs-vswitchd.service dependency recovers via its own restart policy, rather than staying permanently wedged from a single evaluation at the moment of first failure. This could be addressed with BindsTo=/OnFailure= semantics or an explicit retry/reset mechanism in the relevant unit files.

Environment

  • RHCOS 10.2.20260902-0, OCP 5.0.0-rc.1

Filed from hackathon testing under OCPSTRAT-2677.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with templates/common/_base/units/ovs-configuration.service.yaml and templates/common/_base/units/kubelet-dependencies.target.yaml, then trace the systemd dependency chain through openvswitch.service, nmstate-configuration.service, crio.service, and kubelet.service. Reproduce or inspect the transient ovs-vswitchd failure and its later recovery. Done means the dependent units recover automatically and the node returns to Ready without manual service restarts.

Written by the indexing model from the issue text.

Assessment

Tech stack
yaml
Domain
devops, infrastructure, operating-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.