Überwachen Sie den internen Status von Java-Programmen mit Kubernetes

Einführung

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). ..

Java-Implementierung

Überwachte Klasse

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;
  }
}

Endpunkt überwachen

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);
  }
}

Hauptklasse

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);
    }
  }
}

Testen Sie die Endpunkte mit Curl

Unmittelbar nach dem Erstellen einer SomeClass-Instanz

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

10 Sekunden später

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

Bereitstellung in Kubernetes

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.

Zusammenfassung

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.

Recommended Posts

Überwachen Sie den internen Status von Java-Programmen mit Kubernetes
Berechnen Sie die Ähnlichkeitsbewertung von Zeichenketten mit JAVA
CI die Architektur von Java / Kotlin-Anwendungen mit ArchUnit
Den aktuellen Status von Java organisieren und die Zukunft betrachten
Überprüfen Sie das Verhalten von Java Intrinsic Locks mit bpftrace
Eine Übersicht über das native Java-Framework Quarkus von Kubernetes
Die Geschichte von dto, dao-like mit Java, SQLite
Ersetzen Sie nur einen Teil des URL-Hosts durch Java
[Java] Vereinfachen Sie die Implementierung der Datenverlaufsverwaltung mit Reladomo
Erläutern Sie die Vorzüge des staatlichen Musters anhand des Bewertungsurteils des Films
Stellen Sie sicher, dass Sie das Java compareTo-Ergebnis mit 0 vergleichen
[Java] Löschen Sie die Elemente von List
[Java1.8 +] Mit LocalDate das Datum des nächsten × Tages abrufen
[Java Edition] Geschichte der Serialisierung
Folgen Sie dem Link mit Selen (Java)
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Der Suchtpunkt bei der Durchführung der Basisauthentifizierung mit Java URLConnection
Überschreiben Sie den gleichnamigen Upload mit dem BOX SDK (Java).
Ist die von Ihnen verwendete Version von Elasticsearch mit Java 11 kompatibel?
Der Ursprung von Java-Lambda-Ausdrücken
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
Lassen Sie uns das Ergebnis der Analyse von Java-Bytecode in einem Klassendiagramm ausdrücken
Beachten Sie den internen Zustand (Unveränderlichkeit) von Objekten und die Nebenwirkungen von Methoden
Überprüfen Sie den MX-Eintrag der E-Mail-Adresse mit Java und die Domain
[Java] Holen Sie sich MimeType aus dem Inhalt der Datei mit Apathce Tika [Kotlin]
Überwachen Sie Java-Anwendungen mit Jolokia und Hawtio
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Überprüfen Sie den Inhalt der Parameter mit pry
Untersuchen Sie die Speichernutzung von Java-Elementen
[Java] Ermittelt den Tag eines bestimmten Tages
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Vergleichen Sie Elemente eines Arrays (Java)
Ich habe die interne Verarbeitung von Retrofit untersucht
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Was sind die aktualisierten Funktionen von Java 13
Messen Sie einfach die Größe von Java-Objekten
Rückblick auf die Grundlagen von Java
Ausgabe des Buches "Einführung in Java"
Über die Behandlung von BigDecimal (mit Reflexion)
Die Geschichte des Schreibens von Java in Emacs
[Java] Machen Sie das Programm mit parallelStream 10x schneller
Formatieren Sie den Inhalt von LocalDate mit DateTimeFormatter
[Java] Überprüfen Sie die Anzahl der Zeichen
[Java] [Spring] Testen Sie das Verhalten des Loggers
Versuchen Sie es mit der Wii-Fernbedienung in Java
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Überwachen Sie einfach das Raumklima. ⑪ Erhalten Sie die Beleuchtungsstärke mit Java von BH1750FVI (Ersatz) - (I2C / Pi4J) -
Inkrementiert durch das dritte Argument der iterierten Methode der aus Java9 hinzugefügten Stream-Klasse
Einfache Überwachung der Innenumgebung - ② Erfassen Sie das Bluetooth LE-Werbesignal mit Java (Bluetooth LE / bluez-dbus) -
Durchbrechen Sie gewaltsam das C-Problem "* 3 oder / 2" von [AtCoder Problem-ABC100] mit Java [Code]
Überprüfen Sie das ID-Token eines von AWS Cognito in Java authentifizierten Benutzers
Die Geschichte des einfachen String-Vergleichs in Java
JAVA: jar, aar, zeige den Inhalt der Datei an
Rückrechnung des Übergangs von Randoms internem Seed
Die Geschichte eines gewöhnlichen Othello in Java
Überprüfen Sie den Inhalt des Argumentobjekts mit Mockito
Informationen zur Beschreibungsreihenfolge der Java-Systemeigenschaften
[LeJOS] Lassen Sie uns den EV3-Motor mit Java steuern
Über die Idee anonymer Klassen in Java
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt