Essayez d'exécuter Kubernetes Job à partir de Java

Aperçu

En fait, une bibliothèque d'encapsulation Java qui appelle l'API Kubernetes est officiellement préparée et vous pouvez utiliser Kubernetes relativement facilement à partir d'une application Java.

Cette fois, créons une API REST qui démarre Job avec Spring Boot.

environnement

Spécifications de cette application

  1. Exécutez l'exemple de Job qui calcule le pi dans Official Documents
  2. La définition du travail est lue à partir du fichier YAML --client-java suppose JSON (GSON), donc YAML-> JSON conversion et liaison
  3. Ajoutez une date pour que le nom du Job soit unique
  4. L'authentification utilise le compte de service kubernetes config

la mise en oeuvre

Créer un projet

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 -

Ajouter une dépendance à build.gradle

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

Configurer le manifeste du travail

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

Définition du haricot

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

Contrôle de fonctionnement

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

Recommended Posts

Essayez d'exécuter Kubernetes Job à partir de Java
Exécuter le fichier de commandes à partir de Java
Essayez d'exécuter Selenuim 3.141.59 avec eclipse (java)
Essayez d'exécuter Spring Boot sur Kubernetes
Essayez d'exécuter AWS X-Ray en Java
Créons une application de calcul avec Java
Essayez d'appeler Nim depuis Java via JNI
Si une personne de Java apprend PHP
GetInstance () à partir d'une classe @Singleton dans Groovy à partir de Java
Pour devenir programmeur VB.net depuis une boutique Java
Essayez Java 8 Stream
Essayez de créer un babillard en Java
Essayez d'appeler le service CORBA depuis Spring (Java)
J'ai essayé de frapper une méthode Java d'ABCL
Les débutants en programmation apprennent PHP à partir d'une perspective Java-variables-
Créer Scala Seq à partir de Java, faire de Scala Seq une liste Java
Essayez d'accéder à l'ensemble de données depuis Java en utilisant JZOS
[Java] Récupère des valeurs de manière aléatoire dans un tableau
Essayez grossièrement Java 9
Essayez de déboguer un programme Java avec VS Code
J'ai essayé d'exécuter Java dans un terminal Mac
Connexion SSH à l'aide de SSHJ à partir de l'application Java 6
Essayez d'appeler des méthodes synchronisées à partir de plusieurs threads en Java
Soumettre une tâche à AWS Batch avec Java (Eclipse)
Comment passer d'Eclipse Java à un fichier SQL
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
Essayez Easy Ramdom, un outil de test PropertyBase pour Java
Appelons IBM Watson Assistant 2018-07-10 à partir du SDK Java.
Utilisation de la base de données (SQL Server 2014) à partir d'un programme Java 04/01/2018
[Note] Créez un environnement Java à partir de zéro avec docker
[Java] Comment effacer un caractère spécifique d'une chaîne de caractères
J'ai créé un Wrapper qui appelle KNP depuis Java
Essayez de résoudre un problème FizzBuzz restreint en Java
Appeler un programme écrit en Swift depuis Processing (Java)
Créez une application JAVA WEB et essayez OMC APM
Essayez de créer un environnement de développement Java à l'aide de Docker
Essayez de créer Java dans un module natif avec GraalVM
Une vue d'ensemble du framework Java natif de Kubernetes Quarkus
Appeler Java depuis JRuby
java construire un triangle
Accédez à API.AI depuis Java
De Java à Ruby !!
Essayez d'envoyer une notification.
Essayez la valeur de retour Java
Résoudre l'erreur CreateProcess = 206 lors de l'exécution de Java dans un environnement Windows
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Exécuter R à partir d'un processus Java optimisé par Tomcat sur Amazon Linux
Comment stocker des chaînes de ArrayList à String en Java (personnel)
Obtenez facilement des entiers à partir des propriétés système en Java
Essayez Hello World en utilisant Java brut sur le conteneur Docker
Jetez un œil à Kotlin dans une perspective Java efficace
Obtenir une collection non vide à partir d'un flux facultatif avec java