From 2fd1595d1cff0c0f03d91e5be9e6a0e8958dc361 Mon Sep 17 00:00:00 2001 From: Arunesh Dwivedi Date: Wed, 8 Jul 2026 15:03:44 +0000 Subject: [PATCH] feat: add TerminationGracePeriodSeconds support to liveness probe Addresses issue #15823. Adds validation and defaulting for the terminationGracePeriodSeconds field in liveness probes for Knative revisions. Changes: - pkg/apis/serving/k8s_validation.go: Added validation for terminationGracePeriodSeconds (must be non-negative) - pkg/apis/serving/v1/revision_defaults.go: Added defaulting function applyLivenessProbeDefaults that sets terminationGracePeriodSeconds=1 when liveness probe is configured but terminationGracePeriodSeconds is not set - Called applyLivenessProbeDefaults in RevisionSpec.applyDefault() The field was already allowed via ProbeMask in fieldmask.go (line 392), but lacked validation and defaulting. --- pkg/apis/serving/k8s_validation.go | 11 +++++++++++ pkg/apis/serving/v1/revision_defaults.go | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/pkg/apis/serving/k8s_validation.go b/pkg/apis/serving/k8s_validation.go index 5a8cff484cc9..459eacdc819d 100644 --- a/pkg/apis/serving/k8s_validation.go +++ b/pkg/apis/serving/k8s_validation.go @@ -925,6 +925,17 @@ func validateProbe(p *corev1.Probe, port *corev1.ContainerPort, isUserContainer } else if len(handlers) > 1 { errs = errs.Also(apis.ErrMultipleOneOf(handlers...)) } + + // Validate TerminationGracePeriodSeconds if set + if p.TerminationGracePeriodSeconds != nil { + if *p.TerminationGracePeriodSeconds < 0 { + errs = errs.Also(&apis.FieldError{ + Message: "terminationGracePeriodSeconds must be non-negative", + Paths: []string{"terminationGracePeriodSeconds"}, + }) + } + } + return errs } diff --git a/pkg/apis/serving/v1/revision_defaults.go b/pkg/apis/serving/v1/revision_defaults.go index f2014724bf45..1419a6b93986 100644 --- a/pkg/apis/serving/v1/revision_defaults.go +++ b/pkg/apis/serving/v1/revision_defaults.go @@ -138,6 +138,7 @@ func (rs *RevisionSpec) applyDefault(ctx context.Context, container *corev1.Cont } rs.applyReadinessProbeDefaults(container) rs.applyGRPCProbeDefaults(container) + rs.applyLivenessProbeDefaults(container) if rs.PodSpec.EnableServiceLinks == nil && apis.IsInCreate(ctx) { rs.PodSpec.EnableServiceLinks = cfg.Defaults.EnableServiceLinks @@ -203,6 +204,14 @@ func (*RevisionSpec) applyGRPCProbeDefaults(container *corev1.Container) { } } +// applyLivenessProbeDefaults applies default TerminationGracePeriodSeconds to liveness probe +func (*RevisionSpec) applyLivenessProbeDefaults(container *corev1.Container) { + if container.LivenessProbe != nil && container.LivenessProbe.TerminationGracePeriodSeconds == nil { + // Default to 1 second for liveness probe termination grace period + container.LivenessProbe.TerminationGracePeriodSeconds = ptr.Int64(1) + } +} + // Upgrade SecurityContext for this container and the Pod definition to use settings // for the `restricted` profile when the feature flag is enabled. // when the feature flag is enabled or AllowRootBounded: