Skip to content

Commit d6e0af8

Browse files
authored
Merge pull request #31693 from Sgitario/29482
Support of startup probes in Kubernetes/OpenShift/Knative manifests
2 parents 90a11d6 + e60ec35 commit d6e0af8

File tree

15 files changed

+173
-8
lines changed

15 files changed

+173
-8
lines changed

extensions/kubernetes/kind/deployment/src/main/java/io/quarkus/kind/deployment/KindProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import io.quarkus.kubernetes.spi.KubernetesEnvBuildItem;
3838
import io.quarkus.kubernetes.spi.KubernetesHealthLivenessPathBuildItem;
3939
import io.quarkus.kubernetes.spi.KubernetesHealthReadinessPathBuildItem;
40+
import io.quarkus.kubernetes.spi.KubernetesHealthStartupPathBuildItem;
4041
import io.quarkus.kubernetes.spi.KubernetesInitContainerBuildItem;
4142
import io.quarkus.kubernetes.spi.KubernetesJobBuildItem;
4243
import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem;
@@ -108,6 +109,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
108109
Optional<KubernetesProbePortNameBuildItem> portName,
109110
Optional<KubernetesHealthLivenessPathBuildItem> livenessPath,
110111
Optional<KubernetesHealthReadinessPathBuildItem> readinessPath,
112+
Optional<KubernetesHealthStartupPathBuildItem> startupPath,
111113
List<KubernetesRoleBuildItem> roles,
112114
List<KubernetesRoleBindingBuildItem> roleBindings,
113115
Optional<CustomProjectRootBuildItem> customProjectRoot) {
@@ -117,6 +119,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
117119
portName,
118120
livenessPath,
119121
readinessPath,
122+
startupPath,
120123
roles, roleBindings, customProjectRoot);
121124
}
122125

extensions/kubernetes/minikube/deployment/src/main/java/io/quarkus/minikube/deployment/MinikubeProcessor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.quarkus.kubernetes.spi.KubernetesEnvBuildItem;
3535
import io.quarkus.kubernetes.spi.KubernetesHealthLivenessPathBuildItem;
3636
import io.quarkus.kubernetes.spi.KubernetesHealthReadinessPathBuildItem;
37+
import io.quarkus.kubernetes.spi.KubernetesHealthStartupPathBuildItem;
3738
import io.quarkus.kubernetes.spi.KubernetesInitContainerBuildItem;
3839
import io.quarkus.kubernetes.spi.KubernetesJobBuildItem;
3940
import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem;
@@ -104,6 +105,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
104105
Optional<KubernetesProbePortNameBuildItem> portName,
105106
Optional<KubernetesHealthLivenessPathBuildItem> livenessPath,
106107
Optional<KubernetesHealthReadinessPathBuildItem> readinessPath,
108+
Optional<KubernetesHealthStartupPathBuildItem> startupPath,
107109
List<KubernetesRoleBuildItem> roles,
108110
List<KubernetesRoleBindingBuildItem> roleBindings,
109111
Optional<CustomProjectRootBuildItem> customProjectRoot) {
@@ -113,6 +115,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
113115
portName,
114116
livenessPath,
115117
readinessPath,
118+
startupPath,
116119
roles, roleBindings, customProjectRoot);
117120
}
118121
}

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/DevClusterHelper.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import io.quarkus.kubernetes.spi.KubernetesEnvBuildItem;
3838
import io.quarkus.kubernetes.spi.KubernetesHealthLivenessPathBuildItem;
3939
import io.quarkus.kubernetes.spi.KubernetesHealthReadinessPathBuildItem;
40+
import io.quarkus.kubernetes.spi.KubernetesHealthStartupPathBuildItem;
4041
import io.quarkus.kubernetes.spi.KubernetesInitContainerBuildItem;
4142
import io.quarkus.kubernetes.spi.KubernetesJobBuildItem;
4243
import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem;
@@ -67,6 +68,7 @@ public static List<DecoratorBuildItem> createDecorators(String clusterKind,
6768
Optional<KubernetesProbePortNameBuildItem> portName,
6869
Optional<KubernetesHealthLivenessPathBuildItem> livenessPath,
6970
Optional<KubernetesHealthReadinessPathBuildItem> readinessPath,
71+
Optional<KubernetesHealthStartupPathBuildItem> startupPath,
7072
List<KubernetesRoleBuildItem> roles,
7173
List<KubernetesRoleBindingBuildItem> roleBindings,
7274
Optional<CustomProjectRootBuildItem> customProjectRoot) {
@@ -80,7 +82,7 @@ public static List<DecoratorBuildItem> createDecorators(String clusterKind,
8082
result.addAll(KubernetesCommonHelper.createDecorators(project, clusterKind, name, config,
8183
metricsConfiguration,
8284
annotations, labels, command,
83-
port, livenessPath, readinessPath, roles, roleBindings));
85+
port, livenessPath, readinessPath, startupPath, roles, roleBindings));
8486

8587
image.ifPresent(i -> {
8688
result.add(new DecoratorBuildItem(clusterKind, new ApplyContainerImageDecorator(name, i.getImage())));
@@ -127,6 +129,10 @@ public static List<DecoratorBuildItem> createDecorators(String clusterKind,
127129
KubernetesCommonHelper.createProbeHttpPortDecorator(name, clusterKind, "readinessProbe", config.readinessProbe,
128130
portName,
129131
ports));
132+
result.add(
133+
KubernetesCommonHelper.createProbeHttpPortDecorator(name, clusterKind, "startupProbe", config.startupProbe,
134+
portName,
135+
ports));
130136

131137
// Handle init Containers
132138
result.addAll(KubernetesCommonHelper.createInitContainerDecorators(clusterKind, name, initContainers, result));

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KnativeConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,12 @@ public class KnativeConfig implements PlatformConfiguration {
126126
@ConfigItem
127127
ProbeConfig readinessProbe;
128128

129+
/**
130+
* The startup probe
131+
*/
132+
@ConfigItem
133+
ProbeConfig startupProbe;
134+
129135
/**
130136
* Prometheus configuration
131137
*/
@@ -324,6 +330,10 @@ public ProbeConfig getReadinessProbe() {
324330
return readinessProbe;
325331
}
326332

333+
public ProbeConfig getStartupProbe() {
334+
return startupProbe;
335+
}
336+
327337
public PrometheusConfig getPrometheusConfig() {
328338
return prometheus;
329339
}

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KnativeProcessor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import io.quarkus.kubernetes.spi.KubernetesEnvBuildItem;
5858
import io.quarkus.kubernetes.spi.KubernetesHealthLivenessPathBuildItem;
5959
import io.quarkus.kubernetes.spi.KubernetesHealthReadinessPathBuildItem;
60+
import io.quarkus.kubernetes.spi.KubernetesHealthStartupPathBuildItem;
6061
import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem;
6162
import io.quarkus.kubernetes.spi.KubernetesPortBuildItem;
6263
import io.quarkus.kubernetes.spi.KubernetesResourceMetadataBuildItem;
@@ -141,6 +142,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
141142
List<KubernetesPortBuildItem> ports,
142143
Optional<KubernetesHealthLivenessPathBuildItem> livenessPath,
143144
Optional<KubernetesHealthReadinessPathBuildItem> readinessPath,
145+
Optional<KubernetesHealthStartupPathBuildItem> startupProbePath,
144146
List<KubernetesRoleBuildItem> roles,
145147
List<KubernetesRoleBindingBuildItem> roleBindings,
146148
Optional<CustomProjectRootBuildItem> customProjectRoot,
@@ -157,7 +159,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
157159
packageConfig);
158160
Optional<Port> port = KubernetesCommonHelper.getPort(ports, config, "http");
159161
result.addAll(KubernetesCommonHelper.createDecorators(project, KNATIVE, name, config, metricsConfiguration, annotations,
160-
labels, command, port, livenessPath, readinessPath, roles, roleBindings));
162+
labels, command, port, livenessPath, readinessPath, startupProbePath, roles, roleBindings));
161163

162164
image.ifPresent(i -> {
163165
result.add(new DecoratorBuildItem(KNATIVE, new ApplyContainerImageDecorator(name, i.getImage())));

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesCommonHelper.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import io.dekorate.kubernetes.decorator.AddRoleBindingResourceDecorator;
4848
import io.dekorate.kubernetes.decorator.AddSecretVolumeDecorator;
4949
import io.dekorate.kubernetes.decorator.AddServiceAccountResourceDecorator;
50+
import io.dekorate.kubernetes.decorator.AddStartupProbeDecorator;
5051
import io.dekorate.kubernetes.decorator.ApplicationContainerDecorator;
5152
import io.dekorate.kubernetes.decorator.ApplyArgsDecorator;
5253
import io.dekorate.kubernetes.decorator.ApplyCommandDecorator;
@@ -80,6 +81,7 @@
8081
import io.quarkus.kubernetes.spi.KubernetesCommandBuildItem;
8182
import io.quarkus.kubernetes.spi.KubernetesHealthLivenessPathBuildItem;
8283
import io.quarkus.kubernetes.spi.KubernetesHealthReadinessPathBuildItem;
84+
import io.quarkus.kubernetes.spi.KubernetesHealthStartupPathBuildItem;
8385
import io.quarkus.kubernetes.spi.KubernetesInitContainerBuildItem;
8486
import io.quarkus.kubernetes.spi.KubernetesJobBuildItem;
8587
import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem;
@@ -184,6 +186,7 @@ public static List<DecoratorBuildItem> createDecorators(Optional<Project> projec
184186
Optional<Port> port,
185187
Optional<KubernetesHealthLivenessPathBuildItem> livenessProbePath,
186188
Optional<KubernetesHealthReadinessPathBuildItem> readinessProbePath,
189+
Optional<KubernetesHealthStartupPathBuildItem> startupPath,
187190
List<KubernetesRoleBuildItem> roles,
188191
List<KubernetesRoleBindingBuildItem> roleBindings) {
189192
List<DecoratorBuildItem> result = new ArrayList<>();
@@ -201,7 +204,7 @@ public static List<DecoratorBuildItem> createDecorators(Optional<Project> projec
201204
//Handle Probes
202205
if (!port.isEmpty()) {
203206
result.addAll(createProbeDecorators(name, target, config.getLivenessProbe(), config.getReadinessProbe(),
204-
livenessProbePath, readinessProbePath));
207+
config.getStartupProbe(), livenessProbePath, readinessProbePath, startupPath));
205208
}
206209

207210
//Handle RBAC
@@ -708,7 +711,7 @@ private static List<DecoratorBuildItem> createAnnotationDecorators(Optional<Proj
708711
*
709712
* @param name The name of the deployment / container.
710713
* @param target The deployment target
711-
* @param the probe kind (e.g. readinessProbe, livenessProbe etc)
714+
* @param probeKind The probe kind (e.g. readinessProbe, livenessProbe etc)
712715
* @param portName the probe port name build item
713716
* @paramt ports a list of kubernetes port build items
714717
* @return a decorator for configures the port of the http action of the probe.
@@ -740,11 +743,14 @@ public static DecoratorBuildItem createProbeHttpPortDecorator(String name, Strin
740743
*/
741744
private static List<DecoratorBuildItem> createProbeDecorators(String name, String target, ProbeConfig livenessProbe,
742745
ProbeConfig readinessProbe,
746+
ProbeConfig startupProbe,
743747
Optional<KubernetesHealthLivenessPathBuildItem> livenessPath,
744-
Optional<KubernetesHealthReadinessPathBuildItem> readinessPath) {
748+
Optional<KubernetesHealthReadinessPathBuildItem> readinessPath,
749+
Optional<KubernetesHealthStartupPathBuildItem> startupPath) {
745750
List<DecoratorBuildItem> result = new ArrayList<>();
746751
createLivenessProbe(name, target, livenessProbe, livenessPath).ifPresent(d -> result.add(d));
747752
createReadinessProbe(name, target, readinessProbe, readinessPath).ifPresent(d -> result.add(d));
753+
createStartupProbe(name, target, startupProbe, startupPath).ifPresent(d -> result.add(d));
748754
return result;
749755
}
750756

@@ -772,6 +778,18 @@ private static Optional<DecoratorBuildItem> createReadinessProbe(String name, St
772778
return Optional.empty();
773779
}
774780

781+
private static Optional<DecoratorBuildItem> createStartupProbe(String name, String target, ProbeConfig startupProbe,
782+
Optional<KubernetesHealthStartupPathBuildItem> startupPath) {
783+
if (startupProbe.hasUserSuppliedAction()) {
784+
return Optional.of(new DecoratorBuildItem(target,
785+
new AddStartupProbeDecorator(name, ProbeConverter.convert(startupProbe))));
786+
} else if (startupPath.isPresent()) {
787+
return Optional.of(new DecoratorBuildItem(target, new AddStartupProbeDecorator(name,
788+
ProbeConverter.builder(startupProbe).withHttpActionPath(startupPath.get().getPath()).build())));
789+
}
790+
return Optional.empty();
791+
}
792+
775793
private static Map<String, Integer> verifyPorts(List<KubernetesPortBuildItem> kubernetesPortBuildItems) {
776794
final Map<String, Integer> result = new HashMap<>();
777795
final Set<Integer> usedPorts = new HashSet<>();

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ public enum DeploymentResourceKind {
163163
@ConfigItem
164164
ProbeConfig readinessProbe;
165165

166+
/**
167+
* The startup probe
168+
*/
169+
@ConfigItem
170+
ProbeConfig startupProbe;
171+
166172
/**
167173
* Prometheus configuration
168174
*/
@@ -480,6 +486,10 @@ public ProbeConfig getReadinessProbe() {
480486
return readinessProbe;
481487
}
482488

489+
public ProbeConfig getStartupProbe() {
490+
return startupProbe;
491+
}
492+
483493
public PrometheusConfig getPrometheusConfig() {
484494
return prometheus;
485495
}

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/OpenshiftConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,12 @@ public static enum DeploymentResourceKind {
194194
@ConfigItem
195195
ProbeConfig readinessProbe;
196196

197+
/**
198+
* The startup probe
199+
*/
200+
@ConfigItem
201+
ProbeConfig startupProbe;
202+
197203
/**
198204
* Prometheus configuration
199205
*/
@@ -417,6 +423,10 @@ public ProbeConfig getReadinessProbe() {
417423
return readinessProbe;
418424
}
419425

426+
public ProbeConfig getStartupProbe() {
427+
return startupProbe;
428+
}
429+
420430
public PrometheusConfig getPrometheusConfig() {
421431
return prometheus;
422432
}

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/OpenshiftProcessor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import io.quarkus.kubernetes.spi.KubernetesEnvBuildItem;
5757
import io.quarkus.kubernetes.spi.KubernetesHealthLivenessPathBuildItem;
5858
import io.quarkus.kubernetes.spi.KubernetesHealthReadinessPathBuildItem;
59+
import io.quarkus.kubernetes.spi.KubernetesHealthStartupPathBuildItem;
5960
import io.quarkus.kubernetes.spi.KubernetesInitContainerBuildItem;
6061
import io.quarkus.kubernetes.spi.KubernetesJobBuildItem;
6162
import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem;
@@ -183,6 +184,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
183184
List<KubernetesPortBuildItem> ports,
184185
Optional<KubernetesHealthLivenessPathBuildItem> livenessPath,
185186
Optional<KubernetesHealthReadinessPathBuildItem> readinessPath,
187+
Optional<KubernetesHealthStartupPathBuildItem> startupPath,
186188
List<KubernetesRoleBuildItem> roles,
187189
List<KubernetesRoleBindingBuildItem> roleBindings,
188190
Optional<CustomProjectRootBuildItem> customProjectRoot,
@@ -202,7 +204,7 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
202204
result.addAll(KubernetesCommonHelper.createDecorators(project, OPENSHIFT, name, config,
203205
metricsConfiguration,
204206
annotations, labels, command,
205-
port, livenessPath, readinessPath, roles, roleBindings));
207+
port, livenessPath, readinessPath, startupPath, roles, roleBindings));
206208

207209
if (config.flavor == v3) {
208210
//Openshift 3.x doesn't recognize 'app.kubernetes.io/name', it uses 'app' instead.
@@ -309,6 +311,10 @@ public List<DecoratorBuildItem> createDecorators(ApplicationInfoBuildItem applic
309311
KubernetesCommonHelper.createProbeHttpPortDecorator(name, OPENSHIFT, "readinessProbe", config.readinessProbe,
310312
portName,
311313
ports));
314+
result.add(
315+
KubernetesCommonHelper.createProbeHttpPortDecorator(name, OPENSHIFT, "startupProbe", config.startupProbe,
316+
portName,
317+
ports));
312318

313319
// Handle non-openshift builds
314320
if (deploymentKind == DeploymentResourceKind.DeploymentConfig

extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/PlatformConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ public interface PlatformConfiguration extends EnvVarHolder {
5050

5151
ProbeConfig getReadinessProbe();
5252

53+
ProbeConfig getStartupProbe();
54+
5355
PrometheusConfig getPrometheusConfig();
5456

5557
Map<String, MountConfig> getMounts();

0 commit comments

Comments
 (0)