Skip to content

Commit 94ddb3a

Browse files
Implementation
1 parent cc466aa commit 94ddb3a

File tree

4 files changed

+118
-0
lines changed

4 files changed

+118
-0
lines changed

pkg/kubelet/kubelet_pods.go

+3
Original file line numberDiff line numberDiff line change
@@ -2299,6 +2299,9 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon
22992299
if utilfeature.DefaultFeatureGate.Enabled(features.SupplementalGroupsPolicy) {
23002300
status.User = convertContainerStatusUser(cStatus)
23012301
}
2302+
if utilfeature.DefaultFeatureGate.Enabled(features.ContainerStopSignals) {
2303+
status.StopSignal = cStatus.StopSignal
2304+
}
23022305
if containerSeen[cName] == 0 {
23032306
statuses[cName] = status
23042307
} else {

pkg/kubelet/kuberuntime/helpers.go

+96
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ import (
2626

2727
v1 "k8s.io/api/core/v1"
2828
"k8s.io/apimachinery/pkg/types"
29+
utilfeature "k8s.io/apiserver/pkg/util/feature"
2930
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
3031
"k8s.io/klog/v2"
32+
"k8s.io/kubernetes/pkg/features"
3133
"k8s.io/kubernetes/pkg/kubelet/cm"
3234
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
3335
"k8s.io/kubernetes/pkg/security/apparmor"
@@ -421,3 +423,97 @@ func convertResourceConfigToLinuxContainerResources(rc *cm.ResourceConfig) *runt
421423

422424
return lcr
423425
}
426+
427+
var signalNameToRuntimeEnum = map[string]runtimeapi.Signal{
428+
"SIGABRT": runtimeapi.Signal_SIGABRT,
429+
"SIGALRM": runtimeapi.Signal_SIGALRM,
430+
"SIGBUS": runtimeapi.Signal_SIGBUS,
431+
"SIGCHLD": runtimeapi.Signal_SIGCHLD,
432+
"SIGCLD": runtimeapi.Signal_SIGCLD,
433+
"SIGCONT": runtimeapi.Signal_SIGCONT,
434+
"SIGFPE": runtimeapi.Signal_SIGFPE,
435+
"SIGHUP": runtimeapi.Signal_SIGHUP,
436+
"SIGILL": runtimeapi.Signal_SIGILL,
437+
"SIGINT": runtimeapi.Signal_SIGINT,
438+
"SIGIO": runtimeapi.Signal_SIGIO,
439+
"SIGIOT": runtimeapi.Signal_SIGIOT,
440+
"SIGKILL": runtimeapi.Signal_SIGKILL,
441+
"SIGPIPE": runtimeapi.Signal_SIGPIPE,
442+
"SIGPOLL": runtimeapi.Signal_SIGPOLL,
443+
"SIGPROF": runtimeapi.Signal_SIGPROF,
444+
"SIGPWR": runtimeapi.Signal_SIGPWR,
445+
"SIGQUIT": runtimeapi.Signal_SIGQUIT,
446+
"SIGSEGV": runtimeapi.Signal_SIGSEGV,
447+
"SIGSTKFLT": runtimeapi.Signal_SIGSTKFLT,
448+
"SIGSTOP": runtimeapi.Signal_SIGSTOP,
449+
"SIGSYS": runtimeapi.Signal_SIGSYS,
450+
"SIGTERM": runtimeapi.Signal_SIGTERM,
451+
"SIGTRAP": runtimeapi.Signal_SIGTRAP,
452+
"SIGTSTP": runtimeapi.Signal_SIGTSTP,
453+
"SIGTTIN": runtimeapi.Signal_SIGTTIN,
454+
"SIGTTOU": runtimeapi.Signal_SIGTTOU,
455+
"SIGURG": runtimeapi.Signal_SIGURG,
456+
"SIGUSR1": runtimeapi.Signal_SIGUSR1,
457+
"SIGUSR2": runtimeapi.Signal_SIGUSR2,
458+
"SIGVTALRM": runtimeapi.Signal_SIGVTALRM,
459+
"SIGWINCH": runtimeapi.Signal_SIGWINCH,
460+
"SIGXCPU": runtimeapi.Signal_SIGXCPU,
461+
"SIGXFSZ": runtimeapi.Signal_SIGXFSZ,
462+
"SIGRTMIN": runtimeapi.Signal_SIGRTMIN,
463+
"SIGRTMIN+1": runtimeapi.Signal_SIGRTMINPLUS1,
464+
"SIGRTMIN+2": runtimeapi.Signal_SIGRTMINPLUS2,
465+
"SIGRTMIN+3": runtimeapi.Signal_SIGRTMINPLUS3,
466+
"SIGRTMIN+4": runtimeapi.Signal_SIGRTMINPLUS4,
467+
"SIGRTMIN+5": runtimeapi.Signal_SIGRTMINPLUS5,
468+
"SIGRTMIN+6": runtimeapi.Signal_SIGRTMINPLUS6,
469+
"SIGRTMIN+7": runtimeapi.Signal_SIGRTMINPLUS7,
470+
"SIGRTMIN+8": runtimeapi.Signal_SIGRTMINPLUS8,
471+
"SIGRTMIN+9": runtimeapi.Signal_SIGRTMINPLUS9,
472+
"SIGRTMIN+10": runtimeapi.Signal_SIGRTMINPLUS10,
473+
"SIGRTMIN+11": runtimeapi.Signal_SIGRTMINPLUS11,
474+
"SIGRTMIN+12": runtimeapi.Signal_SIGRTMINPLUS12,
475+
"SIGRTMIN+13": runtimeapi.Signal_SIGRTMINPLUS13,
476+
"SIGRTMIN+14": runtimeapi.Signal_SIGRTMINPLUS14,
477+
"SIGRTMIN+15": runtimeapi.Signal_SIGRTMINPLUS15,
478+
"SIGRTMAX-14": runtimeapi.Signal_SIGRTMAXMINUS14,
479+
"SIGRTMAX-13": runtimeapi.Signal_SIGRTMAXMINUS13,
480+
"SIGRTMAX-12": runtimeapi.Signal_SIGRTMAXMINUS12,
481+
"SIGRTMAX-11": runtimeapi.Signal_SIGRTMAXMINUS11,
482+
"SIGRTMAX-10": runtimeapi.Signal_SIGRTMAXMINUS10,
483+
"SIGRTMAX-9": runtimeapi.Signal_SIGRTMAXMINUS9,
484+
"SIGRTMAX-8": runtimeapi.Signal_SIGRTMAXMINUS8,
485+
"SIGRTMAX-7": runtimeapi.Signal_SIGRTMAXMINUS7,
486+
"SIGRTMAX-6": runtimeapi.Signal_SIGRTMAXMINUS6,
487+
"SIGRTMAX-5": runtimeapi.Signal_SIGRTMAXMINUS5,
488+
"SIGRTMAX-4": runtimeapi.Signal_SIGRTMAXMINUS4,
489+
"SIGRTMAX-3": runtimeapi.Signal_SIGRTMAXMINUS3,
490+
"SIGRTMAX-2": runtimeapi.Signal_SIGRTMAXMINUS2,
491+
"SIGRTMAX-1": runtimeapi.Signal_SIGRTMAXMINUS1,
492+
"SIGRTMAX": runtimeapi.Signal_SIGRTMAX,
493+
}
494+
495+
func getContainerConfigStopSignal(container *v1.Container) (stopsignal *runtimeapi.Signal) {
496+
if utilfeature.DefaultFeatureGate.Enabled(features.ContainerStopSignals) {
497+
if container.Lifecycle != nil && container.Lifecycle.StopSignal != nil {
498+
var signalValue runtimeapi.Signal
499+
signalStr := string(*container.Lifecycle.StopSignal)
500+
signalValue = signalNameToRuntimeEnum[signalStr]
501+
return &signalValue
502+
} else {
503+
return nil
504+
}
505+
}
506+
507+
return nil
508+
}
509+
510+
func runtimeSignalToString(signal runtimeapi.Signal) *v1.Signal {
511+
var convertedSignal v1.Signal
512+
for key, value := range signalNameToRuntimeEnum {
513+
if value == signal {
514+
convertedSignal = v1.Signal(key)
515+
}
516+
}
517+
518+
return &convertedSignal
519+
}

pkg/kubelet/kuberuntime/kuberuntime_container.go

+15
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ func (m *kubeGenericRuntimeManager) generateContainerConfig(ctx context.Context,
360360
return nil, cleanupAction, fmt.Errorf("create container log directory for container %s failed: %v", container.Name, err)
361361
}
362362
containerLogsPath := buildContainerLogsPath(container.Name, restartCount)
363+
stopsignal := getContainerConfigStopSignal(container)
363364
restartCountUint32 := uint32(restartCount)
364365
config := &runtimeapi.ContainerConfig{
365366
Metadata: &runtimeapi.ContainerMetadata{
@@ -381,6 +382,9 @@ func (m *kubeGenericRuntimeManager) generateContainerConfig(ctx context.Context,
381382
Tty: container.TTY,
382383
}
383384

385+
if stopsignal != nil {
386+
config.StopSignal = *stopsignal
387+
}
384388
// set platform specific configurations.
385389
if err := m.applyPlatformSpecificContainerConfig(config, container, pod, uid, username, nsTarget); err != nil {
386390
return nil, cleanupAction, err
@@ -668,6 +672,16 @@ func toKubeContainerStatus(status *runtimeapi.ContainerStatus, runtimeName strin
668672
cStatusUser = toKubeContainerUser(status.User)
669673
}
670674

675+
var cStatusStopSignal *v1.Signal
676+
if utilfeature.DefaultFeatureGate.Enabled(features.ContainerStopSignals) {
677+
signal := status.GetStopSignal().String()
678+
// Here Signal_RUNTIME_DEFAULT means that the runtime is not returning any StopSignal
679+
// This happens only when the container runtime version doesn't support StopSignal yet
680+
if signal != "" && signal != "RUNTIME_DEFAULT" {
681+
cStatusStopSignal = runtimeSignalToString(status.GetStopSignal())
682+
}
683+
}
684+
671685
cStatus := &kubecontainer.Status{
672686
ID: kubecontainer.ContainerID{
673687
Type: runtimeName,
@@ -684,6 +698,7 @@ func toKubeContainerStatus(status *runtimeapi.ContainerStatus, runtimeName strin
684698
CreatedAt: time.Unix(0, status.CreatedAt),
685699
Resources: cStatusResources,
686700
User: cStatusUser,
701+
StopSignal: cStatusStopSignal,
687702
}
688703

689704
if status.State != runtimeapi.ContainerState_CONTAINER_CREATED {

pkg/kubelet/kuberuntime/kuberuntime_container_linux_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func makeExpectedConfig(m *kubeGenericRuntimeManager, pod *v1.Pod, containerInde
5555
restartCount := 0
5656
opts, _, _ := m.runtimeHelper.GenerateRunContainerOptions(ctx, pod, container, podIP, []string{podIP}, nil)
5757
containerLogsPath := buildContainerLogsPath(container.Name, restartCount)
58+
stopsignal := getContainerConfigStopSignal(container)
5859
restartCountUint32 := uint32(restartCount)
5960
envs := make([]*runtimeapi.KeyValue, len(opts.Envs))
6061

@@ -81,6 +82,9 @@ func makeExpectedConfig(m *kubeGenericRuntimeManager, pod *v1.Pod, containerInde
8182
Envs: envs,
8283
CDIDevices: makeCDIDevices(opts),
8384
}
85+
if stopsignal != nil {
86+
expectedConfig.StopSignal = *stopsignal
87+
}
8488
return expectedConfig
8589
}
8690

0 commit comments

Comments
 (0)