Skip to content

Commit

Permalink
UPSTREAM: 129151: kubelet: only emit one reboot event
Browse files Browse the repository at this point in the history
There are cases when the kubelet is starting where networking, or other
components can cause the kubelet to not post the status with the bootId.
The failed status update will cause the Kubelet to queue the
NodeRebooted warning and sometimes cause many events to be created.

This fix wraps the recordEventFunc to only emit one message per kubelet
instantiation.
  • Loading branch information
bertinatto committed Dec 11, 2024
1 parent 1b1330c commit bd327aa
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions pkg/kubelet/nodestatus/setters.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"net"
goruntime "runtime"
"strings"
"sync"
"time"

cadvisorapiv1 "github.com/google/cadvisor/info/v1"
Expand Down Expand Up @@ -57,6 +58,9 @@ const (
// Setters may partially mutate the node before returning an error.
type Setter func(ctx context.Context, node *v1.Node) error

// Only emit one reboot event
var rebootEvent sync.Once

// NodeAddress returns a Setter that updates address-related information on the node.
func NodeAddress(nodeIPs []net.IP, // typically Kubelet.nodeIPs
validateNodeIPFunc func(net.IP) error, // typically Kubelet.nodeIPValidator
Expand Down Expand Up @@ -250,6 +254,7 @@ func hasAddressType(addresses []v1.NodeAddress, addressType v1.NodeAddressType)
}
return false
}

func hasAddressValue(addresses []v1.NodeAddress, addressValue string) bool {
for _, address := range addresses {
if address.Address == addressValue {
Expand Down Expand Up @@ -311,8 +316,12 @@ func MachineInfo(nodeName string,
node.Status.NodeInfo.BootID != info.BootID {
// TODO: This requires a transaction, either both node status is updated
// and event is recorded or neither should happen, see issue #6055.
recordEventFunc(v1.EventTypeWarning, events.NodeRebooted,
fmt.Sprintf("Node %s has been rebooted, boot id: %s", nodeName, info.BootID))
//
// Only emit one reboot event. recordEventFunc queues events and can emit many superfluous reboot events
rebootEvent.Do(func() {
recordEventFunc(v1.EventTypeWarning, events.NodeRebooted,
fmt.Sprintf("Node %s has been rebooted, boot id: %s", nodeName, info.BootID))
})
}
node.Status.NodeInfo.BootID = info.BootID

Expand Down

0 comments on commit bd327aa

Please sign in to comment.