OpenShift Pods mittels Java starten

25.04.2019

Um in der OpenShift dynamisch neue Kubernetes Objekte zu erzeugen, kann der Java Client für Kubernetes und OpenShift 3 von fabric8.io verwendet werden. Dieser Client nutzt die REST API der Kubernetes/OpenShift Plattform, um verschiedene Aktionen auszuführen.

Wir verwenden den Kubernetes Client beispielsweise, um in der OpenShift neue Pods zu starten und nach der Berechnung diese wieder zu beenden. Wir haben uns ganz bewusst für den Kubernetes und nicht für den OpenShift Client entschieden. So sind wir plattformunabhängig und können auf andere Kubernetes Plattformen wechseln, ohne unsere Implementierung ändern zu müssen (Open-Closed Prinzip).

Beispiel

Zu Beginn erstellen wir einen Kubernetes Client. Dafür wird die Kubernetes URL der Plattform benötigt:

final Config config = new ConfigBuilder().withMasterUrl(kubernetesUrl).build();
KubernetesClient client = new DefaultKubernetesClient(config);

Mit dem Client starten wir jetzt einen neuen Pod:

final Container container = new ContainerBuilder()
    .withName(containerName)
    .withImage(imageName)
    .withImagePullPolicy("Always")
    .withNewResources()
    .withRequests(requestResourcesMap)
    .withLimits(limitResourcesMap)
    .endResources()
    .build();

final Pod pod = new PodBuilder().withNewMetadata()
    .withName(containerName)
    .withLabels(labels)
    .endMetadata()
    .withNewSpec()
    .withContainers(container)
    .endSpec()
    .build();
        
client.inNamespace(targetNamespace).pods().create(pod);

Damit auf den soeben erstellten Pod zugegriffen werden kann, legen wir jetzt noch ein Service an:

final Service service = new ServiceBuilder()
	.withNewMetadata()
	.withName(serviceName)
	.endMetadata()
	.withNewSpec()
	.addToPorts(0, new ServicePortBuilder()
		.withName(servicePortName)
		.withPort(servicePort)
		.withProtocol(serviceProtocol)
		.withNewTargetPort(serviceTargetPort)
		.build())
	.addToSelector(POD_LABEL, label)
	.withType(serviceType)
	.withSessionAffinity(serviceSessionAffinity)
	.endSpec()
	.build();

client.inNamespace(targetNamespace).services().create(service);

Wenn der Pod nicht mehr benötigt wird, wird zuerst der Service wieder gelöscht:

client.inNamespace(targetNamespace).services().withName(serviceName).delete();

Und danach den Pod:

client.inNamespace(targetNamespace).pods().withName(podName).delete();

Fazit

Der Client ist sehr mächtig. Er bietet die Möglichkeit eine Kubernetes Plattform dynamisch mittels Java zu orchestrieren. Wenn man sich mit Kubernetes auskennt, wird man keine Probleme bei der Anwendung des Java Clients haben.

Versucht es doch einfach selber.

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*