mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
kubelet: add shutdown events
This commit is contained in:
parent
53592b3222
commit
d9be5abc37
@ -65,6 +65,7 @@ const (
|
|||||||
SuccessfulAttachVolume = "SuccessfulAttachVolume"
|
SuccessfulAttachVolume = "SuccessfulAttachVolume"
|
||||||
SuccessfulMountVolume = "SuccessfulMountVolume"
|
SuccessfulMountVolume = "SuccessfulMountVolume"
|
||||||
NodeRebooted = "Rebooted"
|
NodeRebooted = "Rebooted"
|
||||||
|
NodeShutdown = "Shutdown"
|
||||||
ContainerGCFailed = "ContainerGCFailed"
|
ContainerGCFailed = "ContainerGCFailed"
|
||||||
ImageGCFailed = "ImageGCFailed"
|
ImageGCFailed = "ImageGCFailed"
|
||||||
FailedNodeAllocatableEnforcement = "FailedNodeAllocatableEnforcement"
|
FailedNodeAllocatableEnforcement = "FailedNodeAllocatableEnforcement"
|
||||||
|
@ -833,7 +833,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||||||
util.SetNodeOwnerFunc(klet.heartbeatClient, string(klet.nodeName)))
|
util.SetNodeOwnerFunc(klet.heartbeatClient, string(klet.nodeName)))
|
||||||
|
|
||||||
// setup node shutdown manager
|
// setup node shutdown manager
|
||||||
shutdownManager, shutdownAdmitHandler := nodeshutdown.NewManager(klet.GetActivePods, killPodNow(klet.podWorkers, kubeDeps.Recorder), klet.syncNodeStatus, kubeCfg.ShutdownGracePeriod.Duration, kubeCfg.ShutdownGracePeriodCriticalPods.Duration)
|
shutdownManager, shutdownAdmitHandler := nodeshutdown.NewManager(kubeDeps.Recorder, nodeRef, klet.GetActivePods, killPodNow(klet.podWorkers, kubeDeps.Recorder), klet.syncNodeStatus, kubeCfg.ShutdownGracePeriod.Duration, kubeCfg.ShutdownGracePeriodCriticalPods.Duration)
|
||||||
|
|
||||||
klet.shutdownManager = shutdownManager
|
klet.shutdownManager = shutdownManager
|
||||||
klet.admitHandlers.AddPodAdmitHandler(shutdownAdmitHandler)
|
klet.admitHandlers.AddPodAdmitHandler(shutdownAdmitHandler)
|
||||||
|
@ -314,7 +314,7 @@ func newTestKubeletWithImageList(
|
|||||||
kubelet.admitHandlers.AddPodAdmitHandler(evictionAdmitHandler)
|
kubelet.admitHandlers.AddPodAdmitHandler(evictionAdmitHandler)
|
||||||
|
|
||||||
// setup shutdown manager
|
// setup shutdown manager
|
||||||
shutdownManager, shutdownAdmitHandler := nodeshutdown.NewManager(kubelet.podManager.GetPods, killPodNow(kubelet.podWorkers, fakeRecorder), func() {}, 0 /* shutdownGracePeriodRequested*/, 0 /*shutdownGracePeriodCriticalPods */)
|
shutdownManager, shutdownAdmitHandler := nodeshutdown.NewManager(fakeRecorder, nodeRef, kubelet.podManager.GetPods, killPodNow(kubelet.podWorkers, fakeRecorder), func() {}, 0 /* shutdownGracePeriodRequested*/, 0 /*shutdownGracePeriodCriticalPods */)
|
||||||
kubelet.shutdownManager = shutdownManager
|
kubelet.shutdownManager = shutdownManager
|
||||||
kubelet.admitHandlers.AddPodAdmitHandler(shutdownAdmitHandler)
|
kubelet.admitHandlers.AddPodAdmitHandler(shutdownAdmitHandler)
|
||||||
|
|
||||||
|
@ -27,8 +27,10 @@ import (
|
|||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/clock"
|
"k8s.io/apimachinery/pkg/util/clock"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
|
kubeletevents "k8s.io/kubernetes/pkg/kubelet/events"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/eviction"
|
"k8s.io/kubernetes/pkg/kubelet/eviction"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
|
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd"
|
"k8s.io/kubernetes/pkg/kubelet/nodeshutdown/systemd"
|
||||||
@ -58,6 +60,9 @@ type dbusInhibiter interface {
|
|||||||
|
|
||||||
// Manager has functions that can be used to interact with the Node Shutdown Manager.
|
// Manager has functions that can be used to interact with the Node Shutdown Manager.
|
||||||
type Manager struct {
|
type Manager struct {
|
||||||
|
recorder record.EventRecorder
|
||||||
|
nodeRef *v1.ObjectReference
|
||||||
|
|
||||||
shutdownGracePeriodRequested time.Duration
|
shutdownGracePeriodRequested time.Duration
|
||||||
shutdownGracePeriodCriticalPods time.Duration
|
shutdownGracePeriodCriticalPods time.Duration
|
||||||
|
|
||||||
@ -75,8 +80,10 @@ type Manager struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewManager returns a new node shutdown manager.
|
// NewManager returns a new node shutdown manager.
|
||||||
func NewManager(getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, syncNodeStatus func(), shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) (*Manager, lifecycle.PodAdmitHandler) {
|
func NewManager(recorder record.EventRecorder, nodeRef *v1.ObjectReference, getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, syncNodeStatus func(), shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) (*Manager, lifecycle.PodAdmitHandler) {
|
||||||
manager := &Manager{
|
manager := &Manager{
|
||||||
|
recorder: recorder,
|
||||||
|
nodeRef: nodeRef,
|
||||||
getPods: getPodsFunc,
|
getPods: getPodsFunc,
|
||||||
killPod: killPodFunc,
|
killPod: killPodFunc,
|
||||||
syncNodeStatus: syncNodeStatus,
|
syncNodeStatus: syncNodeStatus,
|
||||||
@ -192,6 +199,19 @@ func (m *Manager) start() (chan struct{}, error) {
|
|||||||
}
|
}
|
||||||
klog.V(1).InfoS("Shutdown manager detected new shutdown event, isNodeShuttingDownNow", "event", isShuttingDown)
|
klog.V(1).InfoS("Shutdown manager detected new shutdown event, isNodeShuttingDownNow", "event", isShuttingDown)
|
||||||
|
|
||||||
|
var shutdownType string
|
||||||
|
if isShuttingDown {
|
||||||
|
shutdownType = "shutdown"
|
||||||
|
} else {
|
||||||
|
shutdownType = "cancelled"
|
||||||
|
}
|
||||||
|
klog.V(1).InfoS("Shutdown manager detected new shutdown event", "event", shutdownType)
|
||||||
|
if isShuttingDown {
|
||||||
|
m.recorder.Event(m.nodeRef, v1.EventTypeNormal, kubeletevents.NodeShutdown, "Shutdown manager detected shutdown event")
|
||||||
|
} else {
|
||||||
|
m.recorder.Event(m.nodeRef, v1.EventTypeNormal, kubeletevents.NodeShutdown, "Shutdown manager detected shutdown cancellation")
|
||||||
|
}
|
||||||
|
|
||||||
m.nodeShuttingDownMutex.Lock()
|
m.nodeShuttingDownMutex.Lock()
|
||||||
m.nodeShuttingDownNow = isShuttingDown
|
m.nodeShuttingDownNow = isShuttingDown
|
||||||
m.nodeShuttingDownMutex.Unlock()
|
m.nodeShuttingDownMutex.Unlock()
|
||||||
|
@ -30,6 +30,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/apimachinery/pkg/util/clock"
|
"k8s.io/apimachinery/pkg/util/clock"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
"k8s.io/client-go/tools/record"
|
||||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
"k8s.io/kubernetes/pkg/apis/scheduling"
|
"k8s.io/kubernetes/pkg/apis/scheduling"
|
||||||
pkgfeatures "k8s.io/kubernetes/pkg/features"
|
pkgfeatures "k8s.io/kubernetes/pkg/features"
|
||||||
@ -228,7 +229,10 @@ func TestManager(t *testing.T) {
|
|||||||
}
|
}
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, pkgfeatures.GracefulNodeShutdown, true)()
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, pkgfeatures.GracefulNodeShutdown, true)()
|
||||||
|
|
||||||
manager, _ := NewManager(activePodsFunc, killPodsFunc, func() {}, tc.shutdownGracePeriodRequested, tc.shutdownGracePeriodCriticalPods)
|
fakeRecorder := &record.FakeRecorder{}
|
||||||
|
nodeRef := &v1.ObjectReference{Kind: "Node", Name: "test", UID: types.UID("test"), Namespace: ""}
|
||||||
|
|
||||||
|
manager, _ := NewManager(fakeRecorder, nodeRef, activePodsFunc, killPodsFunc, func() {}, tc.shutdownGracePeriodRequested, tc.shutdownGracePeriodCriticalPods)
|
||||||
manager.clock = clock.NewFakeClock(time.Now())
|
manager.clock = clock.NewFakeClock(time.Now())
|
||||||
|
|
||||||
err := manager.Start()
|
err := manager.Start()
|
||||||
@ -302,7 +306,10 @@ func TestFeatureEnabled(t *testing.T) {
|
|||||||
}
|
}
|
||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, pkgfeatures.GracefulNodeShutdown, tc.featureGateEnabled)()
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, pkgfeatures.GracefulNodeShutdown, tc.featureGateEnabled)()
|
||||||
|
|
||||||
manager, _ := NewManager(activePodsFunc, killPodsFunc, func() {}, tc.shutdownGracePeriodRequested, 0 /*shutdownGracePeriodCriticalPods*/)
|
fakeRecorder := &record.FakeRecorder{}
|
||||||
|
nodeRef := &v1.ObjectReference{Kind: "Node", Name: "test", UID: types.UID("test"), Namespace: ""}
|
||||||
|
|
||||||
|
manager, _ := NewManager(fakeRecorder, nodeRef, activePodsFunc, killPodsFunc, func() {}, tc.shutdownGracePeriodRequested, 0 /*shutdownGracePeriodCriticalPods*/)
|
||||||
manager.clock = clock.NewFakeClock(time.Now())
|
manager.clock = clock.NewFakeClock(time.Now())
|
||||||
|
|
||||||
assert.Equal(t, tc.expectEnabled, manager.isFeatureEnabled())
|
assert.Equal(t, tc.expectEnabled, manager.isFeatureEnabled())
|
||||||
@ -341,7 +348,9 @@ func TestRestart(t *testing.T) {
|
|||||||
return dbus, nil
|
return dbus, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
manager, _ := NewManager(activePodsFunc, killPodsFunc, syncNodeStatus, shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods)
|
fakeRecorder := &record.FakeRecorder{}
|
||||||
|
nodeRef := &v1.ObjectReference{Kind: "Node", Name: "test", UID: types.UID("test"), Namespace: ""}
|
||||||
|
manager, _ := NewManager(fakeRecorder, nodeRef, activePodsFunc, killPodsFunc, syncNodeStatus, shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods)
|
||||||
err := manager.Start()
|
err := manager.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
|
@ -21,6 +21,8 @@ package nodeshutdown
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/eviction"
|
"k8s.io/kubernetes/pkg/kubelet/eviction"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
|
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
|
||||||
)
|
)
|
||||||
@ -29,7 +31,7 @@ import (
|
|||||||
type Manager struct{}
|
type Manager struct{}
|
||||||
|
|
||||||
// NewManager returns a fake node shutdown manager for non linux platforms.
|
// NewManager returns a fake node shutdown manager for non linux platforms.
|
||||||
func NewManager(getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, syncNodeStatus func(), shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) (*Manager, lifecycle.PodAdmitHandler) {
|
func NewManager(recorder record.EventRecorder, nodeRef *v1.ObjectReference, getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, syncNodeStatus func(), shutdownGracePeriodRequested, shutdownGracePeriodCriticalPods time.Duration) (*Manager, lifecycle.PodAdmitHandler) {
|
||||||
m := &Manager{}
|
m := &Manager{}
|
||||||
return m, m
|
return m, m
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user