mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-02 08:17:26 +00:00
startupProbe: API changes
This commit is contained in:
parent
4495d09282
commit
e4d26f845e
@ -383,6 +383,14 @@ func dropDisabledFields(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !utilfeature.DefaultFeatureGate.Enabled(features.StartupProbe) && !startupProbeInUse(oldPodSpec) {
|
||||||
|
// drop startupProbe from all containers if the feature is disabled
|
||||||
|
VisitContainers(podSpec, func(c *api.Container) bool {
|
||||||
|
c.StartupProbe = nil
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
dropDisabledVolumeDevicesFields(podSpec, oldPodSpec)
|
dropDisabledVolumeDevicesFields(podSpec, oldPodSpec)
|
||||||
|
|
||||||
dropDisabledRunAsGroupField(podSpec, oldPodSpec)
|
dropDisabledRunAsGroupField(podSpec, oldPodSpec)
|
||||||
@ -819,6 +827,24 @@ func subpathExprInUse(podSpec *api.PodSpec) bool {
|
|||||||
return inUse
|
return inUse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// startupProbeInUse returns true if the pod spec is non-nil and has a container that has a startupProbe defined
|
||||||
|
func startupProbeInUse(podSpec *api.PodSpec) bool {
|
||||||
|
if podSpec == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var inUse bool
|
||||||
|
VisitContainers(podSpec, func(c *api.Container) bool {
|
||||||
|
if c.StartupProbe != nil {
|
||||||
|
inUse = true
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
return inUse
|
||||||
|
}
|
||||||
|
|
||||||
// csiInUse returns true if any pod's spec include inline CSI volumes.
|
// csiInUse returns true if any pod's spec include inline CSI volumes.
|
||||||
func csiInUse(podSpec *api.PodSpec) bool {
|
func csiInUse(podSpec *api.PodSpec) bool {
|
||||||
if podSpec == nil {
|
if podSpec == nil {
|
||||||
|
@ -1924,7 +1924,7 @@ type Probe struct {
|
|||||||
// +optional
|
// +optional
|
||||||
PeriodSeconds int32
|
PeriodSeconds int32
|
||||||
// Minimum consecutive successes for the probe to be considered successful after having failed.
|
// Minimum consecutive successes for the probe to be considered successful after having failed.
|
||||||
// Must be 1 for liveness.
|
// Must be 1 for liveness and startup.
|
||||||
// +optional
|
// +optional
|
||||||
SuccessThreshold int32
|
SuccessThreshold int32
|
||||||
// Minimum consecutive failures for the probe to be considered failed after having succeeded.
|
// Minimum consecutive failures for the probe to be considered failed after having succeeded.
|
||||||
@ -2042,6 +2042,8 @@ type Container struct {
|
|||||||
// +optional
|
// +optional
|
||||||
ReadinessProbe *Probe
|
ReadinessProbe *Probe
|
||||||
// +optional
|
// +optional
|
||||||
|
StartupProbe *Probe
|
||||||
|
// +optional
|
||||||
Lifecycle *Lifecycle
|
Lifecycle *Lifecycle
|
||||||
// Required.
|
// Required.
|
||||||
// +optional
|
// +optional
|
||||||
@ -2090,7 +2092,7 @@ type Lifecycle struct {
|
|||||||
// +optional
|
// +optional
|
||||||
PostStart *Handler
|
PostStart *Handler
|
||||||
// PreStop is called immediately before a container is terminated due to an
|
// PreStop is called immediately before a container is terminated due to an
|
||||||
// API request or management event such as liveness probe failure,
|
// API request or management event such as liveness/startup probe failure,
|
||||||
// preemption, resource contention, etc. The handler is not called if the
|
// preemption, resource contention, etc. The handler is not called if the
|
||||||
// container crashes or exits. The reason for termination is passed to the
|
// container crashes or exits. The reason for termination is passed to the
|
||||||
// handler. The Pod's termination grace period countdown begins before the
|
// handler. The Pod's termination grace period countdown begins before the
|
||||||
@ -2174,6 +2176,7 @@ type ContainerStatus struct {
|
|||||||
ImageID string
|
ImageID string
|
||||||
// +optional
|
// +optional
|
||||||
ContainerID string
|
ContainerID string
|
||||||
|
Started *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// PodPhase is a label for the condition of a pod at the current time.
|
// PodPhase is a label for the condition of a pod at the current time.
|
||||||
@ -2936,6 +2939,9 @@ type EphemeralContainerCommon struct {
|
|||||||
// Probes are not allowed for ephemeral containers.
|
// Probes are not allowed for ephemeral containers.
|
||||||
// +optional
|
// +optional
|
||||||
ReadinessProbe *Probe
|
ReadinessProbe *Probe
|
||||||
|
// Probes are not allowed for ephemeral containers.
|
||||||
|
// +optional
|
||||||
|
StartupProbe *Probe
|
||||||
// Lifecycle is not allowed for ephemeral containers.
|
// Lifecycle is not allowed for ephemeral containers.
|
||||||
// +optional
|
// +optional
|
||||||
Lifecycle *Lifecycle
|
Lifecycle *Lifecycle
|
||||||
|
@ -2696,6 +2696,9 @@ func validateInitContainers(containers, otherContainers []core.Container, device
|
|||||||
if ctr.ReadinessProbe != nil {
|
if ctr.ReadinessProbe != nil {
|
||||||
allErrs = append(allErrs, field.Invalid(idxPath.Child("readinessProbe"), ctr.ReadinessProbe, "must not be set for init containers"))
|
allErrs = append(allErrs, field.Invalid(idxPath.Child("readinessProbe"), ctr.ReadinessProbe, "must not be set for init containers"))
|
||||||
}
|
}
|
||||||
|
if ctr.StartupProbe != nil {
|
||||||
|
allErrs = append(allErrs, field.Invalid(idxPath.Child("startupProbe"), ctr.StartupProbe, "must not be set for init containers"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
@ -2738,6 +2741,11 @@ func validateContainers(containers []core.Container, isInitContainers bool, volu
|
|||||||
if ctr.LivenessProbe != nil && ctr.LivenessProbe.SuccessThreshold != 1 {
|
if ctr.LivenessProbe != nil && ctr.LivenessProbe.SuccessThreshold != 1 {
|
||||||
allErrs = append(allErrs, field.Invalid(idxPath.Child("livenessProbe", "successThreshold"), ctr.LivenessProbe.SuccessThreshold, "must be 1"))
|
allErrs = append(allErrs, field.Invalid(idxPath.Child("livenessProbe", "successThreshold"), ctr.LivenessProbe.SuccessThreshold, "must be 1"))
|
||||||
}
|
}
|
||||||
|
allErrs = append(allErrs, validateProbe(ctr.StartupProbe, idxPath.Child("startupProbe"))...)
|
||||||
|
// Startup-specific validation
|
||||||
|
if ctr.StartupProbe != nil && ctr.StartupProbe.SuccessThreshold != 1 {
|
||||||
|
allErrs = append(allErrs, field.Invalid(idxPath.Child("startupProbe", "successThreshold"), ctr.StartupProbe.SuccessThreshold, "must be 1"))
|
||||||
|
}
|
||||||
|
|
||||||
switch ctr.TerminationMessagePolicy {
|
switch ctr.TerminationMessagePolicy {
|
||||||
case core.TerminationMessageReadFile, core.TerminationMessageFallbackToLogsOnError:
|
case core.TerminationMessageReadFile, core.TerminationMessageFallbackToLogsOnError:
|
||||||
|
@ -489,6 +489,12 @@ const (
|
|||||||
//
|
//
|
||||||
// Schedule pods evenly across available topology domains.
|
// Schedule pods evenly across available topology domains.
|
||||||
EvenPodsSpread featuregate.Feature = "EvenPodsSpread"
|
EvenPodsSpread featuregate.Feature = "EvenPodsSpread"
|
||||||
|
|
||||||
|
// owner: @matthyx
|
||||||
|
// alpha: v1.16
|
||||||
|
//
|
||||||
|
// Enables the startupProbe in kubelet worker.
|
||||||
|
StartupProbe featuregate.Feature = "StartupProbe"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -569,6 +575,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
|
|||||||
IPv6DualStack: {Default: false, PreRelease: featuregate.Alpha},
|
IPv6DualStack: {Default: false, PreRelease: featuregate.Alpha},
|
||||||
EndpointSlice: {Default: false, PreRelease: featuregate.Alpha},
|
EndpointSlice: {Default: false, PreRelease: featuregate.Alpha},
|
||||||
EvenPodsSpread: {Default: false, PreRelease: featuregate.Alpha},
|
EvenPodsSpread: {Default: false, PreRelease: featuregate.Alpha},
|
||||||
|
StartupProbe: {Default: false, PreRelease: featuregate.Alpha},
|
||||||
|
|
||||||
// inherited features from generic apiserver, relisted here to get a conflict if it is changed
|
// inherited features from generic apiserver, relisted here to get a conflict if it is changed
|
||||||
// unintentionally on either side:
|
// unintentionally on either side:
|
||||||
@ -592,6 +599,6 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
|
|||||||
|
|
||||||
// features that enable backwards compatibility but are scheduled to be removed
|
// features that enable backwards compatibility but are scheduled to be removed
|
||||||
// ...
|
// ...
|
||||||
HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha},
|
HPAScaleToZero: {Default: false, PreRelease: featuregate.Alpha},
|
||||||
LegacyNodeRoleBehavior: {Default: true, PreRelease: featuregate.Alpha},
|
LegacyNodeRoleBehavior: {Default: true, PreRelease: featuregate.Alpha},
|
||||||
}
|
}
|
||||||
|
@ -2025,7 +2025,7 @@ type Probe struct {
|
|||||||
// +optional
|
// +optional
|
||||||
PeriodSeconds int32 `json:"periodSeconds,omitempty" protobuf:"varint,4,opt,name=periodSeconds"`
|
PeriodSeconds int32 `json:"periodSeconds,omitempty" protobuf:"varint,4,opt,name=periodSeconds"`
|
||||||
// Minimum consecutive successes for the probe to be considered successful after having failed.
|
// Minimum consecutive successes for the probe to be considered successful after having failed.
|
||||||
// Defaults to 1. Must be 1 for liveness. Minimum value is 1.
|
// Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1.
|
||||||
// +optional
|
// +optional
|
||||||
SuccessThreshold int32 `json:"successThreshold,omitempty" protobuf:"varint,5,opt,name=successThreshold"`
|
SuccessThreshold int32 `json:"successThreshold,omitempty" protobuf:"varint,5,opt,name=successThreshold"`
|
||||||
// Minimum consecutive failures for the probe to be considered failed after having succeeded.
|
// Minimum consecutive failures for the probe to be considered failed after having succeeded.
|
||||||
@ -2196,6 +2196,16 @@ type Container struct {
|
|||||||
// More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
|
// More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
|
||||||
// +optional
|
// +optional
|
||||||
ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
|
ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
|
||||||
|
// StartupProbe indicates that the Pod has successfully initialized.
|
||||||
|
// If specified, no other probes are executed until this completes successfully.
|
||||||
|
// If this probe fails, the Pod will be restarted, just as if the livenessProbe failed.
|
||||||
|
// This can be used to provide different probe parameters at the beginning of a Pod's lifecycle,
|
||||||
|
// when it might take a long time to load data or warm a cache, than during steady-state operation.
|
||||||
|
// This cannot be updated.
|
||||||
|
// This is an alpha feature enabled by the StartupProbe feature flag.
|
||||||
|
// More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
|
||||||
|
// +optional
|
||||||
|
StartupProbe *Probe `json:"startupProbe,omitempty" protobuf:"bytes,22,opt,name=startupProbe"`
|
||||||
// Actions that the management system should take in response to container lifecycle events.
|
// Actions that the management system should take in response to container lifecycle events.
|
||||||
// Cannot be updated.
|
// Cannot be updated.
|
||||||
// +optional
|
// +optional
|
||||||
@ -2282,7 +2292,7 @@ type Lifecycle struct {
|
|||||||
// +optional
|
// +optional
|
||||||
PostStart *Handler `json:"postStart,omitempty" protobuf:"bytes,1,opt,name=postStart"`
|
PostStart *Handler `json:"postStart,omitempty" protobuf:"bytes,1,opt,name=postStart"`
|
||||||
// PreStop is called immediately before a container is terminated due to an
|
// PreStop is called immediately before a container is terminated due to an
|
||||||
// API request or management event such as liveness probe failure,
|
// API request or management event such as liveness/startup probe failure,
|
||||||
// preemption, resource contention, etc. The handler is not called if the
|
// preemption, resource contention, etc. The handler is not called if the
|
||||||
// container crashes or exits. The reason for termination is passed to the
|
// container crashes or exits. The reason for termination is passed to the
|
||||||
// handler. The Pod's termination grace period countdown begins before the
|
// handler. The Pod's termination grace period countdown begins before the
|
||||||
@ -2390,6 +2400,12 @@ type ContainerStatus struct {
|
|||||||
// Container's ID in the format 'docker://<container_id>'.
|
// Container's ID in the format 'docker://<container_id>'.
|
||||||
// +optional
|
// +optional
|
||||||
ContainerID string `json:"containerID,omitempty" protobuf:"bytes,8,opt,name=containerID"`
|
ContainerID string `json:"containerID,omitempty" protobuf:"bytes,8,opt,name=containerID"`
|
||||||
|
// Specifies whether the container has passed its startup probe.
|
||||||
|
// Initialized as false, becomes true after startupProbe is considered successful.
|
||||||
|
// Resets to false when the container is restarted, or if kubelet loses state temporarily.
|
||||||
|
// Is always true when no startupProbe is defined.
|
||||||
|
// +optional
|
||||||
|
Started *bool `json:"started,omitempty" protobuf:"varint,9,opt,name=started"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// PodPhase is a label for the condition of a pod at the current time.
|
// PodPhase is a label for the condition of a pod at the current time.
|
||||||
@ -2825,7 +2841,7 @@ type PodSpec struct {
|
|||||||
// init container fails, the pod is considered to have failed and is handled according
|
// init container fails, the pod is considered to have failed and is handled according
|
||||||
// to its restartPolicy. The name for an init container or normal container must be
|
// to its restartPolicy. The name for an init container or normal container must be
|
||||||
// unique among all containers.
|
// unique among all containers.
|
||||||
// Init containers may not have Lifecycle actions, Readiness probes, or Liveness probes.
|
// Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes.
|
||||||
// The resourceRequirements of an init container are taken into account during scheduling
|
// The resourceRequirements of an init container are taken into account during scheduling
|
||||||
// by finding the highest request/limit for each resource type, and then using the max of
|
// by finding the highest request/limit for each resource type, and then using the max of
|
||||||
// of that value or the sum of the normal containers. Limits are applied to init containers
|
// of that value or the sum of the normal containers. Limits are applied to init containers
|
||||||
@ -3293,6 +3309,9 @@ type EphemeralContainerCommon struct {
|
|||||||
// Probes are not allowed for ephemeral containers.
|
// Probes are not allowed for ephemeral containers.
|
||||||
// +optional
|
// +optional
|
||||||
ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
|
ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"`
|
||||||
|
// Probes are not allowed for ephemeral containers.
|
||||||
|
// +optional
|
||||||
|
StartupProbe *Probe `json:"startupProbe,omitempty" protobuf:"bytes,22,opt,name=startupProbe"`
|
||||||
// Lifecycle is not allowed for ephemeral containers.
|
// Lifecycle is not allowed for ephemeral containers.
|
||||||
// +optional
|
// +optional
|
||||||
Lifecycle *Lifecycle `json:"lifecycle,omitempty" protobuf:"bytes,12,opt,name=lifecycle"`
|
Lifecycle *Lifecycle `json:"lifecycle,omitempty" protobuf:"bytes,12,opt,name=lifecycle"`
|
||||||
|
@ -1707,6 +1707,10 @@ func describeContainerProbe(container corev1.Container, w PrefixWriter) {
|
|||||||
probe := DescribeProbe(container.ReadinessProbe)
|
probe := DescribeProbe(container.ReadinessProbe)
|
||||||
w.Write(LEVEL_2, "Readiness:\t%s\n", probe)
|
w.Write(LEVEL_2, "Readiness:\t%s\n", probe)
|
||||||
}
|
}
|
||||||
|
if container.StartupProbe != nil {
|
||||||
|
probe := DescribeProbe(container.StartupProbe)
|
||||||
|
w.Write(LEVEL_2, "Startup:\t%s\n", probe)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func describeContainerVolumes(container corev1.Container, w PrefixWriter) {
|
func describeContainerVolumes(container corev1.Container, w PrefixWriter) {
|
||||||
|
Loading…
Reference in New Issue
Block a user