Surveillez l'état interne des programmes Java avec Kubernetes

introduction

Cet article rappelle comment Kubernetes vérifie le statut d'une classe Java particulière à intervalles réguliers et tue le pod en cas de problème. Pour plus d'informations sur Kubernetes Liveness Probe, veuillez consulter ici (https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-tcp-liveness-probe). ..

Implémentation Java

Classe surveillée

À des fins de test, implémentez ʻisAlive () == false` 10 secondes après la création de l'instance.

SomeResource.java


public class SomeResource {
  final long createdTime;

  public SomeResource() {
    this.createdTime = System.currentTimeMillis();
  }
  public boolean isAlive() {
    return System.currentTimeMillis() - createdTime < 10000;
  }
}

Surveillance du point de terminaison

Implémenter pour renvoyer le code de réponse «200» lorsque «SomeResource # isAlive () == true» et «500» lorsque «false».

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

Classe principale

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);//Utilisez le 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);
    }
  }
}

Tester les points de terminaison avec curl

Immédiatement après la création d'une instance SomeClass

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 secondes plus tard

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

Déployer sur Kubernetes

Les étapes pour créer un conteneur et pousser vers le registre sont omises.

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

Vous pouvez voir que le pod sera arrêté et redémarré dès que le SomeResource expirera.

Résumé

J'ai pu redémarrer le pod en fonction de l'état de la classe et du fil. Il existe diverses autres méthodes telles qu'un modèle de voiture latérale utilisant JMX, mais je pense que la méthode présentée dans cette section est simple et flexible.

Recommended Posts

Surveillez l'état interne des programmes Java avec Kubernetes
Calculer le score de similarité des chaînes de caractères avec JAVA
CI l'architecture des applications Java / Kotlin avec ArchUnit
Organiser l'état actuel de Java et envisager l'avenir
Vérifiez le comportement de Java Intrinsic Locks avec bpftrace
Une vue d'ensemble du framework Java natif de Kubernetes Quarkus
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
Remplacez seulement une partie de l'hôte URL par java
[Java] Simplifiez la mise en œuvre de la gestion de l'historique des données avec Reladomo
Expliquez les mérites du modèle d'État avec le jugement de notation du film
Assurez-vous de comparer le résultat Java compareTo avec 0
[Java] Supprimer les éléments de la liste
[Java1.8 +] Obtenez la date du jour × suivant avec LocalDate
[Édition Java] Histoire de la sérialisation
Suivez le lien avec Selenium (Java)
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Le point addictif lors de l'authentification de base avec Java URLConnection
Écraser le téléchargement du fichier avec le même nom avec BOX SDK (java)
La version d'Elasticsearch que vous utilisez est-elle compatible avec Java 11?
L'origine des expressions Java lambda
L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
Exprimons le résultat de l'analyse du code d'octet Java dans un diagramme de classes
Être conscient de l'état interne (immuabilité) des objets et des effets secondaires des méthodes
Vérifiez l'enregistrement MX de l'adresse e-mail avec java et vérifiez le domaine
[Java] Récupère MimeType à partir du contenu du fichier avec Apathce Tika [Kotlin]
Surveillez les applications Java avec jolokia et hawtio
Vérifiez le contenu du magasin de certificats Java
Vérifiez le contenu des paramètres avec le levier
Examiner l'utilisation de la mémoire des éléments Java
[Java] Obtenez le jour d'un jour spécifique
Mémo: [Java] Vérifiez le contenu du répertoire
Comparer les éléments d'un tableau (Java)
J'ai étudié le traitement interne de Retrofit
[jour: 5] J'ai résumé les bases de Java
Quelles sont les fonctionnalités mises à jour de Java 13
Mesurez facilement la taille des objets Java
Retour sur les bases de Java
Sortie du livre "Introduction à Java"
À propos du traitement de BigDecimal (avec réflexion)
L'histoire de l'écriture de Java dans Emacs
[Java] Rendez le programme 10 fois plus rapide avec parallelStream
Mettre en forme le contenu de LocalDate avec DateTimeFormatter
[Java] Vérifiez le nombre d'occurrences de caractères
[Java] [Spring] Tester le comportement de l'enregistreur
Essayez d'utiliser la télécommande Wii en Java
[Java] Obtenez la date avec la classe LocalDateTime
Surveillez facilement l'environnement intérieur-⑪ Obtenez l'éclairement avec Java à partir de BH1750FVI (substitut) - (I2C / Pi4J) -
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
Surveillez facilement l'environnement intérieur-② Capturez le signal publicitaire Bluetooth LE avec Java (Bluetooth LE / bluez-dbus) -
Briser de force le problème C "* 3 ou / 2" de [AtCoder Problem-ABC100] avec Java [Code]
Valider le jeton d'ID d'un utilisateur authentifié par AWS Cognito en Java
L'histoire de la comparaison de chaînes de bas niveau en Java
JAVA: jar, aar, affichez le contenu du fichier
Calcul à rebours de la transition de la graine interne de Random
L'histoire de la fabrication d'un Othello ordinaire à Java
Vérifiez le contenu de l'objet argument avec Mockito
A propos de l'ordre de description des propriétés système Java
[LeJOS] Contrôlons le moteur EV3 avec Java
À propos de l'idée des classes anonymes en Java
L'ordre des modificateurs de méthode Java est fixe