[BAEL-4863] Article Code (#10656)
* [BAEL-4863] Inicial code * [BAEL-4863] Article code
This commit is contained in:
parent
73d1e79f8f
commit
42e793aa7f
@ -0,0 +1,72 @@
|
|||||||
|
package com.baeldung.kubernetes.intro;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
import io.kubernetes.client.openapi.ApiClient;
|
||||||
|
import io.kubernetes.client.openapi.ApiException;
|
||||||
|
import io.kubernetes.client.openapi.apis.CoreV1Api;
|
||||||
|
import io.kubernetes.client.openapi.models.V1ObjectMeta;
|
||||||
|
import io.kubernetes.client.openapi.models.V1Pod;
|
||||||
|
import io.kubernetes.client.util.Config;
|
||||||
|
import io.kubernetes.client.util.Watch;
|
||||||
|
import io.kubernetes.client.util.Watch.Response;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.logging.HttpLoggingInterceptor;
|
||||||
|
|
||||||
|
public class WatchPods {
|
||||||
|
|
||||||
|
private static Logger log = LoggerFactory.getLogger(WatchPods.class);
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
|
ApiClient client = Config.defaultClient();
|
||||||
|
|
||||||
|
// Optional, put helpful during tests: disable client timeout and enable
|
||||||
|
// HTTP wire-level logs
|
||||||
|
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
|
||||||
|
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
|
||||||
|
OkHttpClient newClient = client.getHttpClient()
|
||||||
|
.newBuilder()
|
||||||
|
.addInterceptor(interceptor)
|
||||||
|
.readTimeout(0, TimeUnit.SECONDS)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
client.setHttpClient(newClient);
|
||||||
|
CoreV1Api api = new CoreV1Api(client);
|
||||||
|
|
||||||
|
// Create the watch object that monitors pod creation/deletion/update events
|
||||||
|
while (true) {
|
||||||
|
log.info("[I46] Creating watch...");
|
||||||
|
try (Watch<V1Pod> watch = Watch.createWatch(
|
||||||
|
client,
|
||||||
|
api.listPodForAllNamespacesCall(false, null, null, null, null, "false", null, null, 10, true, null),
|
||||||
|
new TypeToken<Response<V1Pod>>(){}.getType())) {
|
||||||
|
|
||||||
|
log.info("[I52] Receiving events:");
|
||||||
|
for (Response<V1Pod> event : watch) {
|
||||||
|
V1Pod pod = event.object;
|
||||||
|
V1ObjectMeta meta = pod.getMetadata();
|
||||||
|
switch (event.type) {
|
||||||
|
case "ADDED":
|
||||||
|
case "MODIFIED":
|
||||||
|
case "DELETED":
|
||||||
|
log.info("event.type: {}, namespace={}, name={}",
|
||||||
|
event.type,
|
||||||
|
meta.getNamespace(),
|
||||||
|
meta.getName());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log.warn("[W66] Unknown event type: {}", event.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (ApiException ex) {
|
||||||
|
log.error("[E70] ApiError", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,87 @@
|
|||||||
|
package com.baeldung.kubernetes.intro;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
import io.kubernetes.client.openapi.ApiClient;
|
||||||
|
import io.kubernetes.client.openapi.ApiException;
|
||||||
|
import io.kubernetes.client.openapi.apis.CoreV1Api;
|
||||||
|
import io.kubernetes.client.openapi.models.V1ObjectMeta;
|
||||||
|
import io.kubernetes.client.openapi.models.V1Pod;
|
||||||
|
import io.kubernetes.client.openapi.models.V1PodList;
|
||||||
|
import io.kubernetes.client.util.Config;
|
||||||
|
import io.kubernetes.client.util.Watch;
|
||||||
|
import io.kubernetes.client.util.Watch.Response;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.logging.HttpLoggingInterceptor;
|
||||||
|
|
||||||
|
public class WatchPodsUsingBookmarks {
|
||||||
|
|
||||||
|
private static Logger log = LoggerFactory.getLogger(WatchPodsUsingBookmarks.class);
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
|
ApiClient client = Config.defaultClient();
|
||||||
|
|
||||||
|
// Optional, put helpful during tests: disable client timeout and enable
|
||||||
|
// HTTP wire-level logs
|
||||||
|
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
|
||||||
|
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
|
||||||
|
OkHttpClient newClient = client.getHttpClient()
|
||||||
|
.newBuilder()
|
||||||
|
.addInterceptor(interceptor)
|
||||||
|
.readTimeout(0, TimeUnit.SECONDS)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
client.setHttpClient(newClient);
|
||||||
|
CoreV1Api api = new CoreV1Api(client);
|
||||||
|
|
||||||
|
String resourceVersion = null;
|
||||||
|
while (true) {
|
||||||
|
// Get a fresh list only we need to resync
|
||||||
|
if ( resourceVersion == null ) {
|
||||||
|
log.info("[I48] Creating initial POD list...");
|
||||||
|
V1PodList podList = api.listPodForAllNamespaces(true, null, null, null, null, "false", resourceVersion, null, null, null);
|
||||||
|
resourceVersion = podList.getMetadata().getResourceVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
log.info("[I54] Creating watch: resourceVersion={}", resourceVersion);
|
||||||
|
try (Watch<V1Pod> watch = Watch.createWatch(
|
||||||
|
client,
|
||||||
|
api.listPodForAllNamespacesCall(true, null, null, null, null, "false", resourceVersion, null, 10, true, null),
|
||||||
|
new TypeToken<Response<V1Pod>>(){}.getType())) {
|
||||||
|
|
||||||
|
log.info("[I60] Receiving events:");
|
||||||
|
for (Response<V1Pod> event : watch) {
|
||||||
|
V1Pod pod = event.object;
|
||||||
|
V1ObjectMeta meta = pod.getMetadata();
|
||||||
|
switch (event.type) {
|
||||||
|
case "BOOKMARK":
|
||||||
|
resourceVersion = meta.getResourceVersion();
|
||||||
|
log.info("[I67] event.type: {}, resourceVersion={}", event.type,resourceVersion);
|
||||||
|
break;
|
||||||
|
case "ADDED":
|
||||||
|
case "MODIFIED":
|
||||||
|
case "DELETED":
|
||||||
|
log.info("event.type: {}, namespace={}, name={}",
|
||||||
|
event.type,
|
||||||
|
meta.getNamespace(),
|
||||||
|
meta.getName());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log.warn("[W76] Unknown event type: {}", event.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (ApiException ex) {
|
||||||
|
log.error("[E80] ApiError", ex);
|
||||||
|
resourceVersion = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
package com.baeldung.kubernetes.intro;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
|
||||||
|
import io.kubernetes.client.openapi.ApiClient;
|
||||||
|
import io.kubernetes.client.openapi.ApiException;
|
||||||
|
import io.kubernetes.client.openapi.apis.CoreV1Api;
|
||||||
|
import io.kubernetes.client.openapi.models.V1ObjectMeta;
|
||||||
|
import io.kubernetes.client.openapi.models.V1Pod;
|
||||||
|
import io.kubernetes.client.openapi.models.V1PodList;
|
||||||
|
import io.kubernetes.client.util.Config;
|
||||||
|
import io.kubernetes.client.util.Watch;
|
||||||
|
import io.kubernetes.client.util.Watch.Response;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.logging.HttpLoggingInterceptor;
|
||||||
|
|
||||||
|
public class WatchPodsUsingResourceVersions {
|
||||||
|
|
||||||
|
private static Logger log = LoggerFactory.getLogger(WatchPodsUsingResourceVersions.class);
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
|
ApiClient client = Config.defaultClient();
|
||||||
|
|
||||||
|
// Optional, put helpful during tests: disable client timeout and enable
|
||||||
|
// HTTP wire-level logs
|
||||||
|
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
|
||||||
|
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
|
||||||
|
OkHttpClient newClient = client.getHttpClient()
|
||||||
|
.newBuilder()
|
||||||
|
.addInterceptor(interceptor)
|
||||||
|
.readTimeout(0, TimeUnit.SECONDS)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
client.setHttpClient(newClient);
|
||||||
|
CoreV1Api api = new CoreV1Api(client);
|
||||||
|
|
||||||
|
String resourceVersion = null;
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
if ( resourceVersion == null ) {
|
||||||
|
V1PodList podList = api.listPodForAllNamespaces(null, null, null, null, null, null, resourceVersion, null, null, null);
|
||||||
|
resourceVersion = podList.getMetadata().getResourceVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("[I59] Creating watch: resourceVersion={}", resourceVersion);
|
||||||
|
try (Watch<V1Pod> watch = Watch.createWatch(
|
||||||
|
client,
|
||||||
|
api.listPodForAllNamespacesCall(null, null, null, null, null, null, resourceVersion, null, 60, true, null),
|
||||||
|
new TypeToken<Response<V1Pod>>(){}.getType())) {
|
||||||
|
|
||||||
|
log.info("[I65] Receiving events:");
|
||||||
|
for (Response<V1Pod> event : watch) {
|
||||||
|
V1Pod pod = event.object;
|
||||||
|
V1ObjectMeta meta = pod.getMetadata();
|
||||||
|
switch (event.type) {
|
||||||
|
case "ADDED":
|
||||||
|
case "MODIFIED":
|
||||||
|
case "DELETED":
|
||||||
|
log.info("event: type={}, namespace={}, name={}",
|
||||||
|
event.type,
|
||||||
|
meta.getNamespace(),
|
||||||
|
meta.getName());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log.warn("[W76] Unknown event type: {}", event.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (ApiException ex) {
|
||||||
|
if ( ex.getCode() == 504 || ex.getCode() == 410 ) {
|
||||||
|
resourceVersion = extractResourceVersionFromException(ex);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Reset resource version
|
||||||
|
resourceVersion = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String extractResourceVersionFromException(ApiException ex) {
|
||||||
|
|
||||||
|
String body = ex.getResponseBody();
|
||||||
|
if (body == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Gson gson = new Gson();
|
||||||
|
Map<?,?> st = gson.fromJson(body, Map.class);
|
||||||
|
Pattern p = Pattern.compile("Timeout: Too large resource version: (\\d+), current: (\\d+)");
|
||||||
|
String msg = (String)st.get("message");
|
||||||
|
Matcher m = p.matcher(msg);
|
||||||
|
if (!m.matches()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m.group(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.baeldung.kubernetes.intro;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class WatchPodsLiveTest {
|
||||||
|
@Test
|
||||||
|
void whenWatchPods_thenSuccess() throws Exception {
|
||||||
|
WatchPods.main(new String[] {});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.baeldung.kubernetes.intro;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class WatchPodsUsingBookmarksLiveTest {
|
||||||
|
@Test
|
||||||
|
void whenWatchPods_thenSuccess() throws Exception {
|
||||||
|
WatchPodsUsingBookmarks.main(new String[] {});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.baeldung.kubernetes.intro;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class WatchPodsUsingResourceVersionsLiveTest {
|
||||||
|
@Test
|
||||||
|
void whenWatchPods_thenSuccess() throws Exception {
|
||||||
|
WatchPodsUsingResourceVersions.main(new String[] {});
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user