Skip to content

Commit 0573705

Browse files
authored
Merge pull request #98 from oracle/readyness-probe-dns
Allow server Services to expose DNS before Pod is ready
2 parents 297b7d0 + 9c380eb commit 0573705

File tree

4 files changed

+38
-8
lines changed

4 files changed

+38
-8
lines changed

src/main/java/oracle/kubernetes/operator/Main.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import oracle.kubernetes.operator.helpers.ConfigMapHelper;
4343
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
4444
import oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo;
45+
import oracle.kubernetes.operator.helpers.HealthCheckHelper.KubernetesVersion;
4546
import oracle.kubernetes.operator.helpers.HealthCheckHelper;
4647
import oracle.kubernetes.operator.helpers.IngressHelper;
4748
import oracle.kubernetes.operator.helpers.PodHelper;
@@ -86,6 +87,7 @@ public class Main {
8687
private static Thread livenessThread = null;
8788
private static Map<String, DomainWatcher> domainWatchers = new HashMap<>();
8889
private static Map<String, PodWatcher> podWatchers = new HashMap<>();
90+
private static KubernetesVersion version = null;
8991

9092
private static final Engine engine = new Engine("operator");
9193

@@ -147,6 +149,7 @@ public static void main(String[] args) {
147149

148150
try {
149151
HealthCheckHelper healthCheck = new HealthCheckHelper(client, namespace, targetNamespaces);
152+
version = healthCheck.performK8sVersionCheck();
150153
healthCheck.performNonSecurityChecks();
151154
healthCheck.performSecurityChecks(serviceAccountName);
152155
} catch (ApiException e) {
@@ -442,7 +445,7 @@ private static void doCheckAndCreateDomainPresence(
442445
Fiber f = engine.createFiber();
443446
Packet p = new Packet();
444447

445-
p.getComponents().put(ProcessingConstants.DOMAIN_COMPONENT_NAME, Component.createFor(info));
448+
p.getComponents().put(ProcessingConstants.DOMAIN_COMPONENT_NAME, Component.createFor(info, version));
446449
p.put(ProcessingConstants.PRINCIPAL, principal);
447450

448451
if (explicitRestartAdmin) {

src/main/java/oracle/kubernetes/operator/helpers/HealthCheckHelper.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ public HealthCheckHelper(ClientHolder client, String operatorNamespace, Collecti
167167
*/
168168
public void performNonSecurityChecks() throws ApiException {
169169

170-
verifyK8sVersion();
171170
HashMap<String, Domain> domainUIDMap = verifyDomainUidUniqueness();
172171
verifyPersistentVolume(domainUIDMap);
173172
verifyDomainImage(domainUIDMap);
@@ -221,23 +220,40 @@ public void performSecurityChecks(String svcAccountName) throws ApiException {
221220
}
222221
}
223222

223+
/**
224+
* Major and minor version of Kubernetes API Server
225+
*
226+
*/
227+
public static class KubernetesVersion {
228+
public final int major;
229+
public final int minor;
230+
231+
public KubernetesVersion(int major, int minor) {
232+
this.major = major;
233+
this.minor = minor;
234+
}
235+
}
224236

225237
/**
226238
* Verify the k8s version.
227239
*
240+
* @return Major and minor version information
228241
* @throws ApiException exception for k8s API
229242
*/
230-
private void verifyK8sVersion() throws ApiException {
243+
public KubernetesVersion performK8sVersionCheck() throws ApiException {
231244

232245
// k8s version must be 1.7.5 or greater
233246
LOGGER.info(MessageKeys.VERIFY_K8S_MIN_VERSION);
234247
boolean k8sMinVersion = true;
235248
VersionInfo info = null;
249+
250+
int major = 0;
251+
int minor = 0;
236252
try {
237253
info = client.getVersionApiClient().getCode();
238254

239255
String gitVersion = info.getGitVersion();
240-
Integer major = Integer.parseInt(info.getMajor());
256+
major = Integer.parseInt(info.getMajor());
241257
if (major < 1) {
242258
k8sMinVersion = false;
243259
} else if (major == 1) {
@@ -248,10 +264,10 @@ private void verifyK8sVersion() throws ApiException {
248264
while( ! minor_string.chars().allMatch( Character::isDigit )) {
249265
minor_string = minor_string.substring(0, minor_string.length() -1);
250266
}
251-
Integer minor = Integer.parseInt(minor_string);
267+
minor = Integer.parseInt(minor_string);
252268
if (minor < 7) {
253269
k8sMinVersion = false;
254-
} else if (minor >= 7) {
270+
} else if (minor == 7) {
255271
// git version is of the form v1.7.5
256272
// Check the 3rd part of the version.
257273
String[] splitVersion = gitVersion.split("\\.");
@@ -272,6 +288,8 @@ private void verifyK8sVersion() throws ApiException {
272288
} catch (ApiException ae) {
273289
LOGGER.warning(MessageKeys.K8S_VERSION_CHECK_FAILURE, ae);
274290
}
291+
292+
return new KubernetesVersion(major, minor);
275293
}
276294

277295
/**

src/main/java/oracle/kubernetes/operator/helpers/ServiceHelper.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import oracle.kubernetes.operator.ProcessingConstants;
1010
import oracle.kubernetes.operator.domain.model.oracle.kubernetes.weblogic.domain.v1.Domain;
1111
import oracle.kubernetes.operator.domain.model.oracle.kubernetes.weblogic.domain.v1.DomainSpec;
12+
import oracle.kubernetes.operator.helpers.HealthCheckHelper.KubernetesVersion;
1213
import oracle.kubernetes.operator.logging.LoggingFacade;
1314
import oracle.kubernetes.operator.logging.LoggingFactory;
1415
import oracle.kubernetes.operator.logging.MessageKeys;
@@ -44,10 +45,11 @@ public ForServerStep(Step next) {
4445
@Override
4546
public NextAction apply(Packet packet) {
4647
DomainPresenceInfo info = packet.getSPI(DomainPresenceInfo.class);
48+
KubernetesVersion version = packet.getSPI(KubernetesVersion.class);
4749
String serverName = (String) packet.get(ProcessingConstants.SERVER_NAME);
4850
Integer port = (Integer) packet.get(ProcessingConstants.PORT);
4951
Integer nodePort = (Integer) packet.get(ProcessingConstants.NODE_PORT);
50-
52+
5153
Domain dom = info.getDomain();
5254
V1ObjectMeta meta = dom.getMetadata();
5355
DomainSpec spec = dom.getSpec();
@@ -70,13 +72,20 @@ public NextAction apply(Packet packet) {
7072
service.setMetadata(metadata);
7173

7274
AnnotationHelper.annotateWithDomain(metadata, dom);
75+
metadata.putAnnotationsItem("service.alpha.kubernetes.io/tolerate-unready-endpoints", "true");
7376

7477
V1ServiceSpec serviceSpec = new V1ServiceSpec();
7578
serviceSpec.setType(nodePort == null ? "ClusterIP" : "NodePort");
79+
7680
Map<String, String> selector = new HashMap<>();
7781
selector.put(LabelConstants.DOMAINUID_LABEL, weblogicDomainUID);
7882
selector.put(LabelConstants.SERVERNAME_LABEL, serverName);
7983
serviceSpec.setSelector(selector);
84+
85+
if (version != null && (version.major > 1 || (version.major == 1 && version.minor >= 8))) {
86+
serviceSpec.setPublishNotReadyAddresses(Boolean.TRUE);
87+
}
88+
8089
List<V1ServicePort> ports = new ArrayList<>();
8190
V1ServicePort servicePort = new V1ServicePort();
8291
servicePort.setPort(port);

src/main/java/oracle/kubernetes/operator/logging/LoggingFormatter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public String format(LogRecord record) {
110110
map.put(SOURCE_METHOD, sourceMethodName);
111111
map.put(TIME_IN_MILLIS, rawTime);
112112
// if message or throwable have new lines in them, we need to replace with JSON newline control character \n
113-
map.put(MESSAGE, message.replaceAll("\n", "\\\n"));
113+
map.put(MESSAGE, message != null ? message.replaceAll("\n", "\\\n") : "");
114114
map.put(EXCEPTION, throwable.replaceAll("\n", "\\\n"));
115115
map.put(RESPONSE_CODE, code);
116116
map.put(RESPONSE_HEADERS, headers);

0 commit comments

Comments
 (0)