Client Delphi per l'API Kubernetes da OpenAPI

Ogni cluster Kubernetes pubblica la propria API in formato OpenAPI — la stessa descrizione consumata da kubectl e da ogni client ufficiale. Punta sgcOpenAPI alla specifica ed emetti una unit Delphi tipizzata che consente a un'applicazione Pascal di elencare i pod, fare lo scale dei deployment, osservare gli eventi e applicare i manifest sopra la normale API HTTPS.

Kubernetes + sgcOpenAPI

L'API server di Kubernetes espone il proprio documento OpenAPI 2.0 su /openapi/v2 e un documento OpenAPI 3 su /openapi/v3. sgcOpenAPI accetta entrambi e li converte in un modello interno comune.

Specifica sorgente

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

Autenticazione

Bearer token / certificato client / kubeconfig

Unit generata

sgcOpenAPI_Kubernetes

Piattaforme

Windows, macOS, Linux, iOS, Android

Scarica la specifica dal cluster e genera

Ogni cluster serve la propria specifica, il che significa che il client generato è esattamente sincronizzato con le versioni dell'API, le CRD e le API aggregate installate su quel cluster. Rigenera contro un cluster diverso per supportare una versione diversa.

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;

Il generator emette una classe per ogni gruppo/versione API di Kubernetes — TsgcK8s_CoreV1, TsgcK8s_AppsV1, TsgcK8s_BatchV1, TsgcK8s_NetworkingV1, TsgcK8s_StorageV1, TsgcK8s_RbacV1 e così via — più una facade di livello superiore TsgcKubernetes.

Elenca i pod in un namespace

Tre righe una volta configurata l'autenticazione. Il risultato è un TsgcK8sPodList tipizzato i cui item espongono ogni container, condition e campo di status del riferimento API ufficiale.

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;

Fai lo scale di un deployment e osserva gli eventi

Fare lo scale di un Deployment è un PATCH sulla sotto-risorsa /scale. Osservare gli eventi è un GET HTTP/1.1 chunked di lunga durata che il client generato espone come un enumerable tipizzato.

// 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;

Cosa ti dà la unit generata

Poiché la specifica viene scaricata dal cluster, ogni gruppo API, versione e CRD installata in quel cluster finisce nella unit Delphi.

Workload

AppsV1 — Deployment, StatefulSet, DaemonSet, ReplicaSet. BatchV1 — Job, CronJob. CoreV1 — Pod, ReplicationController.

Service e networking

CoreV1 — Service, Endpoint, ConfigMap, Secret. NetworkingV1 — Ingress, IngressClass, NetworkPolicy. DiscoveryV1 — EndpointSlice.

Storage

StorageV1 — StorageClass, VolumeAttachment, CSIDriver, CSINode. CoreV1 — PersistentVolume, PersistentVolumeClaim.

RBAC e policy

RbacV1 — Role, RoleBinding, ClusterRole, ClusterRoleBinding. PolicyV1 — PodDisruptionBudget. AdmissionRegistrationV1 — ValidatingWebhookConfiguration.

Risorse personalizzate

Le CRD installate sul tuo cluster compaiono automaticamente. Argo Rollouts, Cert Manager Certificates, Istio VirtualServices — se l'operator ha registrato uno schema OpenAPI, sgcOpenAPI genera una classe tipizzata per esso.

Watch e stream dei log

Gli endpoint long-running (watch=true, log dei container follow=true) sono esposti come enumerable che restituiscono eventi tipizzati non appena il server li flusha.

Tre cose a cui fare attenzione

Certificati CA self-signed

La maggior parte dei cluster usa una CA di cluster self-signed. Fornisci il bundle CA da ~/.kube/config tramite CACertFile o disabilita del tutto la verifica con InsecureSkipTLSVerify := True — utile per i cluster di sviluppo, mai per la produzione.

Scadenza dei token ServiceAccount

I token ServiceAccount bounded (il default da Kubernetes 1.21) scadono dopo un'ora. Rinnova il token rileggendo /var/run/secrets/kubernetes.io/serviceaccount/token dall'interno del cluster, oppure chiamando l'API TokenRequest dall'esterno.

Server-Side Apply contro PATCH

I controller moderni preferiscono Server-Side Apply con Content-Type: application/apply-patch+yaml. Il generator emette entrambi gli helper — usa PatchNamespacedDeployment per i tradizionali strategic-merge patch e il metodo Apply esplicito per SSA.

Dal blog

Parser OpenAPI Delphi

Come il parser gestisce specifiche OpenAPI reali — incluse le API aggregate stile Kubernetes.

Leggi il post →

Client + parser OpenAPI

Post di accompagnamento che introduce sia il wrapper client sia i meccanismi interni del parser.

Leggi il post →

sgcOpenAPI 2026.6

Note dell'ultimo rilascio di sgcOpenAPI — nuove opzioni del generator e miglioramenti del parser.

Leggi il post →

Pilota oggi Kubernetes da Delphi

sgcOpenAPI include il parser, il code generator, il server OpenAPI e i bundle SDK di Amazon, Google, Microsoft e Azure — un prodotto, tre tier.