mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	startupProbe: API changes
This commit is contained in:
		@@ -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:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user