Dieser Artikel erinnert daran, wie Kubernetes in regelmäßigen Abständen den Status einer bestimmten Java-Klasse überprüft und den Pod bei Problemen beendet. Weitere Informationen zu Kubernetes Liveness Probe finden Sie hier (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-tcp-liveness-probe). ..
Implementieren Sie es zu Testzwecken so, dass es 10 Sekunden nach dem Erstellen der Instanz zu "isAlive () == false" wird.
SomeResource.java
public class SomeResource {
final long createdTime;
public SomeResource() {
this.createdTime = System.currentTimeMillis();
}
public boolean isAlive() {
return System.currentTimeMillis() - createdTime < 10000;
}
}
Implementieren Sie diese Option, um den Antwortcode "200" bei "SomeResource # isAlive () == true" und "500" bei "false" zurückzugeben.
HeartBeat.java
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
public class HeartBeat {
private final SomeResource target;
private HttpServer httpServer;
private final int port;
public HeartBeat(SomeResource target, int port) {
this.target = target;
this.port = port;
}
void start() throws IOException {
httpServer =
HttpServer.create(new InetSocketAddress(port), 0);
httpServer.createContext("/heartbeat", httpExchange -> {
int responseCode;
if (target.isAlive()) {
responseCode = 200;
} else {
responseCode = 500;
}
byte[] responseBody = String.valueOf(target.isAlive()).getBytes(StandardCharsets.UTF_8);
httpExchange.getResponseHeaders().add("Content-Type", "text/plain; charset=UTF-8");
httpExchange.sendResponseHeaders(responseCode, responseBody.length);
httpExchange.getResponseBody().write(responseBody);
httpExchange.close();
});
httpServer.start();
}
void stop() {
httpServer.stop(0);
}
}
Main.java
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(1);
SomeResource resource = new SomeResource();
HeartBeat heartbeat = new HeartBeat(resource, 1234);//Verwenden Sie Port 1234
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
heartbeat.stop();
latch.countDown();
}
});
try {
heartbeat.start();
latch.await();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
}
console
$ curl --dump-header - http://localhost:1234/heartbeat
HTTP/1.1 200 OK
Date: Tue, 02 Jul 2019 07:24:20 GMT
Content-type: text/plain; charset=UTF-8
Content-length: 4
true
console
$ curl --dump-header - http://localhost:1234/heartbeat
HTTP/1.1 500 Internal Server Error
Date: Tue, 02 Jul 2019 07:24:30 GMT
Content-type: text/plain; charset=UTF-8
Content-length: 5
false
Die Schritte zum Erstellen eines Containers und zum Verschieben in die Registrierung werden weggelassen.
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-resource-watch-test
spec:
replicas: 1
selector:
matchLabels:
app: java-resource-watch-test
template:
metadata:
labels:
app: java-resource-watch-test
spec:
containers:
- name: java-resource-watch-test
image: some_registry/test:latest
livenessProbe:
httpGet:
path: /heartbeat
port: 8080
httpHeaders:
- name: Custom-Header
value: HealthCheck
initialDelaySeconds: 1
periodSeconds: 1
kubectl apply -f ./deployment.yaml
Sie können sehen, dass der Pod beendet und neu gestartet wird, sobald SomeResource abläuft.
Ich konnte den Pod je nach Status der Klasse und des Threads neu starten. Es gibt verschiedene andere Methoden, wie zum Beispiel ein Seitenwagenmodell mit JMX, aber ich denke, die in diesem Abschnitt vorgestellte Methode ist einfach und flexibel.