Versuchen Sie, Kubernetes Job von Java aus auszuführen

Überblick

Tatsächlich wird eine Java-Wrapper-Bibliothek, die die Kubernetes-API aufruft, offiziell vorbereitet, und Sie können Kubernetes relativ einfach von einer Java-Anwendung aus bedienen.

Erstellen wir dieses Mal eine REST-API, die Job mit Spring Boot startet.

Umgebung

Spezifikationen dieser App

  1. Führen Sie das Job-Beispiel aus, das den Pi in [Offizielle Dokumente] berechnet (https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/).
  2. Die Jobdefinition wird aus der YAML-Datei gelesen --client-java setzt JSON (GSON) voraus, also YAML-> JSON-Konvertierung und -Bindung
  3. Fügen Sie ein Datum hinzu, damit der Jobname eindeutig ist
  4. Die Authentifizierung verwendet das Dienstkonto kubernetes config

Implementierung

Ein Projekt erstellen

curl -s https://start.spring.io/starter.tgz \
    -d baseDir=k8s-job-sample \
    -d type=gradle-project \
    -d javaVersion=1.8 \
    -d dependencies=web,lombok | tar -xzvf -

Fügen Sie build.gradle eine Abhängigkeit hinzu

compile('io.kubernetes:client-java:1.0.0-beta2')

Jobmanifest einrichten

src/main/resources/job.yaml


apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(100)"]
      restartPolicy: Never
  backoffLimit: 4

Bohnendefinition

DemoApplication.java


package com.example.demo;

import com.google.gson.Gson;
import io.kubernetes.client.ApiClient;
import io.kubernetes.client.apis.BatchV1Api;
import io.kubernetes.client.util.Config;
import java.io.IOException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.SafeConstructor;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public Gson gson() {
        return new Gson();
    }

    @Bean
    public Yaml yaml() {
        return new Yaml(new SafeConstructor());
    }

    @Bean
    public ApiClient apiClient() throws IOException {
        return Config.fromConfig("/path/to/k8s-config.yaml");
    }

    @Bean
    public BatchV1Api batchV1Api(ApiClient apiClient) {
        return new BatchV1Api(apiClient);
    }

}

Controller

JobController.java


package com.example.demo;

import com.google.gson.Gson;
import io.kubernetes.client.ApiException;
import io.kubernetes.client.apis.BatchV1Api;
import io.kubernetes.client.models.V1Job;
import io.kubernetes.client.models.V1ObjectMeta;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.yaml.snakeyaml.Yaml;

@RestController
@RequestMapping("jobs")
@RequiredArgsConstructor
public class JobController {
    private final BatchV1Api batchApi;
    private final ResourceLoader resourceLoader;
    private final Gson gson;
    private final Yaml yaml;
    private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

    @PostMapping
    public V1Job executeJob(@RequestParam(required = false, defaultValue = "default") String nameSpace)
            throws IOException, ApiException {

        V1Job job = loadJobFromYaml("job.yaml");

        V1ObjectMeta metaData = job.getMetadata();
        metaData.setName(String.format("%s-%s", metaData.getName(), dateTimeFormatter.format(LocalDateTime.now())));

        return batchApi.createNamespacedJob(nameSpace, job, null);
    }

    private V1Job loadJobFromYaml(String fileName) throws IOException {
        Map jobManifest = (Map) yaml.load(
                resourceLoader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + fileName).getInputStream());

        return gson.fromJson(gson.toJson(jobManifest), V1Job.class);
    }
}

Funktionsprüfung

$ curl -X POST http://localhost:8080/jobs?nameSpace=develop

Recommended Posts

Versuchen Sie, Kubernetes Job von Java aus auszuführen
Führen Sie eine Batchdatei von Java aus
Versuchen Sie, Selenuim 3.141.59 mit Eclipse (Java) auszuführen.
Versuchen Sie, Spring Boot auf Kubernetes auszuführen
Versuchen Sie, AWS X-Ray in Java auszuführen
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Versuchen Sie, Nim von Java über JNI aufzurufen
Wenn eine Person aus Java PHP lernt
GetInstance () aus einer @ Singleton-Klasse in Groovy aus Java
Um ein VB.net-Programmierer aus einem Java-Shop zu werden
Probieren Sie Java 8 Stream aus
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Versuchen Sie, den CORBA-Dienst von Spring (Java) aus aufzurufen.
Ich habe versucht, eine Java-Methode von ABCL zu verwenden
Programmieranfänger lernen PHP aus einer Java-Perspektive.
Erstellen Sie Scala Seq aus Java, machen Sie Scala Seq zu einer Java-Liste
Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen
[Java] Ruft Werte zufällig aus einem Array ab
Versuchen Sie es mit Java 9
Versuchen Sie, ein Java-Programm mit VS-Code zu debuggen
Ich habe versucht, Java in einem Mac-Terminal auszuführen
SSH-Verbindung mit SSHJ aus der Java6-App
Versuchen Sie, synchronisierte Methoden aus mehreren Threads in Java aufzurufen
Senden Sie einen Job an AWS Batch mit Java (Eclipse)
So springen Sie von Eclipse Java zu einer SQL-Datei
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
Probieren Sie Easy Ramdom, ein PropertyBase-Testtool für Java
Rufen wir IBM Watson Assistant 2018-07-10 aus dem Java SDK auf.
Verwenden der Datenbank (SQL Server 2014) aus einem Java-Programm 2018/01/04
[Hinweis] Erstellen Sie mit Docker eine Java-Umgebung von Grund auf neu
[Java] So löschen Sie ein bestimmtes Zeichen aus einer Zeichenfolge
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Versuchen Sie, ein eingeschränktes FizzBuzz-Problem in Java zu lösen
Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.
Erstellen Sie eine JAVA WEB App und probieren Sie OMC APM aus
Versuchen Sie, mit Docker eine Java-Entwicklungsumgebung zu erstellen
Versuchen Sie, Java mit GraalVM in ein natives Modul zu integrieren
Eine Übersicht über das native Java-Framework Quarkus von Kubernetes
Rufen Sie Java von JRuby aus auf
Java baut ein Dreieck
Greifen Sie über Java auf API.AI zu
Von Java zu Ruby !!
Versuchen Sie, eine Benachrichtigung zu senden.
Versuchen Sie es mit dem Java-Rückgabewert
Beheben Sie den CreateProcess-Fehler = 206, wenn Sie Java in einer Windows-Umgebung ausführen
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
Führen Sie R von einem Tomcat-basierten Java-Prozess unter Amazon Linux aus
Speichern von Zeichenfolgen von ArrayList zu Zeichenfolge in Java (Personal)
Holen Sie sich ganz einfach Ganzzahlen aus den Systemeigenschaften in Java
Versuchen Sie Hello World mit einfachem Java im Docker-Container
Schauen Sie sich Kotlin aus einer effektiven Java-Perspektive an
Holen Sie sich mit Java eine nicht leere Sammlung aus einem optionalen Stream