Kubernetes-API-Delphi-Client aus OpenAPI

Jeder Kubernetes-Cluster veröffentlicht seine API in OpenAPI-Form — dieselbe Beschreibung, die auch kubectl und jeder offizielle Sprach-Client verwenden. Zeige sgcOpenAPI auf die Spezifikation und erhalte eine typisierte Delphi-Unit, mit der eine Pascal-Anwendung Pods auflisten, Deployments skalieren, Events beobachten und Manifeste über die normale HTTPS-API anwenden kann.

Kubernetes + sgcOpenAPI

Der Kubernetes-API-Server stellt sein eigenes OpenAPI-2.0-Dokument unter /openapi/v2 bereit und ein OpenAPI-3-Dokument unter /openapi/v3. sgcOpenAPI akzeptiert beide und wandelt sie in ein gemeinsames internes Modell um.

Quell-Spezifikation

GET https://<cluster>/openapi/v3

Auth

Bearer-Token / Client-Zertifikat / Kubeconfig

Generierte Unit

sgcOpenAPI_Kubernetes

Plattformen

Windows, macOS, Linux, iOS, Android

Die Spezifikation aus dem Cluster laden und generieren

Jeder Cluster liefert seine eigene Spezifikation aus, was bedeutet, dass der generierte Client exakt synchron mit den API-Versionen, CRDs und Aggregated APIs ist, die auf diesem Cluster installiert sind. Generiere gegen einen anderen Cluster neu, um eine andere Version zu unterstützen.

uses
  sgcOpenAPI_Parser, sgcOpenAPI_Generator;

var
  vParser: TsgcOpenAPIParser;
  vGen: TsgcOpenAPIGenerator;
begin
  vParser := TsgcOpenAPIParser.Create(nil);
  try
    // Load directly from the cluster (mTLS or bearer)
    vParser.LoadFromURL('https://10.0.0.1:6443/openapi/v3',
      ['Authorization: Bearer ' + vToken]);

    Memo1.Lines.Add(Format('k8s spec: %d paths, %d schemas',
      [vParser.Paths.Count, vParser.Schemas.Count]));

    vGen := TsgcOpenAPIGenerator.Create(nil);
    try
      vGen.Parser := vParser;
      vGen.OutputUnit := 'sgcOpenAPI_Kubernetes';
      vGen.OutputFolder := 'C:\Generated\k8s';
      vGen.GroupBy := gbTag;
      vGen.Generate;
    finally
      vGen.Free;
    end;
  finally
    vParser.Free;
  end;
end;

Der Generator emittiert eine Klasse pro Kubernetes-API-Group/-Version — TsgcK8s_CoreV1, TsgcK8s_AppsV1, TsgcK8s_BatchV1, TsgcK8s_NetworkingV1, TsgcK8s_StorageV1, TsgcK8s_RbacV1 usw. — plus eine übergeordnete TsgcKubernetes-Fassade.

Pods in einem Namespace auflisten

Drei Zeilen, sobald die Authentifizierung steht. Das Ergebnis ist eine typisierte TsgcK8sPodList, deren Items jeden Container, jeden Condition- und jeden Status-Eintrag aus der offiziellen API-Referenz freigeben.

uses sgcOpenAPI_Kubernetes;

var
  vK8s: TsgcKubernetes;
  vPods: TsgcK8sPodList;
  vPod: TsgcK8sPod;
begin
  vK8s := TsgcKubernetes.Create(nil);
  try
    vK8s.Server := 'https://10.0.0.1:6443';
    vK8s.Token := vToken;
    vK8s.ClientCertFile := 'C:\kube\client.crt';
    vK8s.ClientKeyFile := 'C:\kube\client.key';
    vK8s.CACertFile := 'C:\kube\ca.crt';

    vPods := vK8s.CoreV1.ListNamespacedPod(
      Namespace := 'production',
      LabelSelector := 'app=api,tier=backend');
    try
      for vPod in vPods.Items do
        Memo1.Lines.Add(Format('%-30s  %s  node=%s',
          [vPod.Metadata.Name, vPod.Status.Phase, vPod.Spec.NodeName]));
    finally
      vPods.Free;
    end;
  finally
    vK8s.Free;
  end;
end;

Ein Deployment skalieren und Events beobachten

Eine Deployment zu skalieren ist ein PATCH gegen die Subressource /scale. Events zu beobachten ist ein langlebiger HTTP/1.1-Chunked-GET, den der generierte Client als typisierten Enumerable freigibt.

// Scale "api" Deployment in "production" to 5 replicas
var
  vScale: TsgcK8sScale;
begin
  vScale := vK8s.AppsV1.ReadNamespacedDeploymentScale(
    Name := 'api', Namespace := 'production');
  try
    vScale.Spec.Replicas := 5;
    vK8s.AppsV1.ReplaceNamespacedDeploymentScale(
      Name := 'api', Namespace := 'production',
      Body := vScale);
  finally
    vScale.Free;
  end;

  // Watch events on Pods in the same namespace
  for vEvent in vK8s.CoreV1.WatchNamespacedPodList(
    Namespace := 'production',
    ResourceVersion := vPods.Metadata.ResourceVersion,
    TimeoutSeconds := 600) do
  begin
    Memo1.Lines.Add(Format('[%s] %s — %s',
      [vEvent.EventType, vEvent.&Object.Metadata.Name,
       vEvent.&Object.Status.Phase]));
  end;
end;

Was die generierte Unit dir liefert

Weil die Spezifikation aus dem Cluster geladen wird, landen jede API-Group, jede Version und jedes CRD, das auf diesem Cluster installiert ist, in der Delphi-Unit.

Workloads

AppsV1 — Deployments, StatefulSets, DaemonSets, ReplicaSets. BatchV1 — Jobs, CronJobs. CoreV1 — Pods, ReplicationControllers.

Services & Networking

CoreV1 — Services, Endpoints, ConfigMaps, Secrets. NetworkingV1 — Ingress, IngressClass, NetworkPolicy. DiscoveryV1 — EndpointSlices.

Storage

StorageV1 — StorageClasses, VolumeAttachments, CSIDrivers, CSINodes. CoreV1 — PersistentVolumes, PersistentVolumeClaims.

RBAC & Policy

RbacV1 — Roles, RoleBindings, ClusterRoles, ClusterRoleBindings. PolicyV1 — PodDisruptionBudgets. AdmissionRegistrationV1 — ValidatingWebhookConfigurations.

Custom Resources

CRDs, die auf deinem Cluster installiert sind, tauchen automatisch auf. Argo Rollouts, Cert-Manager-Certificates, Istio-VirtualServices — wenn der Operator ein OpenAPI-Schema registriert hat, generiert sgcOpenAPI eine typisierte Klasse dafür.

Watch- + Log-Streams

Langlaufende Endpunkte (watch=true, Container-Log follow=true) werden als Enumerables freigegeben, die typisierte Events liefern, sobald der Server sie flusht.

Drei Dinge, auf die du achten solltest

Selbstsignierte CA-Zertifikate

Die meisten Cluster verwenden eine selbstsignierte Cluster-CA. Übergib das CA-Bundle aus ~/.kube/config über CACertFile oder deaktiviere die Prüfung vollständig mit InsecureSkipTLSVerify := True — praktisch für Entwicklungs-Cluster, aber niemals für die Produktion.

Ablauf von ServiceAccount-Tokens

Bound ServiceAccount Tokens (Standard seit Kubernetes 1.21) laufen nach einer Stunde ab. Frische den Token, indem du /var/run/secrets/kubernetes.io/serviceaccount/token im Cluster neu liest oder von außen die TokenRequest-API aufrufst.

Server-Side Apply versus PATCH

Moderne Controller bevorzugen Server-Side Apply mit Content-Type: application/apply-patch+yaml. Der Generator emittiert beide Helfer — verwende PatchNamespacedDeployment für klassische Strategic-Merge-Patches und die explizite Apply-Methode für SSA.

Aus dem Blog

OpenAPI-Delphi-Parser

Wie der Parser reale OpenAPI-Spezifikationen handhabt — einschließlich der Aggregated APIs im Kubernetes-Stil.

Beitrag lesen →

OpenAPI-Client + Parser

Begleitbeitrag, der sowohl den Client-Wrapper als auch die Parser-Internals einführt.

Beitrag lesen →

sgcOpenAPI 2026.6

Aktuelle Release Notes für sgcOpenAPI — neue Generator-Optionen und Parser-Verbesserungen.

Beitrag lesen →

Steuere Kubernetes noch heute aus Delphi

sgcOpenAPI liefert Parser, Codegenerator, OpenAPI-Server sowie die Amazon-, Google-, Microsoft- und Azure-SDK-Bundles mit — ein Produkt, drei Stufen.